From 1255beb992e5ab33932a4ecb6966a022be253803 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 13 Nov 2024 13:01:58 -0800 Subject: [PATCH 01/41] fix: use HEAD request rather than bytes=-N suffix requests Fixes https://github.com/google/neuroglancer/issues/651 --- src/kvstore/special/index.ts | 170 +++++++++++++++++------------------ 1 file changed, 84 insertions(+), 86 deletions(-) diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts index 22423b00e6..ac9ee232aa 100644 --- a/src/kvstore/special/index.ts +++ b/src/kvstore/special/index.ts @@ -23,7 +23,7 @@ import type { } from "#src/kvstore/index.js"; import { composeByteRangeRequest } from "#src/kvstore/index.js"; import { uncancelableToken } from "#src/util/cancellation.js"; -import { HttpError, isNotFoundError } from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; @@ -85,97 +85,95 @@ class SpecialProtocolKvStore implements ReadableKvStore { const { cancellationToken = uncancelableToken } = options; let { byteRange: byteRangeRequest } = options; const url = this.baseUrl + key; - for (let attempt = 0; ; ++attempt) { - try { - const requestInit: RequestInit = {}; - const rangeHeader = getRangeHeader(byteRangeRequest); - if (rangeHeader !== undefined) { - requestInit.headers = { range: rangeHeader }; - requestInit.cache = byteRangeCacheMode; + + try { + // The HTTP spec supports suffixLength requests directly via "Range: + // bytes=-N" requests, which avoids the need for a separate HEAD request. + // However, per + // https://fetch.spec.whatwg.org/#cors-safelisted-request-header a suffix + // length byte range request header will always trigger an OPTIONS preflight + // request, which would otherwise be avoided. This negates the benefit of + // using a suffixLength request directly. Additionally, some servers such as + // the npm http-server package and https://uk1s3.embassy.ebi.ac.uk/ do not + // correctly handle suffixLength requests or do not correctly handle CORS + // preflight requests. To avoid those issues, always just issue a separate + // HEAD request to determine the length. + let totalSize: number | undefined; + if ( + byteRangeRequest !== undefined && + "suffixLength" in byteRangeRequest + ) { + const totalSize = await this.getObjectLength(url, options); + byteRangeRequest = composeByteRangeRequest( + { offset: 0, length: totalSize }, + byteRangeRequest, + ).outer; + } + const requestInit: RequestInit = {}; + const rangeHeader = getRangeHeader(byteRangeRequest); + if (rangeHeader !== undefined) { + requestInit.headers = { range: rangeHeader }; + requestInit.cache = byteRangeCacheMode; + } + const { response, data } = await cancellableFetchSpecialOk( + this.credentialsProvider, + url, + requestInit, + async (response) => ({ + response, + data: await response.arrayBuffer(), + }), + cancellationToken, + ); + let byteRange: ByteRange | undefined; + if (response.status === 206) { + const contentRange = response.headers.get("content-range"); + if (contentRange === null) { + // Content-range should always be sent, but some buggy servers don't + // send it. + if (byteRangeRequest !== undefined) { + byteRange = { + offset: byteRangeRequest.offset, + length: data.byteLength, + }; + } else { + throw new Error( + "Unexpected HTTP 206 response when no byte range specified.", + ); + } } - const { response, data } = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - requestInit, - async (response) => ({ - response, - data: await response.arrayBuffer(), - }), - cancellationToken, - ); - let byteRange: ByteRange | undefined; - let totalSize: number | undefined; - if (response.status === 206) { - const contentRange = response.headers.get("content-range"); - if (contentRange === null) { - if (byteRangeRequest !== undefined) { - if ("suffixLength" in byteRangeRequest) { - const objectSize = await this.getObjectLength(url, options); - byteRange = { - offset: objectSize - byteRangeRequest.suffixLength, - length: Number(response.headers.get("content-length")), - }; - } else { - byteRange = { - offset: byteRangeRequest.offset, - length: data.byteLength, - }; - } - } else { - throw new Error( - "Unexpected HTTP 206 response when no byte range specified.", - ); - } + if (contentRange !== null) { + const m = contentRange.match(/bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/); + if (m === null) { + throw new Error( + `Invalid content-range header: ${JSON.stringify(contentRange)}`, + ); } - if (contentRange !== null) { - const m = contentRange.match( - /bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/, + const beginPos = parseInt(m[1], 10); + const endPos = parseInt(m[2], 10); + if (endPos !== beginPos + data.byteLength - 1) { + throw new Error( + `Length in content-range header ${JSON.stringify( + contentRange, + )} does not match content length ${data.byteLength}`, ); - if (m === null) { - throw new Error( - `Invalid content-range header: ${JSON.stringify(contentRange)}`, - ); - } - const beginPos = parseInt(m[1], 10); - const endPos = parseInt(m[2], 10); - if (endPos !== beginPos + data.byteLength - 1) { - throw new Error( - `Length in content-range header ${JSON.stringify( - contentRange, - )} does not match content length ${data.byteLength}`, - ); - } - totalSize = m[3] === "*" ? undefined : parseInt(m[3], 10); - byteRange = { offset: beginPos, length: data.byteLength }; } + if (m[3] !== "*") { + totalSize = parseInt(m[3], 10); + } + byteRange = { offset: beginPos, length: data.byteLength }; } - if (byteRange === undefined) { - byteRange = { offset: 0, length: data.byteLength }; - totalSize = data.byteLength; - } - return { data: new Uint8Array(data), dataRange: byteRange, totalSize }; - } catch (e) { - if ( - attempt === 0 && - e instanceof HttpError && - e.status === 416 && - options.byteRange !== undefined && - "suffixLength" in options.byteRange - ) { - // Some servers, such as the npm http-server package, do not support suffixLength - // byte-range requests. - const contentLengthNumber = await this.getObjectLength(url, options); - byteRangeRequest = composeByteRangeRequest( - { offset: 0, length: contentLengthNumber }, - byteRangeRequest, - ).outer; - continue; - } - if (isNotFoundError(e)) { - return undefined; - } - throw e; } + if (byteRange === undefined) { + byteRange = { offset: 0, length: data.byteLength }; + totalSize = data.byteLength; + } + return { data: new Uint8Array(data), dataRange: byteRange, totalSize }; + } catch (e) { + if (isNotFoundError(e)) { + return undefined; + } + throw e; } } } From 39272cdd398459bcbc03bf2f18affa9ebc2e340d Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 13 Nov 2024 21:57:45 -0800 Subject: [PATCH 02/41] fix(package.json): fix node.js version requirement Fixes https://github.com/google/neuroglancer/issues/643. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a9fe3a888..3ac3f3e7b1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "git+https://github.com/google/neuroglancer.git" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" }, "browserslist": [ "last 2 Chrome versions", From ff735edfda4d72e0f2650419bbf8655e409941b5 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 19 Nov 2024 12:11:10 -0800 Subject: [PATCH 03/41] chore: update package-lock.json to account for node.js version bump --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 86d4707d0d..a44c39f48d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "node_modules/@aashutoshrathi/word-wrap": { From 733539e077a9945e6247fea587b4235c1d93448a Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 20 Nov 2024 12:24:16 -0500 Subject: [PATCH 04/41] fix(layer): ensure layer references are unset when the associated layer is deleted (#669) removed disposed method on SharedDisjointUint64Sets to prevent potential "cannot read properties of undefined" errors as garbage collection benefit is likely insignificant --- src/layer/index.ts | 1 + src/shared_disjoint_sets.ts | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/layer/index.ts b/src/layer/index.ts index ff3f7d8d29..9a8e6d8dbe 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -955,6 +955,7 @@ export class LayerManager extends RefCounted { // Also notify the root LayerManager, to ensures the layer is removed if this is the last direct // reference. managedLayer.manager.rootLayers.layersChanged.dispatch(); + managedLayer.manager.rootLayers.specificationChanged.dispatch(); managedLayer.dispose(); } diff --git a/src/shared_disjoint_sets.ts b/src/shared_disjoint_sets.ts index 2f1d9b20dc..0f6b24a0f0 100644 --- a/src/shared_disjoint_sets.ts +++ b/src/shared_disjoint_sets.ts @@ -67,12 +67,6 @@ export class SharedDisjointUint64Sets return obj; } - disposed() { - this.disjointSets = undefined; - this.changed = undefined; - super.disposed(); - } - link(a: Uint64, b: Uint64) { if (this.disjointSets.link(a, b)) { const { rpc } = this; From 0d767d148750e83f002bc318d747e193ce07ec5c Mon Sep 17 00:00:00 2001 From: Josh Moore Date: Wed, 27 Nov 2024 20:15:41 +0100 Subject: [PATCH 05/41] ome.ts: update with ome-zarr 0.5 (#670) * ome.ts: update with dev2 version from the ngff challenge The current proposal for updating OME-Zarr to support Zarr v3 wraps the NGFF metadata in the Zarr metadata within an "ome" block. This checks for that block and if it exists unwraps the necessary metadata. This format is **not** finalized. see: https://forum.image.sc/t/ome2024-ngff-challenge/97363 * Check zarrVersion rather than ome's definition * Raise exception rather than check version * Also update frontend * Fix formatting * Fix format with prettier --------- Co-authored-by: Norman Rzepka --- src/datasource/zarr/frontend.ts | 6 +++++- src/datasource/zarr/ome.ts | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/datasource/zarr/frontend.ts b/src/datasource/zarr/frontend.ts index d27f478097..a56a4eeff7 100644 --- a/src/datasource/zarr/frontend.ts +++ b/src/datasource/zarr/frontend.ts @@ -501,7 +501,11 @@ export class ZarrDataSource extends DataSourceProvider { let multiscaleInfo: ZarrMultiscaleInfo; if (metadata.nodeType === "group") { // May be an OME-zarr multiscale dataset. - const multiscale = parseOmeMetadata(url, metadata.userAttributes); + const multiscale = parseOmeMetadata( + url, + metadata.userAttributes, + metadata.zarrVersion, + ); if (multiscale === undefined) { throw new Error("Neithre array nor OME multiscale metadata found"); } diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index 91a2455aed..ed1adf7979 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -39,7 +39,7 @@ export interface OmeMultiscaleMetadata { coordinateSpace: CoordinateSpace; } -const SUPPORTED_OME_MULTISCALE_VERSIONS = new Set(["0.4", "0.5-dev"]); +const SUPPORTED_OME_MULTISCALE_VERSIONS = new Set(["0.4", "0.5-dev", "0.5"]); const OME_UNITS = new Map([ ["angstrom", { unit: "m", scale: 1e-10 }], @@ -265,8 +265,11 @@ function parseOmeMultiscale( export function parseOmeMetadata( url: string, attrs: any, + zarrVersion: number, ): OmeMultiscaleMetadata | undefined { - const multiscales = attrs.multiscales; + const ome = attrs.ome; + const multiscales = ome == undefined ? attrs.multiscales : ome.multiscales; // >0.4 + if (!Array.isArray(multiscales)) return undefined; const errors: string[] = []; for (const multiscale of multiscales) { @@ -278,7 +281,9 @@ export function parseOmeMetadata( // Not valid OME multiscale spec. return undefined; } - const version = multiscale.version; + + const version = ome == undefined ? multiscale.version : ome.version; // >0.4 + if (version === undefined) return undefined; if (!SUPPORTED_OME_MULTISCALE_VERSIONS.has(version)) { errors.push( @@ -288,6 +293,14 @@ export function parseOmeMetadata( ); continue; } + if (version === "0.5" && zarrVersion !== 3) { + errors.push( + `OME multiscale metadata version ${JSON.stringify( + version, + )} is not supported for zarr v${zarrVersion}`, + ); + continue; + } return parseOmeMultiscale(url, multiscale); } if (errors.length !== 0) { From 52cbc2a9ae0da17b16fb57ef921df812bc5c69b9 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 27 Nov 2024 17:28:42 -0800 Subject: [PATCH 06/41] chore(jxl): fix reproducibility issues (#672) --- src/sliceview/jxl/.dockerignore | 1 + src/sliceview/jxl/Cargo.lock | 233 +++++++++++++++++++++++++++++ src/sliceview/jxl/Dockerfile | 2 +- src/sliceview/jxl/jxl_decoder.wasm | Bin 2184094 -> 2183240 bytes 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 src/sliceview/jxl/.dockerignore create mode 100644 src/sliceview/jxl/Cargo.lock diff --git a/src/sliceview/jxl/.dockerignore b/src/sliceview/jxl/.dockerignore new file mode 100644 index 0000000000..91224e5de8 --- /dev/null +++ b/src/sliceview/jxl/.dockerignore @@ -0,0 +1 @@ +**/* diff --git a/src/sliceview/jxl/Cargo.lock b/src/sliceview/jxl/Cargo.lock new file mode 100644 index 0000000000..da9ebff216 --- /dev/null +++ b/src/sliceview/jxl/Cargo.lock @@ -0,0 +1,233 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "jxl-bitstream" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5855ff16398ffbcf81fee52c41ca65326499c8764b21bb9952c367ace98995fb" +dependencies = [ + "tracing", +] + +[[package]] +name = "jxl-coding" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5b5093904e940bc11ef50e872c7bdf7b6e88653f012b925f8479daf212b5c9" +dependencies = [ + "jxl-bitstream", + "tracing", +] + +[[package]] +name = "jxl-color" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ec11695f2091e50531c970ad7eb4819989a20a2c89d68ae1b4f74f48454c10" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-frame" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4719f285ebfff5e64f352d0ef149a5244aef4f8e6b5aa666ba6241e90b50632f" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-image", + "jxl-modular", + "jxl-threadpool", + "jxl-vardct", + "tracing", +] + +[[package]] +name = "jxl-grid" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a28ba2734da33624db4b426b44750a7b1238e6cba65d27b7d84bf3cba7f507" +dependencies = [ + "tracing", +] + +[[package]] +name = "jxl-image" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3824c81613c05c19a9e4329d569145d3f460c0fcadb3965bd8418162d43f7f4" +dependencies = [ + "jxl-bitstream", + "jxl-color", + "jxl-grid", + "tracing", +] + +[[package]] +name = "jxl-modular" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e10bbc6041d9ea64bcfc6931ed89f0192954ac0a02bdbad624aa43b345e613" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71f3b9dbe4adefadac57b25a15bf7735202ba58c0e5500c6bfb2d63398bf21c2" +dependencies = [ + "jxl-bitstream", + "jxl-color", + "jxl-frame", + "jxl-grid", + "jxl-image", + "jxl-render", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-render" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259446ca029587f2b7850d223d57b4f69665dd8628e83bcb0a6c2ab964f1ef" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-color", + "jxl-frame", + "jxl-grid", + "jxl-image", + "jxl-modular", + "jxl-threadpool", + "jxl-vardct", + "tracing", +] + +[[package]] +name = "jxl-threadpool" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2860c68899a3c6266044fc26c6a0041e9f27145f58cc69b6eedc1b77f5ee13" +dependencies = [ + "rayon", + "rayon-core", + "tracing", +] + +[[package]] +name = "jxl-vardct" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15da4b49b832b3d8a67329f47e2a1732e0847667938bb9b4a37d99a4668775c2" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-modular", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-wasm" +version = "1.0.0" +dependencies = [ + "jxl-oxide", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] diff --git a/src/sliceview/jxl/Dockerfile b/src/sliceview/jxl/Dockerfile index d7adaf55da..9eec36fe24 100644 --- a/src/sliceview/jxl/Dockerfile +++ b/src/sliceview/jxl/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:slim-bullseye +FROM rust:slim-bullseye@sha256:46bad2a122975b3d3f7443e137015e0567bc4c63e467a818d9b92517def5f4d6 RUN rustup target add wasm32-unknown-unknown diff --git a/src/sliceview/jxl/jxl_decoder.wasm b/src/sliceview/jxl/jxl_decoder.wasm index d5c3b161c4bbd9d2986d8a022275e1fe2e7a4bdb..c1dedd52f5fdb830de94f0ea291ec90dca9844d8 100755 GIT binary patch delta 236550 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%0AdA5Fns z@gCRgyUroi~&_ClLpagE7iX$P)O~c`p zauR8GCDO%Kn8srI`ij~R6ovA=A$e9E@&~|F@~8_2tBr?KjYdCDPk9kdfIIE!EQ5By z=Gj%8nTD%Wa;@T-B-KsA)jPT5mkZs;l=Wjhar8why6;##EzMnVuNX&5>nrgtF~C(! z2i9}xaQQ!4x~WUuE~ji>kPclR$m1FKM=DG|%*6fwF(EJKLT7#+(H(%k7LfWg$#`Z_ zb%v45Ik>!o%!{*d2Tg0e=>ol`wWQ^2yyw{{8oJN|WzF(y|xmT;-Hp|E3rRi$dQ$>kQ2Gir3g>)_{kZrK!9Yq zKHT@jhTI*J`w$?ARB4lQW2AODJ>Mar&&xHEkq<&NMQI)Z#n>U{*aZ{VUF`BZ_a zXdG>W#*=*Qq7+nhL7>|4f3^taUV-5r23qQ6XalWH9lNWro{66o*?|dCbW$*>bteW-0UG$Pg90Cq<+YKA;P`!|&-7PDX_fNwtJ!(F6l0vCv z?Fq*`)R+XZ9&jLAjd?)qJ=hRdV+M$Ix0Tjnr6JY@?pmm6B_Yurtd%W7i$y@JrLDRa zs}8YdwwhY3Ch_v+O6fY5Pel@{y|85c=ZffEmgvv*0^`xHI@cCan=vhd`%yW40W2~# zB|UO*YhG_&x@Or9s+MijwZbJb!%2w$nIe8Jc1AZ;itPseiLxXnnOTyswlJWFlCf9bHuG9T%PGK=tJvran|*+EZ2{<6p-`T>H~^KG9TcwI%ED9D2@V(bA##3w}|WcEU_%iiWehIFHxj$;U}OozDhTV z`{-E|7G72X#hHx44BA|mjaC00T6D_FIkbpc`kpSfy@!i!f6qmXySs>Z7Z>sG>@t>g zbQwL~anZ02RKrv)qN7)P7u9U*qMB`7l(?0Pg12;0{$_NvBp$xp|4uDh5X`;)EE#foh%3Ap0R;+B%&&2y5Ls28GyRv0L7OY(X-~~!wa3|`>h7WwU0n2~ zvx_cubkVbSToj}ORS;EssDIbqMYYK)PaW!mZ$5 zi91KcsRJGrkASxc21>^?V(EXu1a+0k(kG{&jP%aS_f`qZThb3n{9| zGl*T%jw?q_wBRZ`99q*G+$WNxt&x(S+U2>y`DV6I)OB@*gtg~>%*ROroP1yD+JWoz zpI~RVj$EZ8*g3J|3$wGRBF|vwh)zyCfnlSE^7^~n`&b__n7<6OmJ#Yq?DsC*D?tTk zE$6l6DZVRLQ_!1}kNIzYz_l+z-`qfD!mwnT8_dEdgjSkz8M8wv2jRdT2Jl@;^Jm*BFjGFLb%+So0QCtxczkc zt0aHIy@K$`ICA1&ToZkjI~-no1gpKZVasL>iTIRj+1B->LbA)|#(BCs2G_C2GN`_J z!;X+t0Swx5nhVaOpK&egJp(5cgDsMxN_Y93Ygt4e&i;%mU1%%*evMJjFio;6NB%AE z_K$)SY=!Pv!5Xhko_mPih1XZ1tLKNvf1jjs#eQ#q+IkXU7xuu8;ZwUX8G^}Ug^y5n z;yB?GbcRfsChSIMN$(_~2fgpPJ4qM=&>qu;-efF+*R;+j3kba7^(HaSpn>+1s^J5j zUQz`S_L8cQiGnvW4j%~1Z0sdf*>Q^JCR01l~Wf(6HXG}MZ(wCZG}@gSfz5Cj?6)2mP+LYjml`Jnz!hgRVueJ zDwVxUg;!8X$2BCe4t&`|9&#FF8=6huT6}+i61rTdOFt&kB}KT3x5g^XR|rE8N+5ez zLgSW^%Nv;hu1Xc&ua!&p;DKwFTiOF-9(&_DUDbgrbTS-uGFV9tD3>>-Ojg-&G8vX|W9Z*>buw#0H=6ffnSzDV)7z*&1Oc zKFjXueTS4r4b8tGrRfHECpFy4W2~6v#EP<{t|HX0^~b-RA8S>9tX283_CLmtJvu)M zz0)}Vvak!m`})1b0LwXgHJa*@DtNnl3W3PNBn z3*51Nlq)pD=VF!DZ&3?ycL3?RT?q6(uhRmj!eFxwTTa8<;)FKnF4=fnDAjl&d*u(( zkEJK)d)*DvkEOE&P<8!9`YNS28R6ty(54+E z_Ye3e!6`EQj<60+hQ~Y<=&Qg-?-at}*zMFmh4uiv`KM6jRrbafqsdcVT962MlND6Q z67qKpi4#zAZ4;TH?G==I7`ZWU#dOR6%PYB5) zIyXb8mUvI_Lq|zOh7gRFlN$Hnt200C5`w@gK#?FaX}1so-;~YR4b5{j*8MMGC&aGr zp-oSGAe5#@utOgRL!@;JRg19nflvXyF?{raFxOE`S^N;pgrl6&VLx;m@NC)v;UKv3 zU7rf4(7lzf{(tO!cVHCN^EkVg-0t1&?%gGqPLc}{NTo}MWD$_w1Vp992GT(kX(m8` zNDTrRnh+EasiCW2|3HNd_IWl|82s#}_B9|R5!d|>% zL1`-agT0IQC3e)T(mU#4kbLx2p1!x@L2lAptxC88 ztYtEzoC$<9qy8dZ;3}(;UtFonfL$j22h@Ft<@D32nbLkvZ!Wa-cYks3gO)z-y!(gr z-tmxs9xcaKh`!)Hn%WO5FSxIQ_7*&6e;SyJ?gP!53c)4mzLtp-Al|C?F{&pA(3HR$ zqduR$rE=+vD;>ubItmmzW~p>&wjAjgg|>WG99Q2I#~2+kE28=qy(j* z3=H_r{RT$f@AbXApU1BnF`7QhQuNuwze%6<#iK4ngTc~F_b(lN^I!c{Tz|p!1MZ(Y zIP~A8y$=2}+H1j|&|V}0>(vm9sInDWmcytNhv15zzK&Z04m{w{e1E^PmMk&`AxlIS z_297CgsRs~^hKrF(_dfHJ6}FqhT$ZY7;)#6vt@87$j8&0{3d7o$ayZ@_e#sB$=m&0DUVoU_u3bfNus#NR)E&XQ(m7a$>;>qB$>qCRWhX*a<%l)Yqq{ zp~k4F?@OMSD(XM*zAF=eRzWXYg=;DS@s;%6e)3D9CBPGaA+o8x25T$n+tT?f;9(`b zAAN2G_=V});Cad3Vfwn}^v_A@^~D16#4+DG0@O&FDg!UVoiKffkSU*3!#%X&Iu@vJgC|9bE>`RYYPKB#ihMsV`6c2)U8^`uH}wGFrY|SQ(`s zuK32MqR=<)8m+HlaF`58j@DODTmpFIFyGMq9vLA(T&8C@Ty3al!G4sn!{x(#1e&1E zk@|+EmwQ+%w`|lCmPXR~yrx_$wLa}kqk>gBnJA)Y2%%5!pf?djF^6_||W zM6y4It=084pCWnp=a3=FjbwDj1UNJr#}gmd(uWX#Exne0D?NRJG^)0K3K^sIYN(eZ zr%Y?8mm{Zi*sZg{pq<=8>a=97hvAIqnG@jAHZH(?Mj5r?4kH}+{gw#zYU^X@@s&FbsA(4J;p&w6ax6HVUxlCWn zX;|My-wo8W(v9b zo;MYzPw~9v4~6uRNRNnc)6X!tqn=!xl-phJ<@*saR5*Y{C!59uRWU|?xGoIUXL?6j zedc%62OCwP&|9v7*Nd{?zVM=cnoXTL!2ps*%!UrS1+PoVdr==0lOeMZZ)H>B1*R7v z5pQMF$t;vV6yC~4C_oa^p=l?S?e*|>C*lLFOxp>>#ya@tAXR+vmoAtuM7 zEmJ2*uXaX*Sz?P%ceHrrmr8E&rcnE3{h)ui*?<4fHv5#PYWCmYwH|V_&+buTvv2ti zH9KIl4+5V!ePY9eOX%LHp{v7n$>fcA7vZ`j`KKGkcWX=&2%bezJ~yU9uv;~zYU>gp zJ5FECE~m6(z>siV0&#gTog2Q+B{9Ac&u0++n!ZKMVOg{tE>>0%(Z-0~%Cv&~p_spw zMf|O{#MPo+*SAIyZ~J;lu2!<*YDr^X$Iy|)dkJ_`UyeLu-qa7nr!;UFMw>(@tW|IQ z90Fg|N8cPG`sjzMFU!gE(Qu4Lh|fW9>zfzzqpW@P^(|si?+T&s#^lOXbX?4qU8IVR zi`nE4cs$P4rOXEF7`+XS_0`uSKHdHidSBwxRq3a1QyBVKbKug{inbZ4Zy;B6$|!vb zp}Fq>{VU`dKUyz#m_|A~hOVSzY4lp7%OvJt^A_G5S5O*(@&^|JN&YapfRNak-tsxD z8>nw4q!J?VhGjevFCxV|#^_(G=ZI3QQMyoZHPz|V5}|TzwbihAklvq=zI~9slj@Y> zfmg*T9TYEX)fR*G6{##3JXl|+loV$M|7T8J2eq3@ey+c!Kuj70kzoV(en3Keb7^vY6>ZLC#8M1Z-T3v|fkMbx7-3 zXIf#|Jmy7cJ6kSVMs{04wn{^GX9Y7FE-z*(OG`dy>Qm5V39}SK3I4u>`2;;oauU>P zL|4U5hhR`DBd&<(Fh1QkpI{LCJJ9n}CWhC}n_>VmJZ~!3IbW&sa=FgVe7djj3D>8b z`6M&-G8D{WI>NSj9@RDewFD*y*cFTgYRzSuQ_CQJF4IC~AskF$dOV(YGTIvo+Pm{) z4oqLic*Bk@%x?4SEvWCraB<;QeBzLL##W|-c{OakTZPtF=9CU2ARsVY)~rj`gzbB5Y=ct$o|hNwqA9XJoV zq{FzcV(zwGT?-4h6VNp|QBiUdWFoZ)>JD;BgeEIc_;x4LOL|XYno+QH9rIl=R*gtw z+7x5ePif3T!m6Pg6jt5ZD6`7Gi78M24XiT$cd*J|V!BD8>CATCDKw|BpQ(%kP^r;= z=6%W_54i1k3U1brFdHn&@fM`h2bjI?S_T|Psu=(?tO4l=Q={l8UBXfN2y*rI{A0{3 z)L!YxZZDx}q#d$d(`V z&oEu-EIFAMq}8IVu>B0fLGB4gq%+Z`{qA>5eU_EhWqXHG@ckJk1y@&koMj&18rh=@ zObm9vU8#7{Pp4Z*Yv%8$!~*XTWhWuDHAP*98J9>R>A)qt3xrw@yMDn71@d9=`NFKH zf5oiSZCRhzy~o7Cr?(kTR9kEBG0(&O+p;F>e@9M#{02(ZXL9*a{W{|h({JLnOvj{{ zJjRQnQH`|!)q53vKM5ZE>Rn!@#GtC9Uud{;m1zT2mwLFvzU$2OLS4ZqdX{n4vq;A< z)bdEeCe-2gIcf8wzQHNILcrC`+aa>4hU3U<_aiBjj^wK}JrM}@i!I$vNuhhaCF z*b*sxaG%LStAM3ccs!xT0;Wyb!n?h3Ag;LDch8ckO&o~BI|WST0A*2$38Skj0jn4? zs%6OVGy`@NFlngT2RvYI!^#+(T#0O?-~!ExUt<;S} z@a~1g=*a@BgBTV!<8F~Uy0g`&Y72J|m8=~NU+wa?!{seYd6PEj*_#v!{O2qi!sP5E z*)!n~%hp7g-oUoQM;G}aEjO^6D0=Y(=w@QO(HV)-HWS-UXHS(!=1N?TZ)9f*8N}n% z%#JS=WZ`DEgWp2sMX?pQ^SFw*T7gKr+Oo?iCQD5mV`YEGWy$&;>|*SUKYOs>hF&{^ zc(6e+aEN%5{MLeRAsU;QlT9EQ@U18Nyt&BcQ1G#_5rpC)FS73-#jwT3?nmsCykzW^ zyx9a2meJmY4So-dYqvcdSsp3#SOAz!@SIt>fDPY+Xk! zb_TFfBPrHcYFC6#pt)fyB&%;el*;&<=%MwK+&3tDPXQGt^|S zXs;+PRODN(HmPJFykCL!x2rLJRBpK0tF+)Tqy&*swLj#(&UUR=h?BItwimIwUDOD3 z&hI7X-=XGj63W`+|N1t$C)y=fNQIc?)TX9*dp$cwc6J6mO*lijJ_XLXvHMjNr#f-e zWUoOW>2kMF$PgFGZ$u%*lQ4Nt6yH&;0YR4Uj9x5|-!$#^RJg)u>2yUlyR=}D-lUsN zB!p*3$HQ2fs*&~dWl81;7DFbXey9@3#ursa(wC8}ClitNwG(^Lm&Gl;96lC)fnX)F zG44gSA!HlOti}4lz{ae1L?ZFv9no(7I8*-`thZmX8Xct#2K-gH1o#dD0lER32aukU4Vtuv>Rekk0 z&P`>p`?laIJ3ho6MLt-?g$e{VHDDJqS?bG64cShfr3&5AhJT{ERU7?@OdmddrYelu z9i&H%*!om#j!TVAcB`200zvlnwU-qOT!0uWSDdPHbYv{L0}TpXIwmqxoa&O}kA>t< zb=B{&e`|dL&NXI#kH~i+?&PBhGSdR?56A}4B>5Q#`dA| zr4h~8?oZ=5E>a!G?-BtW$39e+)S(r7o_6sc)BhX&MG$4eaJe?3c$8#Vq3&l1qH z9EcM6K?J+5H2)INzubUn21l`7@bSI!2#O|e(x?5|VQzj|&aSyV5Tl#tC=jSRgnd9n zy~`nq}7ny?4+bcUp!S~+9>6`ec z8J6hr)_@$B8s{sOQAbZtflG7`sf?orclhpoR*21Und`}Sc`GB5E&5EefRM@@Zp$ce z`8ZXcYruG%BiN>;4VEZ-RR^0!j%2&Nz0g@6#MScKpBSYTo!U^DK*VB)DyK1{*ap;U z7(I&JLqgIvAI)AYn~*`oG(#OVqGQ(zx3+lMIeP%E-n1FR)-cN9W|iG#lgF_Bj`+UB z3B2|_$-M`pF&La?m6Sb(<*3MX8K|9j^ARoLK^KTGLUI)dnB&>csV&mhc=i&-%lAEp z)W(5uEz9Syek|MG2~-I|!Z=n`LG|r*?KKcobq4DVL&vd^PVm|Y|6m63!N##|Rd^*e z{p}fSeds=(J>N#TYPz;^%e1|&`g~4(s<%&vR8puRhm!1wSAN!2pUO_Nq80prQxSZ>`g|M1~{0++Hl(!wto;zoXmQKt3nVG zE(?Nk*ZH|Jj?2zHd3T(%JcqaRg7_ipMeud~kiA)wbm?U23P$PbGnuW?MnmlFgg9B} zKuqzt*IrD<1;auK)ugUC1o9@cfjIN2pTeGJR566#rm$;J#Fk8DkCq@}-mqXgTTc}d zB6_NvdBff5E<&XWo3s3>a@NmP#3U54^3<~zFCSANvf@ca40?XV{?O1x!tjC<1VblrIj+}Ok|12ZbIGdkG(5#DchRbDjizN ze(Q$0afzZl=HC7}+ml)-1*~N2y5jrmRKJ#ouJ5Y$<_lgXqm{hq{T!2@=gWQ43I+z}ZdWRF^_H+)K1j zfq=A`4Q5uWFDEv$!|Q?@D;0FB|G@kynyBZ((1- ztzKzcu<5Qr))uzCRoX7{gkM-pY=lI_D8gj+5EE7$e?1r{QHcbrlfku!vz;O09vud$&5^6T2X<{|Bedp$ z>p!zKoL2NW$BJGqS<&NgMNiy;4rsv-uxbbUzTa#@b}c%Yw2JyWk^D}C24Ax8cUJan zp$nr`Gg~G@t>)7}k)@tw9=42_2ZpcMfY7Bfrb2lsSx#Df#r9-WMoH_wVh>YZB_|{T z)ysvWcuX?T(F^^ZemlcC)OJhdrqirppxxrgWx=m^<-V!xgn(VEJbauIhZY zJGA?SUCbOlOf+$xbn6#1jU?^`xr1H8JJ_e{6m0e2_OI+)3d(H?w)gOH@SKLIpmZE{ zDA<3EeGwki^hk#I7J@Itv=r^lTJp7>Q4VIjPZg~TTP#IFc8#r{N zCc*mO*l6@nPW{G);&F#+RSf>PtH*v5ff>;DCfgX1%)BWhS$&hOj`>gBB>7Wrv6V4> zm0S2}5460+Mw8<%gJ1QCgo9NLjms*>zVH^;E&6hTa#$EIWewM*>2VZSxtamdOI2^9 z?L_>7=t1^o^u8nGpMOWDZ~GngJqk8M9`NvVM}SF0`*} zDDPzT97pT3PZFz#N9$omUBg=#bz;v$wk4l+R5p6~WTP9daX(^vi;m678s=n@rdStp zfnpabUyHWjBlRc-=V{?#gA?Jak*117ni43KrbaDfX^IsLuL$(*iEug1BUIW| z)-X$lyJ9-q4I|Kw9oZ4 znD*!^Cc@luNboMWQO+<1GY&2r(2d@t=6P7YXrB5NNFHfU1;ZO|p_(w{%R69- zdOa!>g2D|I9Z8dkyIZW$RH*cJxZx`u((-TDM!EmDYb&D#hk^bly7qJKaH0vSLb-px z0V|ps-oW43$=`)>&7Q7*1NQGZ@Og8?h$rpiQz_|gO9QTHZk2kpH@ry&lpGNY_l4se z(eZW$a!)fR91i!xh@g<7PGYF7Y;?6HSp6{0}sU2fkv1nJzNV#3n?x9>R>*hgbS`K#eXpV1w z-97C1RLCv1iVJw2Ys$Eltk)opFACFktDFy-CyK%@Z}qZ zg?@R;i>kZG(!tGh@@HwE(W5)%nRg%G2)E=rXKZMRw?RYBqZM=acarQF%-}p)O9{Qv zQ}{Ck_`%gahVhS~V#?cwS4*biUSETQ3aM2;gOQBVcg^y`)Adqrf}s`hXCDrfy#&8O zhVJyuD-blq(1f3QRjyGJoR=%O0)vJadZAYlF&LebY%qft@mqHeMowo#;1EO85|UR| z+)KeEF1&)MaJnd+JRNRA5hy$uV(<^ufU8OA#geK}XfV_eNZ*+#^($+cPf@qv_B)3D z@eAcFTDxl6E??0vYQvS>j}8-cC5DK}ihg)pT036(CKg;K#Hr^*?4D$g-{oBv1YJBMh6oc9G>5e-a|hj&q1f z`Q+0DNEnHI>JEG{5r!>EaX0r(?ow@h^wI# zs@2cWUf7e3So^s$a*fX`Pl7hGk$`}rm+ zdO3=WIF+Av{D}%};6lTD*e3$(dep+ac7r!jXoKo{bkl9Qk2}-qdi3)vE$=P}GJ5yJ z%wN^>2#VJ<*1>zE&uPP@Cx(*9J6ht|gu-Gd9uJkq&PC1t82;@2|CTkd-i&t<*II07 zO))=^m@S+KSe6)qj3>w)*?83Qhw-pJ)euSJ^Q8JTEipu@i3K^a`LrW3!N4mR&NzUu z^K-8O)UK3I4C_(*{k+nvy!6v2hT)Vsnz{WHR9aalK|4 zREtAWsJ23dU_et9qA7B`g-gtpjihF$NG=7UrNK}JwdgH0E{5Phb#+hjBkNbJ2;KvX zzsXuw8iB2#@m^)w{%8wXC0bTYiTlu3lN>q63$fr%^i2e|4boN`YCnJQXCn509TB4< zO4;D`syjvl!FkK}nFcS6J!5GFYgZY{#phlpC26LsNDHZaGhq~y3}+LECwB2vmhx5J zIkZLo`n?Ltli8qcOUZVAv&%=QlyoHK0JK|exJewQx)!2sdag0N5>P-~fLio9!Vi4L z;sZHP!dNea!)pvAepR`(hR>*NuxG7d6&{72k!$z_!}I#387d&KQJSHa!^a$zX4p*~ zhS>Eu)I9>}XRz)&)}waF2Hy>a4qmE{sx_qA1RrcLw02-Pw87BbEAh57mp0uXZ+X!3 zoZ%Jtc%$K!Qt)t_3>~9YZ&zidydWsIe#u2o*<@&4K1p$qRc@-Ksc&~>O7h_TCd063 zmruwajJEw4+zU1vIy$OlxnOuzYWD>)pI(p%aTg6Wr4d`OlcEK=zSR(j5A!xd5I!o) z52?*I1I7*7B8}N@_(f0Mmg0XiG^Jq0H-_ip=emp@R$L&=$yV!Y6nEj4qKi)4!{s=m z=#s@AWXC&WoslS2nN0*hWm7W#CS469Nnj@-s%A}N`^0j-_UJXxZMUIGybGH}SH=j~ zr+3S3rpkE~dv;2W9e+!axI8N`Dw3X=?bbFRtE zheLrL_O|)*i#DgDxiJMYRP%(=WE84?{3Al1W3m+*pz;C3(uj2D;vbtA3Jw^mF=_>1 zY_La&)cGK4Pv(HL;XkXI?E~ZC&>=MZ__0xe z<)5Tl{@~Bh^6#x-sRRKlaA5r_Y(9pTzvbs>`7i%#`H}6o)!<27i2r`eKj_4tvHXos z$(H}uQ--CFxBRnDYnI<1-Z_H~uWbI`LCatB>=Rr5IuLr!5L&wV-}Ilc{H@`&^M~mMl|47`E>TFWPe=R>5hW!6x z`K!a4I|ktyoBx)-KehRn(EQh+|K}}#k2$N1&HkG8A4VBNF#N;4bTW967ShIzwBO-} z&WDIF&n*W^LGiS4Nf%jqJAO@JA|7=ENeigGG&^jXp5Dzs4eOIM^RKaT~7nH*Uj@qH3TF1x8qbEiVqMx9;zEp`Qv6_JO+5<9={h!l*#Dl9L)`e=?&p%$ z9)L%{wWdE<+ZYOUha1bqYq&j%;>IHif_T?Os>}#UQba)=2MdU^IK(xVU$Hd42w92_lztc$g^W)@CWItO;Z3Q}~uaj83|8Qau&9v@pL6zO`M8I5n) z_l6R_+2GzpC+Tuxt;!g0+>@?#z@Qd3KR@-w!8cz=TVOYgaTI|4&{L8o83zy{`_t@@ zyWn?Ijlo6P0l95$;nFFytt{mzvas(JDy5Z#9Z#W-X876qz{!`4`e)hUkQZLkI)7U? zn#oh8<@5)ZL-27cC-vmzs-9{w*=o}3WsOx!*H3GMZGKFist6yWr6kl+XkE1SFXUAb zJ(cnF4D0o*HI#%JYJ>}~e)QYo(p|mmE{clurcu$xsxInj!IQ8BMpSt!{j^ahU8!jt zOFy-iiv3S3C5f-;H>K(etS@cjh`M`lzvf6i&JZA;9*h`f+MF%)E)b9!7Ii1 zEm>_!F*d_JqUFGN2nkACZmGtoRgt3R5=L!>4)f$BbLSZ&o^S)$np9&s#5VRNTXhGv z=jR*4RcvM9!v)3&EOpZY<0U3xyuzpD3yt@&v?U+QrJY=6*$H>%$!v0_3i6g)a)Fy? zG{e!)EYD#Eeuah9!2FW!FOUb1R#?tL{t_%(##lDxWgDSz@JdS|g@Lcwsz@`A8-G>J zek0hn#?l3Z6S7YkvfS8+$gQ=fEe^_FF;13Za*b)Se|gOq1eT4KD2KLJo$ocfES(_s zup4!7O5y@pTxTXKanXGxOx; zJ-yXZ#miOh@5*?xrK%T6V`oZe)dDDoON1P%Af;Y1`V$(`zOuwg$fla)rNcF2dwi6@ zmWDYvCaLtbrK7@|x!0eXH^IgD7wq88)$1~EP7bj}L&HbLhSK62#-pUkf`{35r|fl7 z$)$0r7i}U|ZYFJdE#-U5YfQFk`H^4q5Kq7zV}0xik73n9H?hq(^@rQ!%jGUuc?S+`Ydcabi@UPG*Cqh)T96zlbRfve_ zxw_yaS8<4|QyyF_4XM)#RlxQiu(X$u(>BuTI|WleIPk3{67nchO$X)9tgb@Xn+b(n zR%Ma!_O{LxL1jxJZYHDJA?G8M@CcActaNa{(N~i+r9)n2O>&1!HJVBnH?SJr>@G<{bN#*vjm3KJc&rntMhScj%&9Fb#QW9#ZdNd5aDL3>JD=6fX zFN~p0o{!N|U%h7whhurNv3-oHYBbz7nu=5hxT=!)+Z0xvcvmm;AJC$cxA7 zuOb{Ms>G_Dv4ldeMqw4QwV!!#s^(t^1L1p8ghTJ_)-~=`iiM_;Y}mE$%sHKCoYvqy9nLSTdI>KrJ3g~-5fF? zrKi{meJ1IYzlnEqxCarqTHPXgL)3?N~2-hqv;n5o=GTW=VRN`V=Cm8&u z3_5ttG7bXDn}iNppeP3CZkH;<6}4Nts{Z^RHx`% zuVh(nYwN;0JYCv;peYE67&OqtxWSYvChsTY-}<2n|7NVSwRCt^B`~l&j^!!%Z-<*6vWX9!V!v8Dk2j94!`FD0x!c2c~^G zs1;-KuB{DIoIX2M&ebyvLlmm_D2*Ctnn&hr>^pHYyedTG#UFY!HWfOtp+rtpk2+ze ztxmh*QmSHflxisA#p0PLtyDD)#z@!vQK`Pw+MR~usn!RW7Y+3lq`x$jq`305HTi(8#$RHevzUr7V}5a-NtvP61PVM}Hjx<Et=FPqx_Mg0q? ze-8lD%`^+8zL@sCql5Q`K53IYg$f=DtKKu&;K7?F>))n_anxank}}^i$)kQ0?^@9F zrlk?Ie%sW=Nyc4taYgv~Z5&W#!uhvN@-%l*jr}M*A2_C0NP%RIKLH$i96qdRu z<-jMkXHTJzWp0N4P5Ky6A4f@3hMT-dM?*FidOeJjA^TvYJXT#t9wq4D=SQ3T|A1?I zN1I;%Bh7nO_YW)G3W}hvnP6g`wfY5AzwH1S+ek{DXp$#h6dj!8qJsz>R>_;X7475II&Dd1UZ-g$FO^;Bs@oAt!}a@MzD z@ZNk=@r69px0R)ow+-zbN|zk})08fr{%Z^OD_Mu4PaSvBln&A1RuB9g8*c4|0TM

`oUXDH5FrS^+WJt=A&q@|j^!jyxS;Iz%=lq^$KxEf^*KuEhBviQHm zWWb|jgL7sNnaJCP!O0)5KdBt6GOQ)b`N3k>j9+_T2Fs9ZSb=JZR?ljT<%a zG~K~vrilt(SGqU2(w)EPzmIO4^xIm~JQ8$bTAFDGR-#u8Ya{yMcqz4p^=+9yJDXUe zpyd%$9-2dYZ7c2vmf9XQRivsNoFI>lQfV9&slRcjxK2!0;7Lxu3rOUUbQt}GX+^wp z^ippUZ<67P7$v5X^xE-OQ5(#p$$oHC8dK_$8Ysy48` zMy0~oZKf5W&Q(%>%T-!2QLeUJrP;79*E9pSKA+rfdM`eke9?Bah&gx3{vGY`#TNOS z_NG-bLxvWu7AFgO68W=a(^D02Mf-b>Z$}ZtEY9< zbMk0c+q^9g-18`r!bq7}cx%o<@)d2^QK1B6e;Gs32(c>bFr;2m~bjtRz-L&6@+YCcY5U{7?5piimz!Irq&R8$LaowgsRR*+Mi?F zND~dCXrll~>tOBHLaV1+q3RLch`LeLlfDpcf4q9?+|jxc8hz|uMJjvf-@g7V`g%`z z>!iu&f2_l2&;|c%ef|8O?dxeSeVtx638-VX_Ava?|AFq_{|0KOfIFuC81X6T4i2g4 zRg>U)Cu=|SnbzIJcT_)B?&EVaw7zc&!NsS#|s;e>YMGe9fF{%(57jh;OL+IF?Zc&qoVGkAZTxVubWJXe!j2E(FWd1PvZ zbYAUh1*rE4FKj-=U7+YWPnzimys?gZ1nI9>U#G@Ni`+R2*)gzA&yj#3y}DV6US8eJ zO7!x+ZdRg~Pg^-3DYCouE0PdjcGD>nAg!mhDGhivhLNigsZvUdoJQ$QWE`PZ4tHQL zgS6wPrIcl}bil}srlbrT7fXd|>f7iPrqbXP;!^$%X*}2WPm?-JCH12}N9qpx35ksM z=BA8h+w(T!zQp#icGID+1&jM&i>wFp1zVtRMlwnyMv`#&gGrN!%XLu-c-tzGrYgw8 z?G>BhVP9(-d~4lLZqot%tSylUG}3Z&;-$CA($%(H1B%)s4Y+LcqAF^XIczEkB+8KB zp{lVZ_u_7W_`y~ZROG~9*})3AYU?IX$|qd4`RR5{`WhBqwY4oiEk9SKaaTuBUPIcloG%xA8cdx?h-UF2D-Vx$_-Ftv?-Mf6x zyLR*YvCdp1l_a@$;l|MPhVjzE;nqY7Qfts|(C&_{HFSN23v!Cp=h2imn?$@q{NNc9 ztIq>t^(~3wUeis*+pb0W0B{z=u~&INnQCpoBSs06Ipj{<1ktq*Nwxq^K7U# zTIQ5kg?ojX4b!@F0rZaXDSbIVI5FB<3;pJXzuPK7NDpoRIsBU3gA0N5s@$g6HCHlE zUOXu3A3qH=S>6StVvsN4y(aT~511a{1opL_Tne*P-BC5I7q<-O0>v6!Bb)|IsKI&R zH4;g2oQ`G=E1QX=k6!2MP=0C#hinMiDu;CT4K559&EMiG5=3>l`ku~Pw|1*rk`mtH z$if4D4}gPpu%jG<>vgzM%x-mG|Hp1#am-=$C95~L7Fju}4@bJi0e3IL%Ikf&04g0G zz0I|^C<7`34yZ_jS+arZBj8QfZ*vT$-=!~1e^*YATyNi(3xv@PxN?N+Gy8IONN>Oe z)VL|1%gih?}1@xE68)We6rjkcr8;dR7u6TdgtssQ< zMz1L8`2k!sxl(D!K-3<)VBtXSDCr_=Ij>4I_Jl=)xQ_UgsK(qIWHUyx;N^=UG6xSq zkNhLa=EgWD`E9?99rl%Iqll?PH#{sV40 z$xZ?+L;T0qZ(&+I_rN9BOxQb?t5PIufg>!lBUe4?+!W$(VQjH!+#Y=7Pvbg6!iQW_ z{N2mLTa+@UqYB5D(=)i{_=rg6MwO6f{$rBcL(1T70a=p|{ygr|gSmZb>o7cE;}1W* z{o9>c2ga_CudRb?SN!}TH<|MZoBa`5FU3Jueo|u6Ok&V3E1iKuR5<9F4#6|IX#a7< zqc?dVM4U@fiL_-eNoVR0L*A!+A=ul~9inG*9_S3m&PLNe1*{p!v(dA;juiUfLn#~d zn!~-r+?30hL?HFUj}sJlZ!{_B6HEVQdhGC_|+L3w-nL;Il=14*;Ep-KiD zT$#g#22CRc+i5#`gycd9H!^0!aZiSPXU=V?mcsczr@oMi`IDp~+qcBjY63)Jxib@2 zmVG^`u|OR`cTr|B16(EKZ51eFvEMMtW+l}rV=ClWDvX-R9j88oSU+zsSpTE14}@;; zu~=mmI;C3zgS|XMA6M@oUY->KOXWNv7p8u~0X&+^4MANpWFB#Xq_j^t1BK4awxwKa z>Jc!@xcP5J^5*<`LM3>67p%W)S)g@dozP4W?L*H7$Ri;t5;pI&Ke3m{MgY7eVfn>#$pAlLqbNOgcDLlj#Bn zzvenhTX%5RDQYsT`idJzNGh7RmL5rH^DWnvl<@*}8R9;oY$>T8fiV0#WWCe7`}Z#I z-kW5t<4(GV@)Ixiuv~_K@3~|~RzsFaP($3;NZv)&f+`>b~t$lcGC$KN48aFt-)N$+R^f6t>FJUZ!Z zz~6@|Qa)fm<=u)T^n%!ml%S>lDpyWT9rB4%624Y6O;>`96d3-K4=M0;yhjvV9qkd} zQtDISIT-Ju;&CS2QA}y|QcJ*k5lXGO-lbDIVn5FJsFZ%OpKF7^ku_=w^|UWL-Y-%I zC(apz+wkP*4Y?^x=HB-|qJdO7eC?4_Lh8KU5+o6NbzY;9^ z2@6(iLCO)F6B!3D9N}JyoJdqx2$|AAEL>cY;O>VaW*M&wG5&h>L2AiBd0hc*ej={ToGi+K%ItQ`cW>_jg$am$NIj6D;r$ctBUYVP*E|Y*sK&n zi@O7ro&b-@s2B&(od6HXDGRA~Bfu*})bT#BaWFHRvqfq(lB?+;NG(sU<}n$IMkQ4N zLTdT@!0*Q}s@?o!oG(1c<~TTuzjQfNe@H&YRaW3XkM*bk(~qH&t6YsSLDVs>qLYR{ z1fIva5M5PkB3wVtd2$JJkt{o2q~L%g7lWi0gQOLMq!)u6ECMM@3Y9EBqlb9C-4f5y7Y=dxx``$~QUm&69 z4(j@n|7H4Gwk5*o+t?}}1n^za=Dd29>yH;lN|{%=_E=rX|2mgSp4)G5n9d>sw-(5P@9gL)O<9hwv{TQT=Yoa|{!2 z;ot@*F>Z6--rB@YapJxv1jXLr*67Sd%90B1bKNQW`gnM?fE!6ogd+u9=XPq8T6dF} zIG@OFWigr9TL)>l3|Ay(p%LT%xW+YfN&_PwaN%@%q7)Lr@1p3PiO}Z}7l(5ddmeEu zv3cfr^S!9=U}hBWJ7)$z7F)nd@$b^x6CvK6uLfHw-b!B{4_Op{7;C)8)WAp?q zjIY6mBcamT8oVck1vF#%%_vXrKZjD61)HAZClQ;u%fPQhXn!OB3aj2AY=Xs=d9PXa z7$aOZ@-fCe#Md#|X-f{&GVv)`(9=o!Rz=bw?K}=rR5`~pVw^}XaFz1Ks+4Cqq+CKN zpFscrCCFF)gMz$R5#$U_knj9QC75AKl;8rE|Hf5x(@}z>O}syRQ=9*oxWsk%blPdo z5N~N?lsWJmG6#;gv`G!?qq@XivZ?{!C0bQG4wpPJRqkhGK!7oGHAh{ALgj|M^JO@W zE8ub*$Okm!BTDe}&nakOT_a)>;M+$0VE4VGbIr1s^MZCUd>yPu*%WgmY>eT1pk?uh z<&$Wf7+uhq$H2Rr;m-3s32EQC2_NjKtuh$#KFZaf5_&UXQWHLoIwoCg!kZ``b>Rw! z!c<>-88HEuv+(A=&0uQAS4JfDn(<*c+3|Wa{!>(A%nN)y+)~*11-=TIfgReMZ;p@c z%@N;i2yDUE3dmHrVJ~CnYte3q5W@u`bIL@Q*$M+&@EsB5t`3rZO{8cWE(yiZnx(xn2G7YN5pSeNf!{^ z?oVV^IUqXmurowt#WXjIngKbRUq*XD+hr1$I;Ta5PTb@SDLFUp|KO`4EvGx6=DiPr z9r+KDx1V+72Vqa%|cqQ9V~IQ-tGq7c>i*@X1U3C{*D=U1eKQw=1%5J-peK zZ;6A~w5~jvc+W(jF+xeJnBk(UGFR#hI=FeDKpDeGyV$EgnTSH?ReZ|VsC-C}J!HJ<;ef_BJ94uBekbg6Nu!<3+@H4(B6CM57Rv=EZ8 zGl5TYlp0pFOOc>qn!L{%%a6dm%a7ydRL~UvW6Sw&9A6{QHQIGi;aWJFpXw;RSci75 zbL%mD5|;kcn3Ai$5x981+>_UzbEXT#Gx}>Va{{Wi&nJNWs5K16B=Q1!s11|&;mRY1 z-camQ486`3cHpSBE&b^P2+l4<(QOjngjxYhCh<{JBJ7{U`{Uj~_;nImt1OT+tSuqK z5+%a~mkfHPc_qtav@2v%J?lfhldRD2M^mZy6h1_L3tq~5NsFiQ9UO0fZ&ji8bbbQ0 z5`t$SDOoT@=TnnfuD!LM!H>f$;SbEc#PVq4rsFyK4dH2AyE7IkTC0Re`yOh>J zJusSt)*IaZJpi>&Z4^7;@`Lc;?xSn?mdU2{+KK&`q#oeM`fZqoG8nHg6jePC+ zC)O5E$+{=R3%fS*o}StO*cUHk*&_2i6E1AzL(#?IH}Rp;iI4e#nq+yymdz+ln<05I z^6kN9RJ)s@_ZK`_RaukD&%?(HOZeYl#ulC|{7AuD`4>rE31#$oN&^FegW;_mdXPE|gH# za5rBuSv#a)QpIcm1nqP8LYDd8b@w-KAUnXC^2Che#6Mmr@Fj0Ye>Cn(oFQ5OmLsx1 z8h!+w)C}p$m*_F04qbH0y%Kd5E+0iTz7Jxvd7E^3CyqSun7nZp>I(?^iEsJDrObZf zQXuYEp4`6q;jes6e0=pQ|2jlpL!Uld>VApuPe|L7&xcc2Q*Q8WsC`o7%X~-LCHqVd|1D*{s&3W9ITzw@LC8_w8>;L^y}oiLP&fFBaPc@Qg?*CwXMTtq zx>jRP@e9$b3d-dhlc90^=a5{ zm?pPOUvV{=`orI8cwtBWIO3@5Tn@vj;v1i&0`;T^n)#o!}^Q8Q8~VSyu^RNy1v zsX2`pX|kWtkVf8R1PDYQyjfO=c3@doR*1(J2~i3(fyM?4bJb@Lsg4~hg(C4%h_DSu zV!0-y2FK}_Z&O>T0;#PabfM^n&ss=!yJ<2J15sANfTN6mMIi&8NECJ#w))>91gxs4 z%SdrI_}erw6cNH;dLJGti4a22VC3K8&*9_HZN4@=0S9AIf;XDLkUP95eP%qgjuM*E zXUD^sJA8qnX#!zQv|yCpuO!@ZV9P2I+ay@K2G+6M26Lb)#6h@r)`9x>g`F{@%(sSYp;6r}3gR2hpln55A1?~oztM6rnT z6JnMEfy<(>8;MP>DfFkWjsyGi0@>Ez>UqH*9l^Jr7q;Vhx>~{u2GGa(RDOl&6XXR>8e!@!Ui1TPr;f)I?_GWiAJ zL+U(KZH}2QYL8~kg@>^J8v7zVsOgam@ht>jh-oRE@En1S7UDz*ict!T9n5U z@;HW8j{cOR(5EF^$nd{-n4Fzi&{BAlf_?4L8JP?1ItZVtividx5*d=FFaE;+Vh&w+ z^hWuH6Z4xPxTBB^XWF17d<+lT2zTA@%dTPji>x)hNEiJuJDYw2y!|5YLCaUZ#qH-zEX3AmoZZ8C$gq%mUy-(Esrgk6182!h!? z9{Zh6bc42Wn9lx&;10pB39a#%NB`G^cPW2m<(znJl%2+neXI$0GRiL?b{7U>0hC~A zNeW%tO&Ec%VcikWl3v1G{9P|jSmUE%z^#FH9bzbBGT|tMf%b8z!UDPp%}T++za`v) z-u;CAO2@B)oWrvZq|cA-FH|IbzTH(%(&yve7IG_Ui*{Qwi83uG&fQD2nl^z#MwEFv z%jVB|_Z29hdp}d8Qr18LccN_uW|UAHXG~&73GFEOaEPq3)(#PB;iq3mqqCL=!cc*1 zfbBL$s3s*16>!|O8P0rw!m$~Gh6&Z7bG)!pP)A)lajB^<9{AuBgf@uv)dXP)O&x;= zB46e?jwQ8$>=42lL(o~DDc@3 zGgB6_S7r)&B4lwN2{p~iXx5!QL4O&1VahYCF~(aJ1ucm9j|T{x;X$EMzTEO#{nk z3$aea6}@(*X2%IKT+!ojg`Oi+!I4V!IoMlg!H79%u=hY%iV%h4vqN)mFyMIWoFcp| z>>$gxA*4{MUYQ-RBL!`AI-E=q{4D9@6RHv1|3*e+yMX~A1wSqVp=kx}BXK!cG!&M( zWG9*2`blC_j)76|j}7g-5XrS^%SgsY9|_-q%x5#HvxKnQPL z(-4Sj8p2!GG=#UVX$Ws!(-7X~nFctG zsw_dZsDjK(ih!y!bH5@2a7-F-$jVaCYlT3fhy98CvrY)-+#SpAB;sV=30bsY@>x_m znNsz0Lbwixx4Ab28w|c6csmkv_DbU1lS<;i--OE4XVCgLoKpDhg3uK+w9XScV*bT> z!cwv`qsg!6(0>NyF9`|wSb9lF#>aE{=<0q3JM)FFeKqlp2;oe2&R$>KlB3|BcUd^# z=sKLek(j3xs;U=Xgk&p8rD<2tc447kTy+o~;X>~UwQ_~@jz`)K{)RIXnb7|xPDx}! z)=eSEQC=v{F=r^5)bavx;U`<6KuY*VXo*pZq`lt?-??E$My3f9z-O-z;>ge2gES_o z`8kZEyh3H0eZ9~OKHZDs0lc$huOQ*0*9M`bBe$R3S1U`+9gL7IYVHFY&^G(+6VgeQ zkM9>M5)!B%g?vPFQuQcDvz;pVPMP=2#2TVpa+==SHG4y-0mA8$k8mp z_7IK3(i@)(u_Wpf@-s?0v`Sc^mb(mLi0*ZKAe&x*z3YX+E>x&;s8Uf`WHhEf1wSR^ z=eMN7b2bT6NWmdnaYiWOsCUAauCxlK5N57TzR&xwLsMfh0BUQ6R6ARqUE z_YOk6G;)V9*_oG3A!!%(bGddhvx4CIE*xmc9D5nkz83tQN-4^1Qcq2yomlImHL(+G z31?uP!MvA#m>`{g!913tav?6t9E^{#QDzKBI}Xx0b6JSJE7XGhwY{6b!Pef@U~vO; zf6M|QUgptoYL?Cf{(af?x}hTdDC)+3=+v2w3BGlv2+@}9G-rJ0IyE$#6XNFy%zRi+rVI9QwK z*B+)@%$f9~1VGL$g+_j62CmgLA8}%Z#b0AdGo2$bmPjfS}uF=4J8S_cVKHP(% zox#=^7Wb*HVll#zVg8WdZGM33>>v1;s|Pxq>$H5Y49#@PZO9IWsB`CeA`6!qz=2F`Dw>C)gIKqHWp;tTe zsX}sPxxS~!b?9nWQV%1kYYIulS0r^cym?pHOQ(+qOGonpM2g%Cg@faD4A=#82eisa zb@Qhc{%bFI@4(F*7K^!MvBoA+N{=@|vc>$pbn+ICV_@@}<|akz@Vi=vwZ-eOu4o*gHOrU=e*MQ{=o!8!D_f-@()6tXq8!{{-( zrI1>|ys!k;<6@)Sr(>ec(cs?O{52f?Ko>1b12paPml>O0#r&WonYaS&#vxHbrlR6Z z&5-E{-Q>zYBF&o%`KL(pCZKrp4G8u!e*gum|Gef_+8>ojsS*sN55inuGY<)qbWlP! z#5psWkIU*K9|znOzM;QTJJ}@HPIjc2PAFYA<&L$cWU{JV^QZ_jEanX8KUKE`5}KRc zOVitQfol4GX>2xo6IO05%E~Qp($oARx&%a@!`W%NiiKJM4y=DHZ~s8aua%X&w&__X zx+-}ovb?zy?WzuN!a?Sx*b;d;rJ}hLwM@!Il}u4T|0(^1##!y+!`hVGSFT7WBFy89 zcnqk@sSf5BWnV$s8f{K3Zr@68y23KQ?^H^euy#SoU0}9S{UKe=BVl_>^T%NLSnHCl zKYVOcJPAEZUoDxQP$=KcyceRD=y(a$oHqrhs-qWG=tR{(+c*nCYN7`)xTm=uykFDo zNu7ePdYUJLsiD~fNlnb}P)A7DF9>fVuw==-}{zIN3j2()}tDEev|nA6i7 zMx9kEvg$KrFji#W)79VvwNV!H$B^F~+@_iTA8+pgUq#WqkFz&DH_6`Jy}Nr8LJGY% zr77(ypeWK*5T)8hX^I7<1f~mL#C> z`+a}^4}3CrXJ@CJIdi6+^PFcS-(m+RFE6CP%NQHpD)k&CR?FAu)uY6o^wx0kdn)># zs8Rf<1*B>Bso0Vtn`>{->@G-iytDXdzI;;N6`ND!`{FRtyNL?TeqS6F#+}$x@@R3N zuzF%Y@e%(3Jpuu7)>?%v6(%;Zx68+UHlxAxBM|0zqX6W zuBJ|QDPZ|`;uEn7R83vI#ER6jtN5kx4SBkWPvy(HYd5Tjc!G@&N$|&e;&Pmn@%H}P zQdvE5i1{CVQ@gMD=Yx8NIt&M!8vXu>Gv0h~=NaG(sFQsEpH*t>XJQUa>i)TBinr9> zkJt)h65KY>{?1})YW|t%$wzWjB8l2vmaEcdgTM(DK3D>xml-Bfw5Sk9HFoc;9fTya#sq)GF{a?y4<-hI?$I)r-;WzOVH*)&sJ z1oQqbv#`)joGC(4kIH6><>GyL<1C+Dsksi@t>`~XTx=)pGTWaw028VDc%FA4nWhDh z>DNFqp`@oLiaP~gBqInS-zH3YX3seO#9i?hVv=ys?3&pHbx~{MM5QM4F5&f_!pn``YJHR9puNqY4RU(2SR!(_RSW90 zBCrpaEf*Q;3Rpd!QVp>QYG?H>d&ACRMzBsg~beim9RSRD}bu;{7QeF_l*O4Y4%YOb1&^1mgYVhsw=pEbuFe& z%f(80s+eJBx$vukTY%Ltqe`6>c}v8x5P#EPIX*o4m5)7DlNB7$Ar{ybQX%hV1~FP; zvFL$C8~dcleBL#_I-an5iq&yG^L>B%UcNtjzLbnsKqA+=V+dQSgl@E zP^-T%b8NFDZ;m(zVs%V1kAQr2G>?C*92X2Fy_Ht7I6K$l*J2Evhd=mE08<&B1uQZz zQKwc~HJY_f?9tEEY7(F|3Cf&3g;PJDR+A9JwVJN;NX1e)5@NVk(~w_SN|!H^Lq!me zbo(MXRK!9aDf=QhRKx}zsksK!<9HAPJJu4s2YIZmR3(@I8K?4O$~B&D@JI+;bi|IJ~PHq*air;L$suo*0S7TMjz-SJ02_agZY!)Mjm26on9W} zj4b5k{IbHkJJg)4ds|J{E$em{!eooy{K zPLOjsj7lD>?S*1ELGJTN)fdSLGM*FJrV>Bq12zbc^ru9}3*L1+Qbg02ZGl|0V5f4o zhz(w}5jS`bWtkZs?a(fX?I(p7+#^hc4S72BO1-v%A3i7YPOrdQMv|* z8XnJ4N&d<)9;B@nW5^kePT^!sQULk zv9#msf%8iLjpg5V(hiDGBGt5usM!xVIG5oALc*kwCYW5xo4*+LiRDhAHYA++pM(M@%- z^f=nI+7X#ie}5=-%@tj!X}?^topS@zFT$dO*;k*-6+1dMd`^w8iYfg}4S^7^=l`JY zZe6tSb(sg8E3n)ilyR{Be1f+?1$ur#(c=(0Y8#FIf%n(CD|UYcQS(8G>`qPC#xrTU zP0V0A6Q{R{X#pw&(YDIKHm))d4V8g@+r>FT_Pi21#1Lpol-!Mzo^1MbHzxD5ba=N| zr(c2E61XabGsbAnAKRS>4g_R~0pY5P- zd&RAi#f~A~G>3Hwk#>`fBcs@Dv6%yqRpEb$hjm}7+(I_f&UXl*)X7LtsO@1f9v%JB zVevE1dd8@Z`mh@143DdGli?}n%>ap8kBJP@rtC3sKGd z@8a_Tz&-_!MP_UgJQlgLn(LcT>vPsf4@g60u88GB_k}<`NBSVdO^JW75jCNU>zr_k zlCFtk%YDbjl@nD8H3wEm3Z?>cCUG$JFl#0$FpIN1ixNBjO%`O0{;zNPN53;*^i#?~ zu@>mb=g(V#^Jk=;%5XSbV?u?ahM21z5@<(^3z$xkE_lH+21UBAIdFDXC&pEn#yedM zq*{-0G2Ch%bu(|&<4CY9##JR^(Ph@*{DEm4^0-S@TxzV#7dP^EGu_x&S2v6?D2aZL zfGLL>zs9*znERFX&7<}?(uY&!7Eu}WuI!474UnJ!hU%K6jU$iZV&>obtGR&JP2FFJ z8cEyDs7=XQa^(4|teBOU%`PLmZ`8Mp8M8CgS8%bOlNR+XgHrsvYZTKuEfep8XMt=g+dZlmVntF}?A`=3 zHm9&l(`~76lD*09oZ+UpJT#sitWqa)+z0J ztAbt0_!Qj-%g^TILp(=I^}>6GKb<%Bmv%K{$ZM%(T~Dx_QYZ7Aypy9|6IL4+%DOH& zfTT4mN~22^K-D$$^8&RPEv)Ez7Uv3oR&*^#u%MD_u&~RhQW;N35j!`ko>8o-t3pU) zn>-5EAjhV%PO@XdnU)=ovFn?XqIjqF4@|?pGGlhoq-uOXSj^k0Iv-%M)m?Qkatex^ zxLkdOQfjzH*@}wZ@qe>EuH?<)U1@hN!)qJJ-uToPqf;Vnx?$^A$a|erYO6IL%{J*~ zJ&g~1!rH{=@XS%){zv6&x^ltfMQU*m#T~wiszzOExkjTi@78jyfS6eNm}?czAKrZ2 zwHHs-Yx6dJW2kQ!M{B!cm~1&)*Y&*Hx)TT8wiWWOAIu1~9X_mF)u9YMu%2rd(zU4X zdfsWo^Z8~5yl#m zn!3`2Mm~+d6x}p?rPo7zTUqy zfLFsBRdML*%c(V*EO+?;$c)z%VT6rJw?qZ?qLca$kOv(4@ z17c?9D{y7Ln9ccO4p}k9%*7ci>`WlNOm;J4>~3T1kgwa)TDpqD^ybT!E`UiHms*0s zX!|Ql46GwuOiHxfr+O&mMb{fR=KpD*+Jp|g=wh~qqgp{O`4rn24$8`5CLg^W7JVq< z&~W}>T%8d)QHa=Vy~>G*zC!I^VS>s?iFUUV;?J1rd{hkgWi!U<_GgpgjP_?^Y>0{8 zDMZXRGd0Gtu!yV)W(`}EcIQN_ zwjO>j744;OKILE6n}qr70=b@cCsF6p(KV>@XFPt{B;-0K-u-sFsb+>&eG^jRy+_9L zOs$xB;A>dLSTVA9v(TBTO2@ICeInQ}_8?m0@l{MAN37QTUBq2I;=J{6H8HxfFqW2eLyv8zQ%$0W(Bfow ze8erQxG(ziadfI(bT#VQ!xiphj-eA-n~oTDQ{1TqkTx^b?I-Q-4_x2=4@ldQzW&S= z*V-Pg|IaCFbn5Nu$4)#z&!YjP6n&(uTOry{%Fim;q%2KImE0rgN}93L>?iYo!s9v{lPMzq& zf^XnRd!mcbrj+P%w4^>9?$jU0KZhJBZoE6rHQmp#{ToK-Q0^D}^_oG^USAG=Veq0a z4uW8mPf0a^=oZDalmvTpQ&MAhe0)|Ofrvniuhs*8}LVsg)?1mIs6OzGP5x`tfeNiUDbk}>Wnl6 zX|w0u>#6x17jxe=b6RvGY+p~zaqY(^OXspRmT`Wrt2kfBWg*Qv5?jN+ec!CWy~CGT zyomm--B9$mYH>fyRmS=%abg>Ims&^N7r3rs(kSw>TXFcvhCZ%KYrk@}#W3!%9zFZ` zVpjqi(^3a_C#rwcHQcC|6TLw2$@&(#(MjZ5;i`%>R`-6D?Rptc-ClJMZWcUfLLuCP z`!C+#y;g@8%_r{J1Yq~^=+n`@J~sBQbk$;Y6VFB`QqCLhtoUs~%)v6ZrTEM@K_}O0 z&XcK2qsuwQ4yR`4qQ8qcZ*h-zSM+OC{%v<7pX~W&4X5L&HLhy;#CXoz?qa@?VPJ|( zWvbtxSY1@eSo)1?0;?E^^9-eD^Fo7(Q|B0_zf#}2y4aXOIBNYjv`NlKzhob6u3QbE z&50iF$Na3H+|#`|4{<^Rh~wSjVmj)ei--C+oC;>R>04aP8#1Vp;U~yP?lM$=Cbbq@m+&7{VSurMwtqx`dTN014SR%FmD>~MAeut}FC`9wJJuapvk02r0 znZkQ8=<5`JekAR6)wMSe1tet@wF>eT9iK=1vI2qyGK&fRDmh;o)~MB%Jl?a{^&0Ez zjdAcbyZ3unIofu>^{8+93na66Fqq7Y2k(o{PPFHs>+QV6-haqdRybnZJ>-f8YY_(K zczf-|$!2_Wn4K3l>3obg@;~Ca6lQReXIK@nyOe@>?xo}A zcmydP#%&KE!*^8q5FaT)JXhrxS2^s@#z@ZHkcjPMXAfiQX&1B=vH8w$GrW|a&bTUJ zn;HG9t0NM=`zznbHPfA~>G-d%xBZ^64lxOfvx=4JOwwL3+MRVxWP^6oM0a7_iCy4j zulvjOp)ulu>x*EA=fNBtol?do2}#M$F*NdT*GQw%H1}-3T#UPaKrRuIj{ zQuhFga7c0gAu*%#5z|*CYVVL3F}p8=@T3!=yuX&M$R|4^us5@bIeMkLtZ$9AaiyD+ z^VFwK|I7k%cBguW;HR(Y*KW5@n*I}IDLN94KDQf{`Z)6~YD@UZXkA(mHp|b~R-wL%!8SEWvarjd;51IethOZWHv$8)Aza` z@iFrMnQr-6+WUZw!}b!=I00g#PK^9)M6S68r7X_Lg))+i-}TE# zlc3rBQyFP84o{oUaCQ*rP&sKMUUi%41Y*j>UCzpMr93>HamV92-J9u*!ucw^kEc+R z3Q|ckL){o&L8=&1$F}$iO^LRT3RA#GzTXgqzTY@{_5H?)3l8J=&2hSos4A!uN*J}& zxgK@u_=vQTUB0E%V2(hIrawAM3e>5lbhMx8wK5#;7RIt6Q{KCjh4u}p*Pe4W@z@I{ zK_`X8~pf*X}^yE@E$0*56=Nvn}AZjpI)=qprjbXbKEY z)rGs|BRIz7{!jazbiQirs0Zh<$hqDr=etIR7ZQq{e~YJ`{n%SB$aUpXK3ov(pP2| zA3(so*wd%aNKfH6cVQp*th5Hd{od=T)N?lX{7bj>l-@$>{Xh0q52g39kI1FMj}K=T zY1HozXDxd3dCBL`8k$|XFW~WE?yTv()>0DII3rq1+0d+f?j@=IKRcH`;5a#);)Iw_ zK*HKDOSjm*??3VqjXU@y9i&E%5hMO%C(#5a(aTY8WG5+9fPQN1tJ0h3K|Fp!mtK`h z{0Ban>ATm^=zrmnIo{$UYyt9kWTqW&Nz4p46leKI8&nhX=sl_ElYa`nuS@Oj}s!&_+8mi zN*Tmg%W#QY?cuec>=5;bh(p#P{xs$(`Hc0D-&69$p;DKB_K!?|AQ}3i<1lGJ1*_`5 zsb=Wt0LuDekC?GW0bWFD)(D=PYor8sPRz^kT-rTST7jd1{-Y!~IW`uJlGd_?O`tR5 zW5%L%DX%kQ$Fbqm&85x;>s%biXA*cWRwzD0TAH8DGkJ$!FivGi;~@Kuo)e`WY$o>m z_#8_mCrR+uNpSQzUpVviWGPi}p5a0kimfY$(f-e4>KdJ=NWj!TL!V5QrZIWgv2RQZ zdV895OgJ-fvZNbrr%TJjAfmi6k~RpTUxf%U49Z`lE{mk*kXGL;lKLX3^Odw*w&hZcZ;?U$7f3Uc zEw>k;sj=8cgt`_p)Sse}vCsoW1ePG)h0+B_#t7OpKU|9{R0BGnT>JXu{O}jq0%@@X z&mwE+t0idoYGdybsi+Wc7DZ`M!t_v>+J(`nMd6Rq=gXulD!(+mtP)n0mZFg%+XuTD(k;?2sO_ zQqjI0kj()v8ESDrCR5Bzrr4QG-Xg(Jc?4x|k*XkzYg?o&_Bd^;G@gZzY?Gb{<4vGG zE77WfG-IVywX{X2Ovy(i1~7_yM+clAc(Z_u#&vB&>G3c{M&=h*)W*O^wvA(2Nt3?`$&_I@u5Q)NAZKA)Q9=GS~`?G)LQnB6R$eG!1kG zIK^!rF2(wptSa`Z+{C3wKP^?Fv+WXG;$=(ycP>d#gflu_hB$;& zu6u>g^KGt3@oZ`TK`vNi6y@Yfhj2r^>Z)|!r_ys~7AlJ~wDVuGN?)Lre@KBop&YjA zVGdV4bim=%wLdV>8kpOp5U1D9V9{)zfi*?{t5{?Hb!kH=hW1;3p>J2wgukR@47pW* zNyYGV^e^cmIP&}3(&qu{x`JJyOT0n?D)jmtshjPjDxgB!=9n!K?(yA<73lY*ox%>| z^gT>CAggj8%$Q*`xi9I0kg@7@`4cu`j|*}!P*HHmY;&0CkTC&fQ}+;A^Lf~^8+dGP zLCv;eX+?-!PgrPN3z0E!7E)xGJOnLE50h04s<~nERKW%+2hbM07@F8&%>U8P^m2p@ zhfv1g2>Bg0Dd$GXs$z=;0jeA8zh)(Grwy-1#Z#4Nd6<1d&DT3q&9}zxXt|rUZ)bQF zY{wotO#p`B$r!m5RW2RT(}<3f|7P%fQIb60eQFrklUX$Yfeea*%(!(QZIR?1!bD@N zEH@I20ev;MK<@GpAJ9TwmS~bD&u};j89&9yl?7vBKMnS3PnL=3O)Z9KU1*I*Zj9la z^G)ar)H+^HfeQ6AccO*}MT9Z;>&L2(bmc`5~oT-xsr{&PGYJ=IcrQ3?JpwN7B5(=d44U6 zJnzr1dbpVtRoolZe!{}&MwFZ^vvXauM7p~-s;Zr&f3n=padbGGREJd}F$IjVYhp1O zH{B`nAvCj7ak;0ZOpM14+6PIfBHj&@gKLs62tK>iRd1dzazbK5ji|CaUfC z)ntfX_=cXs6dEZ#LTgJYHRZb)mPKmG)$t}JN@IhyTP?XM8?4_v1_!(sNO&AW%?uiF z1^|Se_Y7+dWZwF385L~4_*b#?^5gOaly>)OB&$b<+H%#R%a{%=be)fcbxw_8PF#<0 z&2=FK58i!YfQvU))Rr3x5WRoZk?Vu89;*x9-$5_dl`F8NbhGP`9-3NLei9kyuvg3J zPF=YwHntV(VZ>~MM?JYsF|HeHW?wYU)Zm4lb(xTTVXhsl1_>!~)V8i%5`6JTJ-INW zR-Bh-R>sRSYwKm18GXF+M?#`6x3o|@w@8-Ttq^GSi%-fGkWHN@ ztI^3u@b2RM3+lCp#?s z8m&;)UHMwW9O_v9(a z%SMNKjHlm_{|rH)_20oT7fu>oI)hwXWDE^Wq~V?6e0lAA@@TA#8h4RT3FnP+UFA1f z?Z$NjC#<5I-7uNJ717+#c*Uv-8^Wl9_XzNsjfUOjFgAjo?ZHRTn?2;MI$!d@Ae32M zA#Dz@osY1_p+fQ0?tQt4Zg~{(37AV;II9|C-3FR|Z9XQ>OjC*qaAaOU7JeV*z4CmBvWrpq1G>-e`r$ru*E|)-<4N7}PyP?C z+w;{T(2=<>i+oSX3jyZYqAaJP$yE z-FR!9JdYhah~wp%I4xZ^9*;cGsrv-^6|C`hO_1mNmiNZ=iSi}P)s&nOag5%YggmU@ zXD0LC%@1jHBV({Hfgl}CIaB0#$Cz={|Lp{Yh4rV(Ww5aCJXKDFd($ctV-g~!o?tw8 zld`5lq3tFkKmwMPSW*5tmRcp55xl)NWnaCpZN|| zW5!hM!DX3=wm;x0mH1^qWr8Y(k|}v>OkJurO>P=-_aOUl2yvs&%xN;Sd2OaC8ts@S zC*gRV`5JHxPp4B;AY#W-cU38o@ZhYehpH4$d|0Dt?3S1cba)096_)|8EVw6TVrupM zEJCkm2EHmn3;DB=oe8-q95w1)&_scLn=M~PHzRTeU7p2$8%O5Iic=VCTv{qO3PnvH zSp^ZXhE}YSCqS{Q@z*k(Gtur;Zq1STwH(EkI13Cp4YB1`GZAGpTFqmP=4;SY-}Y|r z53CD{datt(+q-^i<;U~ATz#0oH1@BRw}+$DDcLA>AyxTS{+x-_WgQ)@DCRrNldwjA z-SNC)pE587^z}coZ(%a~9TvAIjUC^~)7X;p?Jc0oQJS(v?v5EQW~=PgY%buYyXSsl z^@@ar@M~M;GMa6X%&muS`rh%bT)kDUNJUGaQ}1q-J6Uryb|~g(#@U%3>qv2=Mx+3l zH-#bVkJ-j&wjh4<3^lGSB5ctjzA0RF9p7jnLB#b>Dqie(b>&;B_DJ z2j;xsYPUT9Pt~S3Z^&)@B&vP!Vbxvmr(7Zk8lp43d<$!&&;F7{VGoV?ORk&e^$WN0 zy6-Jnq#?KQXX-6%?gJq@I#cVvkm3`(#M*V}Z8;_0h9q#}xH_bt7XS~A`fQMzpaw|~ z2Q{E7cjQLK<+~VD8D&e)&S+Gsdd6SHYSB-E@(3BT<7-p1`*Kpo#^Of}{8%hdy`Qv$ zH24mPdy=y6$Wua4TEULq3OW4=SB3w} zgeOA^Oen0NI#J4#D6)T)^1Z*vDsQ96UeQV_5*!cZ2~xw9Bzni8O!%i%D+)*u#%pe5 zi&{;#hD{w6vjf4UQ86#ltr(>t*1;WR4QEuVXr-dTOM`Jw(H;#UQC50FxXjfx2J^L3 z*FNwq?VpFob%%FSu#vQjbh+R7Jy4`e$Qf%21kHSq9Lf`th1d z9oNG8?jL5+3J;q_3po`N`~qUifdlR}6E&qNj`kt$8<>)QzNWMk));p+Wd@t+?rs!{ zBG~9r9&K!!*a}{!che~*0c?Y||1gGX$1By`*5V)j0aIMeV@pU+%pil}QG7NXiC0*$ zcjA>x2+k)c#Sz37R?1+#SfjAAf>rHeqLPRpvWQX|u~mvFIYOjqS(p+^R}wI5RZ3PO zkfKI1|E^OqasgKkPC=8`&<`of>PKzC7V2Fu*k0PbTXUF{tL(kSLR?SnQrn6v zh3nfna-5ahJVAu-E50)5e})y~cQ?gxRz~tjwv^xyA2mxTZ-KCxC6xYH9Q|HK!QyCM zostUcth%L?I>6HDT}tUz!JeysILq=Z>OFK0q3l_SeVld?Q+W|i6mjoq#UoTSuL`hWyL-_j z_1(*Xq|OsdPd=kmL(h48ge#FeCpaB6#y_KU3OEb0zu8=1P7jTxT1}J;qg2QEu}~4N zu7umC=D36m^X~eM)oeSvMLHCJiB;FP>SEVOyUZBt8tIsom|Y`9tT!KwS+$fT!7*rr z@l_qAc!=?C1qFv~1-PBe@-^*VMddDI&fArhz99UVDxCfW2K%ch!-W0DD^-NO0n7dkaW2xo8v z+Qgc;gs7)tWsSZ?#q=2hL36-j4l@T6a{ij5OZtsC?`IuCP{` zDz=FoMRnUNq;F$+;xu?RvqAUP_U2f&=$G0nr}6#14w$QV8B1P^g^TG%uPC20t+>%0 zW4l8eZepj{GnCp+dE4mpw(>&=ps#AYr&MrE8bOUeh%IUieNTxB!GT2gk7GO2-EK++ zY^D}+sNmkB zG3@!b5Qn2*IAynXDib$}{fxK|m69PT|8y!(&EAOrh0-(ih*Wd)o@~y@MX_IJhL|bX zobga_jiKCL%467Avy}ntraMiDNu*A_z;)JQfgLC~7Nqmt^FvM)hJLE-#hm`qXAs50 zI^*Tu%5#wcBg1!WoO#kdHvVp)vI+yE*C1u5aKUIeSowwR$x07Zb|bhsR3QYThbco4 zXv3A=qJ8|f=`S{L4;g<9$6PDgj{P#tSSm46c@Nv5aU+#CB2k}P^Y-Qs>ds&mck)m&Cbk0k?S-aUkdI! zZQNT5VJiG(^k1&jhyeSnS);th!Xnwqm!ZNfBl~;hsG~UF3OgU(N5;l&%J5J=`Zk2U z#KQZv;cx0B-QTUegq`+Fdz4xNi+;e3$;XchP`wPgcX1qtUgvtxN5;AX%D@oxX#K;A zyPUl*=M(w(`yibUU9FG_q&AC3TJ9k=ns8XDXuF5}>9FE+4;lKSlE*#d#I()G%|BoB zNqi=c%;O$%p&iL5apS!oF>OPD4LO3PR{)cQ+H=f#&Lp9j8OHpi;5sdv?*FX#Z)flG z?0{m?9~JOT>Um;m&S|BX@y0O-BjGz*bzC_M$vO3eG7AOQJE?@`DL4`*4y7H(d8RcTdFHmiNvv_Fe%{1dvJ zL7JI?B~bIk(t>kJD@^FZdA1ZY63>GO`LjqLR1guYSfl#|oQ{F_d;bPunnMeILmnq+ z|8K0XsOLrH4RqO07ZnHdQVvg>eusMmhkLKm@ZXiqXuRL)-T|tYtHk*{@7Xn8G$f!B zI21KK??HV60%#T0yUHirBUiB%T1CVEP?(#~1Ai##W}ykx=b91-+vL-oNXuaojp3apEdSFBj$wVTRgtg+K?L0qje?%Yz| zX4}8lZ)3*?)rs3mUBr6sfJ0fLyUODTe!8ptgkaS@1zyq(*WXGDoYYNt)ji&AmwjX? zYrnZ2nNZ1%6Fj4i;GP^JoHdSwy0->H8DvgmiMJDnGT21?!GbbaYQ17m1`%oI1H&?C z>(2qlbzVCMpcwoFvlxzFFfq=Jt9J{%Al>@ZL@(%&%3hHly`Z+_J{Ps!CAAs6^w*w6)CgG}qK&+Pn}&8nG^6_X#dAox84 zEwGFBgBI8^HfX`COu2*O6+BnR9gJ7-MW$JA;1$$HB92rrn7Tjb?nuqMM90#YBGFG# zN;0R44P20ngnN=(0j@eP*~ zdbQbwyvJtoid%GIFa=ht|KHG(!4&jzM69;R1!5kgZWZ1BrM;RWdTnAd!~*&TZ_$1R zSl}2uimtvFy&@vZ;*w>R+%x|L5lx(eZRST7PQj(1b~Bs;tKG(XRo%fj1wP&bazRPo z9)wxT+YGXgK@LOxnpR}EZ0}&uL>>Qnbl%4JI2@9Z@U5Fu${pT0G1<=Dg>%T8qMEzbF2nfgm*G_b#Xt+=p%G@GehKH zqS){QZ#4_%cxE!6x9$1q1IU3uW`x~MvX4I8Al#-8KnUuyIskrPhmR=CBHk9S03IkC zk!4ZH2S31s?2Ik0?|ed*TZFH+#@#m`xgTfq)r08-7=i(U&*YdH>suAFdYIL~5@?L4 ziW^bA+^<^T11UZ>Vh{xMRUdbZujUMUz{-hX57f*fZ+UMA5r&a7SaPzMV9Ck8${!Q_ z6+<8hPQx1Iled5%Xy<1`KM=ur!C5hWs7c*`rrX4?GcV8`JmN&!_G&c!zaDWEj-cRubMOnpbV!+qD9|AsFa zP{ENP^2Z~_?yn%e1W-Z1xaDvK|0S6oz@tDdC=p=|TZUawn(B{r&w<} z_)NkA&|m;1WxC^9_$~#omd!M05{vIR{6J9WFjRx!?qaA0!S$+6sUJIQ*u^r818DsI zK8v%DALt;s>sU!Phclo9Tf8u&0|?$qv)!9fX9jT)vD%U-?|jWyzzpNy0g@LW2k;QW zu_A1EgS0GG4FmMf18)%Agh0|VcmrajH9*>{jHjTOX;9BcLLeJ(i40H!zeHw+^ESxG3XF$jZp z5tb~ofDD3Hz08W;uIQdE?nLU-*BNU}SnXcxH_;17S2pZbcEe`jT#aLvuEtQ%c( z2UuAXtgK%(YTR%F(#Fz+>BYTe6kWo@_O44-XnUK1z*4RCX@KZK)q#3)oWsjB3M*`YiqwVxo z9I`g=98-kmMyPN2Y^QB1UZ2b=l$W-f`F8a}0k+cxFxe(E3j=10dtvdLcBm zYs`&=8)8c|xEracWVtCcwJdaet&Stw&5Hfx=vBF}%xtKZcnC zM12rb4(}ddW8HuTOX_?1`96pDIXASP2$x}sdKdCznp@qN`tX}3+eWAVC}yK$OPNSh z$^;qd+}G3z4oDFHm6Q2k8R_)&s4LkpFO#5VAvlnr&Z=r#M*9qY!(yS0j3-MiCI4?@ zZeg{D1Fot)Nh%>&nxqbt(?;U16X)^eJA2P8VV##|G)h*>G3oq%s`>wb{ zhd?W{e^Ip^o=z53pGWXWF&82K{{x=5G?qs?5k^YFV|Suz+@!Ro_5Rr5x;o7Z_>f)Gd*5)~HAN zG^XhK!lNp?I(xjDI#ifXo2#i^5LB(MK8GN!y7~*|uh(j*44VDR8tMXETNq6rQ(J}N zhCIE2TGH5A7hHu7=;XzqhoSuw>Oln3lj>FkN1s&F*q~{kmWtZ606h;`b&S?GP|L?K z*74qDakzzGIWfKRQ12x(#<<=|8 zN-qQFvq~5BPF=_<3JvU5EOVOB3hi2BXsy+%tdPbpsbx_}&zIE9HrAfY>uWA=kbfr@ zX*bc5_b%vuS!A$cpjKyV_i2F+bgN7|sJP|1V-m z?4Y&@?nd*HbG@${2X;_DVBL7DqgvZ%sB2f`&>~L%JQcBGjZU3ZoQ^IuUVl~nj)kRP zSMNllUy65AuYt8a-PPx0YYhPwD{fJjI=uy9@pqgOOUDc?lIC|;dn0wp9_oi|0QFFr z-eq@b7tW{~tLPx7=Gyl)0m&0vceDicuzG1~X?vZ#=i``CR6i?JqB&`hzXRy+GenIA z&*?cxeHG*JVNe`0tokjJA_aQ?p!jZ4?da45bp?h-kOvUj z*d1?%kh;RUkB@VD)3$(~5LdHV=vyM?iKTlzq7p5W3nk z>QN(o3R`=eqwOC>Jx2Yesmxd<_2Z~o5xG2%^VI3%r~yWY=~!kVRYb3-^0Z_IPv!Ry zl8RwkfNPLT-?3U)u0e*5%HtYj!Dmrn0+stxJ%$pwe~{s$Z2uq?`bKqnT7{jvE zFChVK{~;>9v_KsI#()!%t{8XEEL4{xxVKPca2xO+q8PMDh3^*bL_{~9S*$+efD+V% zrRucK=}bsDQ&e2kr*tkF{#0xsIACOY(&1jSNp>$d^2IP`Bf-s1!P;#z=aay%%$OZC zb(zY%?^qX17Edf!|FWTgz3UlW;7ep5?@W6tWWGceaf(^=gDPgI+feuBCl`3;6(r6V16?Z6-Y83uj#j)*LN;6dWNHO3~9en>iJk&13973HaVBBYzC6 zi@od3GORSrSw~Pkyqj1(0bzQb*Eh(iNKis>Xr50W5VI>^fyeU2T*?=7*NO>nDl#%K z5npgkHDg%sunuHA;R77EJ8=JQYzHsU_1)@ISf$q9qlOEP+aoFWc~^UywHN#az1w|| z^4z^hA7P6D&my>FIB#^>FGULEJgBm}TOSq=H9x3^hnqLQ6AwbNS?|P|aq$JetIDG# z>$3QB2RGVbrUmN{t2H4KZXCwibPbjMQSI(uU%;QLZ+*dj8{#3gJ43@yJIrOc85qlc zRO^R0ErrZIg5bzVeNH3!XLU&4{pC&SJ|;fiD1KaRFVMhdN;Ajp5vCF`_LfYEmgIl=Q#|^bes#SNWg#*Ol z2pe;@klw_frWs3aV8@9}uiaD|3uWxL7mcF;tV8E93 z=355X(oUd{Z}Z;eCz$6?vG1%C%+hzzq9E{;gu7}doFV}{r6B~4jhm7L)vkRS^a5aC%A0;Huvtu5;QUW!6#ks7Vj~8LzM~Sj0l#!XTGF zo%a=0Z9lbJnmLO{d+lFO@U|a{7g_W{~ zbV@$6FjE@)?9cy&(Ri7MTYmYC4@Oh+*chGOir0KrW}`it&&urGaWVhK3_LVJdjX2* z+yJ~=g61;-pOm0618{BVDa>35p4;WO-s_M#oB`@ zE+rP57Hjze-+uwhIo$2v@f0mG;tOlZ3*UYv9CyIUaQi20rkrHWLrE!`;;~2CnG0;B z{RuU?-xzmsr-0)Lc`%Du?ip}3&&tZfvF#$AO4f9GCRI}^+L@eZNxZeZvoG;H%zlK= zOBQ>hkay8#9&KDNs?`grYdN8M_@}*fFLBwj(7BQv5uR*~Umg zKUC1#2&;`s6*Y&0{-~lcu*C9JwS*$}YbWcz4bLElwrux#ZwYjuxu>U9o5XLPKiNzC%_Y9q0PL3OnWf_jO0 z6pt zMK;$qpfuQOH)p@!pwC)hUa%sHx74=t)|8uzW-O& z)kbn_jRb1@D%_Gj-Ns}@hDGA%wf;u$*EN6zo;Pw|!E8!jzl5ZP+nXKeq_rQ0JVU>? z$J`$L(czc*M}&{|(e=jQh?Kq|C1_YXeEs{Y_!^z_;IHR*FuyLB650Tigb{UR$COc& z{ZU98%6UtB%xChyo{bG}b?>2DjIXhEeOs$ev%7>2!dJ!K)aE@fA&kF$31dF~r-Wrb z(CQ#Z1{@$vHkNeNJPZoq$~#=ma{u{|5wPbU+gXF|v@iB}46C|bh8q8uG$elg9XyYH)JWhuar9)Y*xrKT6 zF4}~Lr?#k8?friuMz#8(1JN??hyKb%a4GF9WNhpWlX43AL|Y^DH#U5ttq_FK)ZK!?l|b;T8900Mrz*WQh2aT4>Y&qov>C?FF);t9 z))gb3q@$`_I~1mM5!Cf)d=fQ39u`U|YdxVP4$yYtH00O-ZFs6R|9X$z4G?!YX$bWW zyw75wJoUL&5zEnMhd_jGqm4sg9dCgVwjBzf!n1$@(iqm>%z>JPyf>T14AzpU-Y~7S zKR)Gn=xf4GN*{~`6-VxSfyxfy-*foB)L|Nf@3S&tiK*~#9tA)^JE`&GaBX-9Dw7AT zFM148V)xM^UHgGSr;N$aDnyLD&FXJGEb>1vv_6)Aax=8>Qdax_>3WZvkBxED&Gnk* z7%+}HjtsBh2)^rcq(QS_bxb>Uw}-F@t(>6M#|i0;3EFnYv9TGQeo(00;J7F{Hc?}S zmx-h?3(Z~xX?n~!NLokS-x!Zh)}Cie(4kYb^#~eH)zT1bnW~k8RQY2ndH_4GH>Ybg z96|<7&(uz$8~e`Gs-t68&D6ReC^kz=r)im53~ii+Pu_`FkWyx@1~5|+P6N1 zkIe(Nvf0vjeU3JVsU${cY40HDnWfe8rO7%48R|Mh>$5mC;E!2a`4G!sE79p)X})C_ zAKv>ykD|EBDa>y+_zT>iEH^4H(ps{cjsA?RUQ^(F6T)e7$|%ngtI|F9D2v|j@V8omTLuG zjHUZ%RAdF_)R#?zIe>B5bQn6QAnN=Vu}0lh7|UR}GKN;X<8&s7V&a@|!{&$nk^R5D z15FOH)=1a;bAGa(&ICOj3VK>;KG9bO#=<(|vVpOHv9e6i6X^9d+9>?)zg{a$v1_%S z_&s2))*itrGpN6gKg}?Mzt?F4%;Y27rcG$D!LO0BLE9Qqcmv~6XA(FK6vwt;5~>=6 z5O66lCN*12WN-pT{cPZcoyZl%;`>5YQoO^k3(8(Z6!|`#=ybM zpST2a1>kI@|DdT(^DF1V5Fv_|^$T~?hz-C4-~WSlAN{ibu+}xiSoO1p8Rga_UBuy& z_81dz-iCroOREcs)bD4lddB?J&2;9N#&FOrc)qdQVm`+n!@D~s5QHx;f}XHnFOO9F zOA4>jyC*dZz0Zft=Lh#2gjA^qVtlA}fv|cVe$gyUJnMBJT3%U}uNnmVx8wx2JRCW& zDBVAy`Oy1PPGTv_i}6*!s^8V-@vqX1GrWGnV+p0GKm@&d*qjhx^2^ukb!tH_S?lCfKA7s7d5?MLwheDlcL%u5GgKT zp>3PZs%zgO$vCkvW2{?3NBtBrwvhJ-Pj#M7YI->{+kq%8UDxY|+SkWk_#NfR_(zk!z2E~1Y{u(OCh7(vS<{bj5{zDm*=DER&)otZITVu9a``R**#3R8XN zm#lWy{OHXSYdo5w*Ni|hT}tUQ5X6?&U$0;*{p?~n*w-jn!Mbhr9^l%=z@n19-A>a> z>oa{GcS3NeyvXc5t9Mzi>+-6&R7ci}wJc(j^+I>c_z1$?BNPgWo9A<)S+rq>k%!C}prz;~@Wt83^_~b`sjas% zpUN92YU|L~1ms^G{RK4O*}D3l0V_Y~4#jZ#<#PHl-J$mN^f-2!+@-$WGdN`wPkGmu z@?L$Uv{(jU0@qnxz%pMfV70VaCQmHYdO|NEGE*hQR_DYm~aJzg{KC9dr6}&J0G(0KFQsoPT1V z{vAFJAEX~h+U^sM@U~(74o|^38;UgZDi^Voe}9xp57wF8fA_(9B7#wab!J+>eX#y= zXBs~RTHr%Gf52{3uMLU}9il%Kg1K7=Et)s^1k^0AM*A$QkVm}GpXER}p$rJe#FjmpiC6qmp^ObE+jXXH1ImUD$9kOVe5zD^O~{c_pr~78maU3mXZI# z)y}`TC@TAK;`uL%7Ni?Bmh0>M=KNvM^UU1GDz@DQ;VnYd*XU{qYe(=8Jk(>2e)K;9 zGfa5!l@`a#%BY)ChOVsBDPT>sWW7Ecl!ZQ-o8I1_YY-CsHs}m-ecJ}e-Bom9gU%4w zD}ST6^&_r_r^r45goPY#TIOujyW=BRthlM{Caeip8w)q-EdkSO{JlkA$Ryc z-kcp+!W^OKoqT;#VyEs7&_dnB$OWERdcb6Z7P~kbytNC7v_m0l)jsPx^Oot z=wI5{pKjXEKQ+apH&3kb*B-q!n>QZ}ah|>(>!;v7N+1e3HYz$jcR*+R7`{;{0OH)A zg>N_Ihd6IV=|A{Oc*suaS+eqx=6RZy$kls#MozdN0ip1S9RS?5>fPve! zE4}5iL8Ux+Gj;X|uM68u{gX&*epG)CG8E&jv~YCZ*`vC{UZQeLx=Y7QPUo0(BTw)L z-+UF}y>y(%Sd00)R$_)pSMHekU?%>DF~OJg+edQ)BVn8IN{-%v;oq-2#aMz4pTaUQ z+vxs_zL)`UWOw&E#`>49>uec^C950%XjU-#CvI6c|-5>Pcbj zSRhwtIMHTce4UG_0!(!5nqG}+{Gq=@3rBcjXv!aYb@SKpKlB&PUv;nPUeqM*n(lU5 zbJDE{0lWXJIEGns4HArJGu2Ez@Ved-mR>(z*S|6&(r?&V9=M^`Hsca*+P_}Csn-mc z>2UK$^KN3%w4HvwsXt|=uK1_k5y~H9{?uW?zs6W|OK%}O;+q|xDBUVH#9NvvsGSPx zG4?{>FLs$PsLpNF4GQeHF%-8`kvsak2!`FkUTUtf=Z-!v63zT5)Kk@7&0viMT%vO< z*KNkSP)}$W_JfDOov)9vNIpLN>5->`K{Q=Oi&q{VpP_JSUb@uY(; z-^X~ExB7~)o=Q+rZXfIU4&N7z^PEEvEqdOv)QTuM%#%VSdYYs@oSR@#vckLNDS?_u zo^pwwv&A0jJoFOk?2Sw*#J1J9F0uxkp$y5x);V8Gp4t&-7^k|f8GlKr75Zr3nyr&;iuJso7G{NKO!XAJ~tf6H^JWRSCD1xSB8IB|m z9ObN`h-6P?1T~ZS%QnfL@^~6-KFv$^bSYu&!r&Ove^}@U_|3fyQ>_%wJ>*&=)dN|V zMW}*8vx<6_o8`LconoFC6#h{$PjS4SQp|HuSZ#DG?hzb#>`~J5Jc92_dS+qM{&p#k zlf~|+=qW;D%XsD@-17OnKH9R;*UqDaR^1K(Zn01G14Sik9GfG^*ANb!C zCn8%u=9v^>My{pwIvzKLKkjMhi^;9ydDZv8U+;Y!Sq6R3s`f)aNUr1Q9QZ*S-$Q|! ztHyx3o>d`OsMUPJGZJn1{t3?-VLkO|;HgL7Jn5-r|E|%%{{5VZQ`kk;N2#k zUf3@G+Qd@<{GvSP$;6rK%I7>E|9`x_37iwv5;vO8%&^T2lgY58yEB>00Lo7Gg*`w} zRzXEYQOGJF$l|WZu&Jmh!&<1Qs3^#ypkP1&LD37YsHlLbsHmW*pj<^o`Tlh}oe2T& zz3+YR_l93MU3Kbgb*k#rS^Bh8kv=7cs|1VmS%0VqGpKdPgqBm^3oPFwL*F1vz$k5{ zaTi)Hz~S!^QA;Hq;AdQV7PZ`n?Ud3XmJl7f$kJVluA+VyTLzvMJrPndV~FKC5S$od z`IEO`ZnspBV~C|bSubV1NcFkYazK)nrCJZQ)Z?#~We8GNTyDv)r)53ueK~ko}))vc1zMa>NXk@fH%EHLt8e|)@v-U7U?%XidF5|V=U)` z(R;>Ng4JR@x~Q-))CiNutXhNf&a=q}l5{qxT;S?TK_ zNj=j`sfA-LIET25EaNO+Wpk98j|bb9(U|e5@-q5+JbLt_@s@M7=QNM6pabJ9YId?z z!-!BEfySLTuJxdYFPy^a2w2#md;LzNfsBfh0rMU+$75- zTK_eo^4l#VAc*MX@7b9gJ;kyEleX2x_zqU?lyODCsn5J zhkWE$#PIFUX{5OJ`Q&j%;sR%KPP5eBGAX|P@c6$uuJ*$q;>PEvMJ`4p7>@**&qatk zo>z*vJj6*GEf>)b(;%7C=+|kMOWWL;E>zqtxm{#jCsPxV_zi*NjD>Q4_EAyS`qKpt z8O|H=VH5gpx}~hmY2ToDM8r#{XY{C^NXzK{kBdsE{|t-RRh_V-tc-2~pe4b_Q9_#p z!@j47XTb2^kvcZRg8BCwDd(M*TMN(=tM0XI#;XXUXIaJqyJwc=sk+irR6XA^TzV?? z`FzW2CcbZ>1t0y%xYbivC_|+Dc`ui>kh1;O5Ph`FVm*uVn(ZBb{-h=Ce`lQMLoFo} zGWw$0+?HCjl3G(O&41b`Fg-1DV&9goc-q2W#d+;%%QX0L=dZA&q-6_NT6}1rf2E}l zf~hMlJ&TudFPYN+(|ao|-W*ifD$67ZM}}5eS|E5~l_lBuRnfD2q+ff&>XPYIa;}C) zvx2T(ZE067#+~^AEYtAbn8{u=ud2jeGT&YT$`!PBwIzZ&l|5tm6bX(!V^LIXpc4Oc zs(gE4&#!lV*$v0{R?s=mTDr9mr^B$b$pXK0$_~_7$MAa(X$;M|%Gi`1d)A_+_d&$| zdf{3NA7m7V8b4iQX;N3)(M!_cWjHH#+ZszJoE{Xn>%aOeMzWdO^Ye|%{x8lZrXE>q znOR5AR|sU^4Wb&64VHeACf%=Y$d&GUrlV!p)zcMLsL8zonbxr@(2^@R=Bn2kL6W0h zF9>8ty^g+K(voWSHWkM;E**WEp}1!Tmz!fK4ozcZ?M?6Ee)!pfvbH2)HtrWC<(Q2H zf|85>;>BFEK_ZTu#Je~7cf;7zRU;v_BStEgB2(#9KHrBQ4g_}hDc8`h$ zzu)|F--(rg7jCvRPrXtjCnfr2i)Co_{5!af_2C4=^_{_hNjEq3xrB#Be8WtKh`V@K z3S?OZS(hod2&5^46t?yqfozmP3Ko7TkY+|+C~URh;ceU>W6R!&=NA>0bir2AHq^{{g7pJ=(t9e zTJf6Y-h5e@QG1bQPT{s|a0Ama8u*5=ym!1|X@gSNzG2DJOKpG?x(&G0SKhR|hL7yd ze9O`mi=ch(Y{*lruK{H)S+6ISNsYVl+3dG1T|k5j*~^V5G_YE~ik$_orLj?H%Dv1; zg#q~0MWy&APFkmMUposT6Fn%1u&i`8B9==gS}Ta0XD8xLVItp`f~v#WsaSBCYR)XK zRLfc-nmV_zU2zayG`{2j~XRHZgK_y5}^&HwaO6#irzUajLVxRuUkNz3|v+CG~6 zt|i|6G?VbzY;Ho1q8!OV3Pt%tAazBdz%EPXdhXkIS<=^Y*M4J5i1&{*oIAvucJ0cw zn$zcS9Hd-WP4vI=o@GMj6J5ey{cvBpa`f1HSXo{+cO&ZP`617c74NzV8iK$ML$LPZt8mJ8&KUb;uzT90II_a?3tIees9z$^X9!xhk($qZ`UxAo}&^y&qJ373_@_=;jyg9p@&;xr#-*vqSXJTH}o~Pb} z=O46ZX<1aWI$FKI$k_K5=7Nlrbz z&r;8r*#_h{u#e0~?s)xt`+lr8tW34}6w4m}Wo0vU@-xf^jmu|itBOyjjvuf*)Bqp) zsrlZr2d^fMI%2^>A-*^FgQXWHYzKa@5O!T|{?RfRv%NQd#0rk|QtFSNECcYC6`g;~ zQqe+x%g~5Z3`-v33h66uj9H^$Xx1?>abxP7pDnF9hrz#C@CEHVQZN16a#tSwuAaYJ zzQC-g#UB>lU$Oj&;tXw|hmkQojD9V;hg4Y)pybb+LM#5l^lK)4`j_QU)-G}8`iR8`(@ExVeG+5Q3qF@=^qU7s^f?^mG)-46Wsc0%p4p31zd=xk z^lsH7gXLCu-Z5DAAviTyz8S&I7s`DROx;~1BRJ4nx(b0fN4MZ2kyK2N4_pKm?x!gi zLxQH$l8d2>>CNlC7t6eP{hfv?86sjlS};@#CTqbHTCih?-1)y5+-8@^m#{^hbD7*I zb^oQfby))jLlM8aOr9!hr#m69I28+DjE{^Iz`-=lquYndt1*#pbGdvR>T172n1N1L z$T-@+jeZ&?4{4*Hj3}yo$=;s*%&&g$d5R_SU$pj0VIa;L{Od|#X}-Tw6jA3Yd6jNy za4Pr^X8=pHXBlU7m<|jV8J!lSiblxKWgD}C(7~sLCh&)w_GPRhpLN@@Ttx8p*g}?3 z@v)}e8g&ZV{YpLk$dSDvSh4$ACf9GAXoxq-4+_k;Dc7|STWNmk@1(R^ET<6p z#bUV%b|wE|d2Svo04Z#3G4 zm-f~@yFQur{a=elYA)E_PyG7JZ}Z-rx|UtAqd&?Dja()>%;_@#wdV)!rxnZO3UwB< zxb_tFy7g$fekMbFd2M?ZCY85b#r|$?bf`2!XVW(DdsnBm|7*IIvsRgC4UMoDXZm6v+_2Ci}{n)Esbx9 zybZ|vzSVNR)KEJ?k5M_Fw+raeXGC7<;LT?+++~a*jxt|J4?ipH(OE3jyfw9!>a#U+ zeIy+G4Ucs+;T!o}1dg?`RnfZ$??7fW{)>1~%q`T6dtQ)n{^_NZZ-ZQgF^-0Al6m*>)=hF-X?kkeCbbe;*45lBW{VtawM|jPS^vf&v(kR^GfucC{{;&i;`}CTd3;xx8;`l+qI#sSZvKW z8n~LNAhV02D{KalZ8Tk81_w>DkTDJ2gl_&=-sejj zM5n*sNlk(u3wK^b=wTr1{3BGX1d4)RSL(FN6oxiL;YYweF)$oDT1z(`&(J^?Fw^SnI zFr}P!d?i1OZoTcx(p%}kL3xTk$cFa6CTf*-?Zg|r+VghprD7_1 zlRr79;8Yniw^E`5S1L_X*L*AY;NynR9Fh;9Ewc~H6(*rQ3Z_IbQY;{}<*>X9(~#NU z$$#3lV@7(yQ%+A5aU(!@K5r5%r#s`;mfX~F-PSED8zV7{-mKU z4-iQHg6;RmV8N`bm`(P&?F&Ul8s(ddG?=|@Iv6aeaOzW9y=->&si8E3& zewW{q3d9Hb=<`qO_DC)MQ@$Y&uUMK-$&d3aq4o`x|76zNe@)@&97J9(FCWx_R@wXN>ciPDw-{r!pCWgK;?D9@-~(xILoWFm%mBr6 zG_68;A^oDI1&ara&-yYR5;PHxjffBlVs_;Pv|FiE?m_Tmr7{|UsY)3D-dt71yrEmF zl+S@2+6*jOPivYfw`xJN)WGI~YpEw&D0TT*IO1e_{TwBdeolqXRYovdA8)DjY^5{s zer^xg`qus|wu*D>`+s808`Q9s(kkP@>EtIq7vwasmGV^<6Ea_~JS3Qa7XxTOYvnfS zMcUa~iPgSep=Y!FfXF7*tBnE&Vh2qfn3x54bnThj+})pLH8-SJXO`Bgv~20v9qG1i zcPf`6cdJX}?sq90P`RTn1xq+o*R6aH#X!)NoF0Xj8?Nzy?j^d@qqHlym$RJLe^g6W zGLK>}(i{+&3s{(WkBxFP+w>z>NYIsteb+44B7GW$ShfG>mHN9$@+q=$_FUp6_p_|E zbF^8E&snNCYfj4QQ|@PX?XMN$Jg8%(5~7NLf_-(me=n zwP!5E;_ipXxTKuDs?T+#c7ox-d!^CTwX@Q!qKbDk|9Op@CU;imVkjx?qP%E?5BpX( zCB2@}XkmAS*D-J)pO-d#-Ib|`-_TvDJ$9c@Te~Zb$rVz%RqDG(`gTsuajs=q)<(_T zkjN+{g4F(yvNliJk-9&u+)}shuDW@7@YL}IusUUAdsAvaBOa|^$HXq<3AV&Mdbczl zr_exU_!t(k`HZcEw1o^EHNc3sWzvhdEsZlcx~d@b_o-8->h>$nhcApsc=jS9G*hI` zH+JV-1yEHtWaI_l6RhQ-BfoRyMTzzclx0msY1%YF%b=RGqE9bSY$Od<6e=IAv`BRv z1k;6YS*{k2++^-fJ5qQs=ilfQu*K4U$*)Fa<- zG@%;sD-N6hGW|U=I&#u{Kh?iNsR%9AXj$kazp==Uo5yA#r`0{|cZPQTiX^LN`134w z#A9)a^TdrsoJ9Y!S(J_~!wVqeFID_?H;IT(Q_ozAG5UX~#rs2*6?Df)r6iwifY`ff zf0V013NNoa5CVai?~}mCmWE;p|DhPOV2^=CFQYM460Zm(>xaEmk;JMU?Kx}z>wvcdWb2dEd%&8_HWLvLYEML!DSDy&f0^Lkh1t3EBY-3S4}XOemDR4Ih5 zonakkTWrvnxQGGRBp6)nQT%Uup(ci!3J-D#Q&bs4)%}ZMxGN#==`IlwFhL^p!NN$P zrA!N3f+GTYjUi&9wo)h$!UUT9(fH4b|4bjz?NP;5TvUboA3-IAkcwkU$1bpMFaxk} zJ^1+0Ry@Pxg$|vBynzqUNi7GFTWI%REQT-h1rCNn(~3DXBc}BEPwx}`_@iv4ytv}P zBb64?uhf2|Qf~Zh4h>#| zBknjY<&oyl_{L=|{?iGE360B||MLWlN=KnlVyC2nBBM~4wq0WUt%f?}!F}C8jYo5v zQhi4&JtXNhy6+k|Q8>|mjpFXL8^3g(pm>ntj#_%UMT@^c;-5_@c6zeWV^KK5CkWk(P7)idsgGZhn^z%eay(Ph-Ave9 zTP?(DrUvCPH(+9_@=SlwmDefFO49jdvY36H;^};nB@2Qhg-%ElLK_YtCs-tXoDwyw zg5^Sd-i_B+NfX!|gC&qAay3s~r}#&U(ly)u78h-oMpvPV+A}L4)AHFaw7Rwmytc4| z$vGvKUHOrRIW{!{&~g+c=^S^^lIxYRCCgcCMr+2UC0J;^L2(oc&f4=)(ssJ^2IW*O z^LWt8VjdSu6K_;nfq9E>RGQT?FE3NU-o-EwFgjqK5zIRPvTWvwEX+44t~P>sFmzxk zCq5+FQ$4y06yn)#D9$%_=cqL_?k2@qEwG}Q;LsV2Gl-OFCW2vtamMaoVJ+*@{1SZ0 zVjZji6CL0hROJuAdrE*r0ae&@08|O}YFVQ73cTZ1eV}j4sr}80*K!8CwR-HJ+iq4W zOVc6&TduWaE3Lj6nzEJNxLNUIr`C9j;w;lziz^xjuzZB7v6M@_Z&5D8H3N^{qJ$y; zU*DpvMxuGQDqV}TEUO?#p{?}ktyrenO2xM+PH6{qyG?0q7M;oU#{1eM@ya$1#ze7kaEI;(oPaRFO!wOQ4z&B{=l)h&}nRtqO9!!lVJIjg@XW0ru% zR4X^5$!n^W6rhn)lrF<{15sCR8uup-ta7IMKQ2pa5*Ud61+C^nYM7<{U@&;l3mxIK zVDYn408E)OX@col%AcwA}Gn{GX<5psYsH)!D2)JM~m6;dTuwo2H$f;WBh=qj*W z*R(ZUNuO~8y?h6jGv10QdXeMPe>ak?ERJu!$G*Kk8Hy|CA_H-Jm=KX3#|>%se6 zL(}e3F1HK&QUvb?v(sAZT$j6pJ7X)Iyi16fJX5*3L^P637i+q47cH5oRKdu-I#UU! zGs5xCyzGo>%{;ZdTVxczTj`<*QPRXAZ9(jLqpP3F-+N7LZ@)`2EV0EvfyUyqvoXa-y^2Vln z!9LS*cCK;j%J~a$40<|^TA-Adi;O}CI6hR@j-5&0Oa0h+2KvDG_KOAxt z>pj}$E_wssw=zA$Gr6jKuvy#dcPvy!!h?KZp>hL`WRwuR#{G05DGwkxf?Wi-lJyoT zIDwMtvq*VW>N1o4AMMT`o>~i#JG!0WI7=GxHJIjb?I9dkLlbJsJ|E=d#CO!^LFK#_ zg0M0VI*tqkP)o{62%!h*`UkP}`z!tQpkk>vk25qBcBKh7OO3FmW_pOueMqTj^rVI_ zME0fy+Vjga_(3cU+Lz|#({&Fi*Gfz2%ZC(a{iRy;REbRGSm$vpR_egf_AgdiH+&JZ zF0oLA9%wt7w*Jw$aorjBaX0LxdlxHJMW@nUs=)+J*|=Eg(e5t|6FNMFd!v15(Nrea zcMq2{1neFSOD!K(Mi@`k&^-?;H|d6wPZEJayU6s2@CG|RqV$30&3FX<$_{$t5#^rD zs11v<1Iv<1u)`x|(OfE!T1 z4|@Zsg|&NM%)ogaL_8xeW5{qmL`%~2 z=%_AfcC5h)KpQWPFkYlPf@?sPSmAuF)8923^XR+x+x@R}OY-Y1pz zgGCI`JksO4b4-W0taTbji=42|P|3G5+A)Y}2o#mBm>nBukSEOGpQOv4f^mI@Zhs1! zn$zZzc>8eAQ*e5w(N9k)^BSeMP;os&HTNm!KZ_PFQ`Tdk=)YWP)+B8c`M$}}ng>uJ zWV?S3VGpDQtyr!U*WO1dg`VVi@v^|1%az{x9ghd3v%QIE+&Cv|2HZq7fZMP$rWdr% z71e)%amyEm^=D%AAZ zIuyc3a;jja26E@X=xm_=tCSFDbgYTo2%bJx8-ZN03S;JmRP)tvt5Jh1pMl-lPxOpZ zRhmAGg98KUTcGHw59(Oyn`e~0Qi`@dt6X7xaSpY+7G@S7;98^fZa48zGr+_X-ms+ONRqK^1 zW9>^lwvZL=_e`+LM=l_--bA0f3-qwQe5LBfT2x;3T5(_)rGE@3a zYPlJfd}Zpw&B~owXCi9}Qr~ZZis>Itg7Ri6o|fb@F}Uy}-MI95CX}BaS|XwEhip~0 z<6MZcO}W{vN9LbFUN;vLdhi`?WjWou4V}1?KHsLyMlkLbtjn&X@T*Es1a~7S)9f>f zJDLY06Iv|c9N6ctD(89A&Cd@lm3Un<1MV=^f^6#Xh6ks#OV?~O?V>BTD|X*I8t3$+ z8Bj~AftjQ@O?nDD5vF(WUK?F9^Pv`s_sV=W$fT%s?S{p-C_bR4y7pd_)aW>g3n0Mkt#k`8j|TvrI#hGwE6Z@%(~!YhH45%L+y9bm^T%hKNHK# zHFXiYuFmL?QDbj;dqCp?nnQ;LyPt+ zHgr!4$h?e`rHl3Qw5a~{xzf0$E~>g5FMlFix@QXM_JZl{&A#SUqPL{q%b+4=1Ias7d^N`JXCbb+v!h{-5r@Kt3#dLbtq|Rt^jN2t9H#j6QGsPS+nvT(^Qq>ER zM>%+eJ}gydYksPi9yF`Ei)u@IhGmA(d+Ru58+%4bMoYL-{Em_`Dk)P3mZu3D!3K-7 z1N>jU=}j)X@bY;}E^I{im#N)Q#E7t3K|hqK@mdZZ7_2s?yBn$eF~BK})pdFo)%v52 zDA`1nv9mg*iR!{mx!vXtk{JiKh2ubsB;pirNdogNphz zf?ldR55XQ)^&lv=s<$Ax%Zf~=(~DL?5-(S;1@u9=x(pYF-)2))bSv4^%O&$vUPY=b z;1LIJDc~^u)D%96`HE5ckY2A++eq)z&sFMB>0|2OOr43P=MS5ygQOFwbDFFBCFujo zI|p6%9-Vs*YVnCd)^$TeV{oO`wiW)a*i$+bMer?tB5zOacI)Nu;IHbspprUr_;zm=r4G@P0{3e;b zNShpNYNuY_L>%!d#{Af25-wRV$FiozwvcuIQw;#hu+VJE>y;{kxMeD3;Db8Afzg z+ZKuiPIPk}({ZBC*;L?jIrZwIDo8lIi|Q{Esw(z~*T2Y`4&_Zf-9?=sVedrkralU~ zm%54CHt4Rd#u54r-PO5D4NDX5zbL?r32P@td%bJy*s{ZI5)==q9ZMH!@t7iug)!5c z^lV5Sj4Y)dYF}j8zX!DbB=zj6`lTJI+j^?7D%sOzH7smVdJYWRF!4FUAaE)+?OP8}w;EsLCN4 z+8+ai7(7m^HC-_PDzrECzyNi)gqHk15PkXxop*uyY^`aO2W1a6kwIz?>33R+p!5$G zCGIaVDjH0G(r<%QPwDSD=s&3QV0CJ3hTxaK`6JvbS!ZZJ;Y5Y$Pne)#82TPfb-GZE z=Si=mmJCtxF3_q}+o9@)0_oY**H@{y#dd8fkWlds_L@}Rr22zVdOj5xr9RL=dLi}x zbt*3T-as`ssGmrw)R-Gpyl(SS>hLXUUG`9q-KKt7Ds4{fzE6$kOIuRGx#}j|jhFg$ zzWNYm4ym~d)t%+^#Io|1RPmNN%zUuiWVpg$Fnoib9lwL+bl+R*Q&kIXCc_B8^^FEY zV}v?f1-MkB8}hcg(AXEF&D-iZ%GL^#p$YK(XTdKYKc+)`yLX@lo9O&^)Q60h*y-zc z)YgqR*i8l%(fr4x{M$^;-&H#)e<4Z%*tF7QKw$j@zZAcL_{}(noFA&UR_C8Pu9OL@wFmo&$ zF3*9x0&bl}-z^934!C(%Jl8E7?xDeDnF9L)!Sa`XE_L}xooF_-G#Qxdeem<)XKG2? zK2m!d5!U}$?R}vhKLZWtit6xez~|(^GGLv7EAVX2ihmjO4gu3+AFExfby;lz9Luhr z?*J%8MHV~|Fn6jRe?bmB3~(qbJ^`4;RHt76ct94s5HNU<2Lg)hf$DCdNqf`|89s1+ z=Yt-4xOtEIps{fql73X1bbT4Pt@xoChLUtx)7oShgXfb7x$V|ACK11XjM>l}&pIAL zw0f`VYds0LV$j`o)!(SC3-))wh($-=Rox8?4sGPAa!~1w*3tF51I`(F%WJKUPW0N%#%(OUR0!xm2_zVv%O!0e(v->dC8yal04&v$Mn zU#*bJc{quX#~Zs}XtLzEg|I_mf)M`X~~O&PuEocJmpDX~IwHwAPCQ zXQ!WWR{DuF`>1MacYg5fiE7SB#ENNOre0Kj97+14UXRw(21p%l34@0F<74HWX!vHe zJ~_5nONvKyG>OssX+$>GBD=kyTItz!YLRhkN7}p&BZH$84PCGLsvMm(AG1SUO}KRU zS@5kHN(9~7^%zkR{=Qzl);OkfYSatrC6f8gE}E~Q50!6rq4!d1`|4g@O+s46A)bAX z2k~RGsKZa;nTHP@=KkhkMTd9h!0!TXn-%{7o>>lb`dxTFw-&B8FoGQwo!}ijvzqDf z+d1%MX(83)ho)f`LLIjd0NYX>Ccsr$@ceX|$aVDB2DM{Sr+Yk&&H7P#yNuTInG zX?6o{nMMCvPW+F6{UV+o-UzcX4vgQZUeX}m-6VV(z|I%Z5laEH+UoiCf^Wd?uMUp^ zoL!IcfV1hx<-phGz@q`Pvg`TX1UM_dYQt?nRAmv|ngidG1K$8RJHtBwXJu%(8*nyb z7|xc2>8GWKYp@jvcuS}uje1FqCJTC)3_K|?A!L!PM92m3AIOENV3+z0{NBV5j5ahy z9{jgIWD>^vI6_YAKw9qA#ZcPw@vP&S`-lq?{I?M)_ zyFrI1rAugz#`0{&h<<2=P>1sXS7yNlfZ5U1;|p`>Pa+N$qHl(P5!{D*g1_+W%z?Ax z*C39E6rFx4Ij)DdgmKVJ*28K&+O?Ie$Iy5 z1NLUccgTSqIdC7q$iF&M03+D%&GWYdvxU=P&L390EQ4UF;jv;wA3FA`+Oj7pnsHbOXW*O1pzww++UkQ5dem%ZQ%dck!(G-a0Sp*DcXHW*11zgXdQ3j?~ zufxyW-j^b;tCQR9?r$=T104%Ace@Tx#&h>9cs8CZQ$_z$^YV?m`%~$g>NoWKA6Wky zcA@4%=p*#73u)}9>a~6M0Dlz{ai%=$*WuoH7J{9QUkaFoTaSMN&;9Yko73X&=8LG+ zXX^dN=Psg+pQ$zu_kO0jF6n-;NiYDUr>&PgcTufN!}dUjm*ANhq{HvxndR`($f)Z_ zU3+!=_Ta#(iz)KC+M~WsbAVUE`qGG=R!huKG(>a4c*JRqggVTYj!l6Mv!%0T!OVGo z7Tg#x3%yRS0A^pSXb4R>0DpVW5c>Ln+Og}0z()!P!8ezF>zVWgU#ji9-UWJA1Fqu~ z{P=Gqa19aOh>#V37DA4HE1idqM@LTh66;nSFEbh7*9saoO8mDQX_5$a+FqdHJocQC zht}B~ci|1!3YrJ;%zv|xCJ&*WhhC3^r{|FeiQtM{OP_oNzke4}ovq}fr>D}yi0nr( zGgO$RrQ9B`+^o#1R?lR0| zxDpA2;1}zJ4u^8!fjRIXz$}J3{g9maIAGR&J$@`;uAmOzqS04n5YvI^kVP;{BQSKK zi;t_uw%j?D*+0+YhL32EG)}_AK~vJZHyG10Itp^xHgAi1zJvst3RdSr9N3OGBy3t;wR^$IhbEmVC0x66uWI6MAQz}Z55MRg7VPbRa4 z>}J5{WM#;6$1Yhg&n>gHU}8@C>vGaxp95F($oIQ?gL83ITNxUKiZFY0_$EBFPV4XlJXbMH`+rxjj+`GmecMNeSAc|v ze?8d{JaaGTFuSAdIqLAx9Jm``X7XZM`iFW=sVT0R$i9#s)-My;|5UH3oCP#n!DoPG zY8~#17FIG$tNv8Sm0A+oKrjGgtPB=vdr}>T%VZXxRIjV9mpt9`UIgmlpt=`7mRucv z0MDFShabhWD+_)+Cw?hlw)#5#b9lCA!8`HX*I=Og|5E>w7NutWjnU7k6ThQHW)i;v z*qM`9WKKIysctmohB+I64RYHZI`TW$w4P1YbQi{jDVKVNTZcX^T(Xt)hEc5XH^?a0=fa` zH;VR7wN@FIjG<4&(mS*UdP%GHJMe%dRJ>bbw9+iPUvu0r%qR{fut>7yuC$j*gz*b zm|mRtD;xQB8rkk;wFydjtFG1GSWoaRO5i&4-x#vg6ZMGKvpz3b$Wq^WUA1MRCjGro zJj;R(vzW7e(BXmU_!*#&0RM0NxMy^jwS^6y4m$x?Wx+hlV@1&8PvIHqdt?xEL6Du{ zJit5*>j~Ba_GZB^0OmfQk?P;TS|*k1bk_mTgVziiUuf-VoH3EcUTp0s+39GZ^_uF7 zZ_uj$KB$=cI{XTrE3@ENbKvbc@L|BL8hZNg@XV#^@JT$g>C)l9@f>87j$nQ;e=epY zMb;-O@48VFNoG0smriyg$aqS4F|8@Kx{Vj#Ko4JHbr}cUMDJZ2j&{*2<%RMvecJvBqp2XFPcuNoCfFd1EG-sA2E&Ryc;Vq|DmXIA#)kdXu$EYEJvhtR1Sl z->#K*IYJ1aVHiR#ErAg1F*LeOEFy*$0cP&Mh_Io+r>6sW&aNFZCmS9On8oHUTGhyU zP0TV`Q=TV~H>NlS9oB~u9sUq;>~83=KD6jCyBC#N@fQK+UPnB=lPn)=K8S*@1VSHt z4o;?aC)L4JGof6e@x!dK(s;E-@mZeMopIXJ1ZFo*MNO^Eq?^gn)anN`vZ=LA{oPZv zsc)PXH?^Kuzur`n@V?@7q^Y%oav4B7%F=VJM2_4;@oEZPWo<1lK|Cv}9&f}z(3)Yo z*<$s}2NBJljvhT2&vp^L!(we#?wO`deSyi4FngHGajGXr2LP95!5i@`ichnUH!OIUFHW5m zYqKHCr(?xCi##8l;{(ip`bx|m&}9GVMRfwL8xcCZ7g=-KIIU5v{_1TgF#_=4_%Ta$ zSU09RtQ%7u<~dU~J-0X;){U)BpEkCc{L{A9ok8fvR!^WCTOHPo?Y8RFfCg5xWY!~e zYrCzQCKOtGNZVd0x4vtn&nv7Z9HKo?VSUNC(?IXdwDwMYWw$PojYkYr`EGetYFS6? zqH~PJ5;-GQTWWa3dRdvYDYfBx>$yeDY_WX99tIo0i^h#jq<)!V4b+t;rrOT5e*YFo zEknxvB{V!?$J-|s{AB$2kJIr_!Ii=btsP6%9K4n6@0K?+mK$l#LTgWUCvBjpmrljR z*)TLqn5pjhW|3xwR0<*BnqprO%G6v_)`tMEe$uZ+@>fFg}Xp~+gTBbIj@(;?*4KD+-4-(v7$YzFq zf3F;G<51`K%VS;hJDbInpaQ(+v6BDvhF+7?Djl|@X?~Tc%LnBvt!Js~31k}w*{D?h z?s9zTz)g`4%W-@$HR;3hKiXA)U39)lGb608opJn#|M+=v*7KxxwfMKPo}1&ai%vfy z>$!8=TKvqc=UrLPEjgd+bYVxb3hVB#O}r-Sd03zpUk`ixdco_mo=0F;QO8fgVyphV zKkK>WrL}nH{4Ah9)*AH$HCfLAtPJY-qp2tJZG{EJ=?)QiX~}S`<;m})%33DZVn_}Nngwp z^ZA{QKs4bA*QNJb+e4*se;}BMxsa1T77TjB_5Pvm_34<`*1pu?4FsJ5Z@>|8yL^sl zB)s65y@NUGO2%TSqR*WSMuNU*xR4(E-rk`!=<`K=4wu^(bw)jjM7U^SUt9A9Q|uKb z{zN3^_QZW|cP!xdd8xFaZJf#DjQb-_u*@5b`P{(PG_*NNBB1g4gOQ{!5b-*l^ln3& zt0WS2fQJFE%k6PEqH!{n*c>KT-0$~9gD$t%A9cAC9vZ}0x7QbSIDM{YEbj0+eL<>W ztUu~Zc;g9|I}!=Hd`TzmDzQ0BoZg@_7EQQ=&Ug&5WHJHi2|C>opWhes$DQC24Kg8p zESU5q0**v1;*SKpNf*^HsV|anJ3KCr$LaDrToKyEq*0$U7zp?v2fla^T~4M_Tjz$s zs4wYudVB%DHxlvC<)yaE%?`icAB{U5{wVs~9d(5j8o0?e)||_ju=)?ZWTmZLZJo`I zxXbHHB;rAL(BTdSoZ)gh*3;I6o_!u~O!$3Hm&@Uc1!9h7wV#Y`2*~6-l@P!MH2o0dL&lbEvYd?P7B<;q-fh!B{-u^SK?U=(+UQuXY;> zj{E!$kK2i!@+afTa7*g=yZsBZ$K?&UlfI-k=JL3rURSsk+56dS=7`Vb560bbCz#>) z`yAocwG}mcd@iRq;tj+hI-aN_5N^YfcC#}I&GI>YURONoarivpwi-SV^~W8tNFu^K zjeGpzc2s?yZDL6>z^al=CL`{M-|L`~rnY&I6|W=VP5K=1qzlP>^juThP;=1Zi@Tw( zZl^cuaeJL%FAXfR4>fxd$rv;+mJ9}x=$}N`$M`1nh{e{^6pwp+PPaP>?Q%li19Z${ z8)gdlV{xAcxw#|Bq%#qqD`neNrieEl@H!mayYXPu<)Sxb+lWT4s0X}+eEMQuXl*>) z@g9jr$hO9Gt!j%maza+TZnq;A3q~RD@o=ZpqFqk6)0gmrQ;rzSNhI7kJGvz1MME4A z_hcj*aU|&r)i&7__Xi>L!DP@8bGx8yG|p;^lmxvIM=TKwx`GkED;THGt+uHq57gZY zLl#WN+;JuyUvBGYN;=&RS0d<0xDrWEERm!a%WXk(G7*S49ncCNq{it>=PcO(L?s526a z!Gea*=g4km79m&E74QXoZZ8Z=xR0(>L5OMG;fcX!!;pmg!fN#}$30%J*Wrz!6N0XY z(;eF+)xw5p)2o1Ntr&3-{M_*5OD-z2Wx{;R`aVP*~~=xc!kB%!(%h3*ih8qRRfZkjb6! z1|86~U^EDWANA3iDqBC31A|Q<5Q}i)L zuP@?5O&tk{QTP&ahHV4O+_3+yV88(j=ypZC(eR~LQTN7nH?3)IQ%j>kU&8D61QHQ< z3~UKsMjZyAZV3!dfdGbsm>X8zlMD}~`v%x9FnJP@U=j)qxr@5MPdd@UHrR~e)8|1$ zg3vc^XZQ;GX@G4|sXGvN1)|Xyw;7TZ9!7%)+6I{2K3M1kGWWaCtLWz|Y3)GUATtIK zf57LBCSqPk(35nBucFUR+AlQ0CPgqbz$_$T^kN?R{9N03Q#9`NMj=X&NN+UmcF^#a zHkT;^4e+>p5tvD5EaLUiV=ZkyQ{3$dMxDt>z~S&jf_^7`+tTJXdE#I-`0RvSV?=OK z>sGe*WiYO8cf{omMj}3p@4j%{N9|hKn$pgewuUG*;ZMdK9`G1CnGDjBR<_nAr`Hwp zz?fmMbwz`2KkWmy#Oa1|IUPQC5Ejarpt9B|G~)64V^LoW);QovL}PSGYg?r`0tND5 z>`Oq>gNaBWJW4a`4i844WZavGMB`Dn%M~82;W47dT`re5=1c}+V0`!*4e$23l0i=( z5J!caNk=j~hVes6q8^{u6T|=-b$ODp1XZ+UMTsUMNby7>;fK=_3x==NGKo1cyd@J! zhzvS3=nsz*cvAv3aK|D^7o;VUNG51-JKLqDL8mW{fj5SRIg{={cmg@UwcTiP1sxDP zSYd~cRl!Z&+S|@GIX&Kl2Qux6#$xccymVuG9=f41fjHa`*qMYM-Sa|wo5vh0Jt z0CIxyAQBAUKy#j{@SB}*N@8%CJjtlrAAoJSkt#p1oof#GJOM}t+#6@W8ILBzH;GZm z6pI9%UT*^3>VQhSeDq8QTk|%NWFq2EqM`0&40hTTZa-$sjbq!p{T@h^Cm3}2eSXv( zthhzEeI-yu*b|Jdap-+AO5GebpV{kA0u_%q#Auvwgm2S)L`W;l3I=?y-v=Y>4Nqdc zrzGxruZ3DJSvh9@r^RM8jp_D7=$M=&0UxqV5Wi`F=8 zL(3dKuNPyY(;xLF5>B*oiu4cGb1JRr29uO)r)i4|L!>))x=p20x6Nrza-T&aZ~>A& z*fn2x204AU4rb_>CjkE>5plw?OeVs2Xm~e#T|ewNBo^bU(;vQ*PW7?1V22WEAQ%of zF-bT)E_e7Y=^xDS%yb!nKqLx}7(xU=hu+<-;UhkG0R9Wx!dS!+@Q3fw@ECTZ0m!)5 z9ml{OaE0&H@EBO&ox`VsoV(%Dhi9efy^xJ4R68C-*E>Do`vl&E!8GD@COmF8{1N!M z)WHY8F#yNHk#t3TNwy|&8s~#?33|Og(7@5bK%MY9X)Q?2(7-7C6F5hZ4@Wc_o+C1r zp?*$B&>Mir!0k^u!*iu^FysLTZeFrk$iBwjh{h_m)=i!Mk%?Hq?G3^ldLqs^lrB6^ z8c)L?vp1%SpsgN#GN__4H7v5XD}lp|X+t9J48liCI;d#?^Os}-LzoZK2(JsX2A7lW z3)n_Bh8Gv{MiL45e{nZ6XrVL@vJ$XGs9U+M(&TXj5#3DX;eQxFV4tl5z8>ss!cET3wvJ|u-)>A5FgSUgaR+8NOSD|zufe)HTs};=e1SkR{FuO(!Jfls zjU_P8!`uUtv&SVd3Y&6AVXE$8>umD*Js2>Z2^XBkXfV8#+7H0cd&X$_q*f^0R*dg{ zCpd?JCJ_%mrByul z4UgtK;KTYb#07&9hcmoZ!(&$C_hDp9IAa(VAfeBt@g6UPHxToB97!)sUHEwo4;v0A zCIQEije^$`UYEwhWchfO8uxkO$-BbqHGI;Gc~TUA|Hq zuF~X-V<2J?#XQCrjl}4u9=2v?zsC{9Y{mx{1Pm^JN%M{7qaXLLfqhs#9hwtCJmo}pXCoYg6^mj(=U%RyjkGk)cf7w zsl(|=27(^AGnKt;y~=XE%<#(+6*sf>fqQnkOG)qbvJJp==ycDJ+J|j}O}Ty{&1NiS z>!&${bTn+c5U%R!ZeMsi{W!oj_zVZ{HCi*!Hn{8zNA7j$A3V89=h<#B#W0@?I^e{) zV3;xFlXN~b*_Vi-;t5P2FnRIA{oYA0ceQmnQ%&B;lI5~9<`!?JW6wS##r(_R#zX>o?c%APBS3%mvGrE6a!vf8ET7zXImXC+kL57G&P?2jgrakwWK2Lf>#*w0pF%AKjulzxy|w=){YA`r}k zKag<1V(%6*RfZ)YPcrC_K(6904BO!kC0gUHJf{Q(*aLlwBph&;BSEtDKbx$5{7(k* z-Tr5jwYCFn15LRGlI|H`yYS4(#E}8Ei%N1P4Kxr_1FX=UK4qY12HGw%<;oeAUSJ!- zOBkn37s8*@rXjYg%$Tl6u=L`@yals+SdRk&U*?HB;S~nqxI2OvER*3cuu-AdZ!Pn{ zt#xBMg#{_6CmBhGzm(|MHL%nUj~_E5Ou?O4$4bI8{YsC(w1#b5G9HEJi?QmU9ubLQ z%I}WAqQS|HdBR_(Bb;!uq4{up97$Ncc=#JV!Vd|HV*vrKax#Dwh;P#oa5GR@$PnC_ zfFDNlP&y)j@i7rZ_hFU;k0uyCoQ{CM>cyg%*M%9dKjQF&ze`6%qga#-L;^9m)IrR; z!{4VPFhPkpAtvyB;5cJCazvu{u7fmSWe=W=Glu08G#w-04-!>Qv&G9WZGr3I!_p;Y zftcEbe@v%vVQz&vbTksd$lyr$!at=`U@KPk54d4keVB@bf7VmLLvT6+9t_DYn5uaA7hHL>$d)iWTo^=L(PYGf2_byt z3#SrOdxsM~dK@hb|0ew( z%I*VBvZ_oU|A(E#QL2!0>Uxig5av_f`qOPpt};p-@3Z10%Aas z;0ni8NunYu3a$z&5?pfxBZw&Ix-KTbutxO%eebOrhw170eEyg|p4&Iny(hfy^E~f! z^3_MT=0?QDbDfz^8_ozA9!BC zTldmw`IfVq^I!vbP;Yv?GYhN*jh|lqx$J#@cG~(SS(=>h%%oT5-A?iydX`5?QhR#R zd@h8RSCp6cSJTjR;OJ`nnwM9Uf8U=0*g_ty3m~NKbb3wo zI1-}xY_rq-&a5w#UR(Y7?C7*ab!JpA zgy_jSXC}H*it_IRO$5{dHSf;yx1Lxz2bxchIgILjRz; z6P-XPq!#6M#%ExD%;a&97TL$g$Ho?yPnDwR(eS7{eG4dkpw+;hzt2v!tJ6({hID?`6$K#Q5a=)D%Ry zn=T%-n;yny=VIq;!}O~RBbmz7bboSerafm3>ZW&A%`#f8lNM;mQKv0! zDE~Tuu~F;!G^lsdG=6#2JkyZ?&5n1>CvcLf^zN!zzn_#G1H?MsTQ^-%HP6e|aR)Qw zV>71GetJ*!gs>N#q(6z12~>AJy?4-V_V4sy#q%&q7fbIOv`=*n=RWMckNENCuN=0U ztidh#x`+2QHZNr;->~4yay%A!L3bR` zFJ-9O=gnWenMo6*6lyF|hM17nJGMaqYt*gS4Tcm=bTAI^?Vf}?u!g>v>9 zhk8wQ;*bQrKPFu$n`dxWfxwJHD;F#NzF>O{Ht9Rv~pCI5cfaXphaM zYpY9`>pKXHInxU=ZdRI5KJ{ck;Zv}Uj%7vUB~7T>r^IM|RMdpeVtSD#RPD1H4a9vh6F)O^-`~%-x-I z!=M?QEd%w(*d~+rja73zI%uvVCl$rarkko}Ynyx-+5v?ESEo;w&Fg0Yo>SwokfD=P>C=OD(Xb9ahsTo$j!mV{M7wbz zaT{%S0);YZO{UKdnnAaKuu1Eq`EMe9u4;Ax-%@A{YKyq%^Mht%(6liYc&G&+eW7X| zpRvjU_VAhbw(<1Esu@~kjyH-thAb+5Y0!*{M6`$_j28>qmj}&)a4VwJvfuNH(^sN- zZe+TRrm=uS5XX8Fy!6#UJGubSj18Kf88Q-i-{SE@r^-y5FWq{?@cn>?WAuG+wl#8 zF1&VU#&VIqHE7q%!95PWnx6~;VeYS>9(qU z2COt`#T_5->1y-i={v*rnV2u<^g2-5>{Pma&~A+s%$OoUu95zJw`{M?_=NBvQ7ueY zNR!*A>1Ft{**-AZ7&Wkr-|r2s;!h@fBJYV&#Pr;lz`y(|UKu!ezAK%_nE;IMtlDEz z?^+(l#z#G@De|siyH9~3oQ9)I*gNS5gZ44s+XtWN;^RgQoFA6$*oEmSD3W}>A9MLw zKKTq!35)O}XSyh>FL zjTwN*3|21v@1Pwy45Se9<7f2HboZcr+Dr2i^>M(2nCd5G`+Cs7X}LRNg%V^=<*Q%Q zJbuJm#QThblH*tD2tOJywJ`iu=NYXFKtA@N{eL?_YnH!%QMQVy!)33@KU0g@?SWIF0v-9$t z{!IGy-{ie_EuK6gzKg+xfRZ*?*M8%2S2o*qlrO48;O6^82AKYDcpyldNwFjzVWy85 z`0en()Wkf(q@+E8j^pWf!vl~z%--xgAa&9kPQM=<@IE3kb;P%$_eg&z4~$~pt<>J{ ztRXelpG$unw9DCa_* zyN;z1JWLV;M9^xL{7ZFUM2aaKvu;|pMNOmP`~%(x!;YA!-$MjRm)dPS(`mzYt2IPy z-uy)W(GlpEf3H^nw~(K3@3}tQ>y?9cOE#QVe+Q9v%-m-T+R-f-o1l+H`@Y+&2JL-c zd$eQ4bRR3GK)<|x*ARxmd7W4h+`K@)YL|BRJf&Hy+v^ErUpr{G8Y59AX54hbgNpR4 zzsH-;cYB!9fc3f&>7RU6v$Mh2w0xQU^rU&q_v@=>ePw#ey3jFnA`3dJYMu+|JG4Ux zf1o?&puEUDz&~y~8{oUi`|RqT!QdmZ&Bnqb?57~Vd=@YQkxfS?4q-=d3i8W#6INSv z9&sW1!B{wN(B8FZ&iBkk(}FVb-W#j-86>i$8(?4!Mk5OH%j=-(NEqOSo(M}YF37Li z<$Ux2;(o*?`H3LEYPT@XjbpAPg?jb0Apg=2#k;Xk(aiW61Vj`gxoVy>KTM37?sX+zx-~^`W3-POV z^XfcIx;rntF}#HMgLbbNbKv#G1q}1(%YA$e9ZG{b{_xH zX0rjg9}~3s6H@`sBwe=T$<^UKu5Gp&`(*w+>+ zruQycB(Hs6KKbMBFz;QMO{g$BW?KONmC^q6yw`QjwNyiM5TFUM%Op%d6#o8v$aT#V zHvq~^{}M-m)ws#=19q5b_W$OpCHbyLHBT7Xn%|cJT>S|I6-dK+Hx_`nVPOjUVAU>j z9-nDb$@q*?gf`OP%Ill^jL7q)=~jRJZi>`G5)kdaAl-}5)1pBaCEWk;l0)-uXH&3T ze?xP5KIMjHy)kOtLPbd(BE27-Paj$Gtj&MZ8lkj88qErrp&;#vX}Q6@H&6&hEMpl$ z`4B*mr^pUYzOnh(k*NtwIXDrvMrmWA_-NHG-}PaA;jV8?1R*`R^2X-I5n1rGq@**0 zpC^rq^dQ+)D>LoalBv{19t z>61%J3Jetm^QL*|!vL`MbLqbZXN(KQq+lRSGniB=eQNM*J+r6vNen@qpkt&@FF7Tj z_dMhGJNGrmHVXG5w43XVPxU02-Nm2nGlM&szRgf%aWZQCsGUB$Bp6O4?`8(gME(Bnk<;^4P?*A_xK0?=?A9-F?j#_-(}vsn?=E>Si}N`L?3F3Dn*tMwu6tO#{=X7eD2e;d6}|p?<7a z8z3#PV9~pLZSY)kQdx*kABZ-Fbl=YB|N7u2n}A*rI#Fl9cV6J)H~Gf!r*x);F2a&2 ziRL_*VDVGFIXuOhF3_8h0*FCS0*jyWt>G!NC<^(Lp))pTg5Az3-yZ%JF*j5TLI%IJ z_Khxnms_h-dK-b|GZrjJ0C;3}JCnn0o1Y67(KU0-6F~PmaO*|C%6Ep(HETunMIyAs zh)TB?J>~Y{U1WTI4BehMz8^fvqNjX!aF>m+QBgCrAOy59{l!nYV@a9cG#2DH-&-=C z51-iW!THLAc3Y7z`F-;tfAjrnjjS)ge(zk8*ZiS*R0BjmjrxJ|ikT2amI05DXES&T6BPpGmNk17Jzl*Ed`ngzSUdr{1q%JrWb^Ij>2(4C$~#bad%|OpNB(MXV4D0|8bfw2 zzlWlxUoXk;`A+kdd&!DBFrLxzaX*s2bkIXByX-GQSz{zXZcT;D52`V_t*7|?l6=JN&9sStlLA0LB*8@!4oCjBPWi)<{H5EQ&x%umqa!fZ5hNPh zxyv5~w%?7U-!uvTqcH};l8~oA4Gxf%fM_~EA6z*YHQhfrK;$WRl0ysld-F4>wBZ4R zPYDGMSbi2t%fI*~cQh{?k(<#5oA;!QudpFTlJq=NC>0YF}UdIk5+UP#@xN zjhlwzo|Rwl!{$py#$x#vj?W4G;6G!s?6O^&j@=3D%LnS4RnE@sA2(kdlMRWY^o!0* zhY2pNYVV2C+#9zz=FLT#UAA}hFyDL*5=uTg*OO*f?ILf=&_30V6&G{;#zFgx6)0#7 zOkKMNviSF^eGKg(HP)|#oe=cDY0y3<%2e>uLGjN`z_QODw4GE@s=i+2*=4izCDJqs59yST z@|N-{^?58AP0i#y(AxKzPH$bBTelSt&8IAH?OvysgC8T`5m<7Z+4Q!hivW2SF3orS zvNgV^ESE+H8%27GY8i|*ct5m-cw!Xjs?(cVFIrlvbn7D1iKu8Wdx%No=NAtSkUGSu z70c^5)Nkn$2gv^yW}TNVEwj$Xf)(}cOScG|7n}38@obkZeO5m5_U1v21+&dNmY$f~ zyB1H{b8EP;nz^=dt#>ZXPk(0fNgEg7m5ZM7uBG{=XEqPp2obgp%?S#vRWw73zst*) zhGg~x@~a1C%I~f!&g$M@7o#*L8@8&CchVK*Ee^~lJ-fMfBlZM@ISJj70}?GRexLVL z*L%z~uKLm=@K^=WXNb9lk=c6$HPYrgjn&80hp*v=XXW`?|gAJPZ(L5RS@px~;d z`Hmx-`)>3zW%-CIQT90H>f*oj>gtS5_z=vt?9YgmQx2oXZG7hsEXO&9x2i1C7xt&B$#L^ zcn>J6%nvO1v87KM-e^N!drWg(W8D1g2Ld1oJ>;|L<4X@8{z)xA>lhe>36(mDh#tZM zUhJmpmgWup=40}Ek7@3?ac-8FUagPR9Bu^vTC_KP!o)Ny{yMt3AwTBWX00(T^b?Jm zYJri~x^(^0rw;GEA;0L@=7xr{99459V|tOru$yk!^6_ps*5jGZFqMHbQ12-rOE;Du z>LKNus!unYb+L$4QjNyc6cnMGZd&@1;cZ6pKTS6uwP{}ZfDwT>2`I?<7yl8TT>A9k zxf}9SzxkjCb&rpg8azbY(81ZTyk9L}+lK@0HPd`ZeL~R%zNkx};Wq;+K2yHjZlgnb-iITg!B9q0 z+s`h2Zd^dM+f1{_-;R^PTCu3vFE9Q3eBSM?BA>cnb7@|C9G(2J2Nyf$ugo=Ejfw}b6rTM=3=KgiHg`-mj44PVH< zI4~t%SJWDP#AgC+eQj_+9a@woia>e-S)BXV2L~voB-#)_ZgF8DIHpw zE@a+xDDI--`sUK7<)0qc+$}%n_~y=aRb%igG6nAzXEB|=wKT7Ko>*3egF;=w+9VZX zf3}^zJvbniB#!_gs6Hv>Bezxu8afFsvP&p{2?Uy@+m`NMCQo_(dA@K|KzecXU&4+M z@qA}#KKFS5F8L1ZhP+Su+96R+x0{fk*W6@6mexmaBHWh}&8P1!&AUCn`Pe!%Q{{`m ziVzKIGMnyLnvZ^dbFu*mob^dMhW;$!Pd9zf(1fZ#I^X>K=1wEB8`3=dh$u(w+{fU4 z;HKsojY-ugA{oM0Jiqxf-MRGmJiTA@@f#O_Z`DjfSZ?&<6O;z{MWH1by(?e!$>#oh zEdaL{KjQ~Wx5%v)1L(GOs~?t+U7wx>ZHulWbOJ}tr2nqMtdRwH!jJORpHc}#Q5>w7 z)mn)VjV^AuY$t073dHxEm!#+;KOVFPkVmVbk4#O>q0j!eYL{?=6QF}~ScKvzZrF7u zHwY3bQ50lC{lF%u;qvm4Ehs!9#l&QFz(GH)+NY@mD0wVrMmH!GJ6!%fQX7FKiy_6I zR_~U6UbZ*pB=NK0!)bWGf|{xH3v=@UpSF0e`)u<;jVO!PCve*aH_?B(XX(M!;UhlV zeDDZFIz(P$gbfOGq1yN6OF!3q^2mY+>%M&ZXPd`07K9|fe8A;Eu~YM7ssNFQ6Zn+$ ztGL|b^4s3qT(@ECFz?rSzb`a5jld|U=tNCvgd9=K_M5W3A*jS)-ypoFN6E7OI5>@(F;po)`w7#X1or`_;Yj*Ic4??fBK*_+ zgVR(Uk+TpdDI4s}&ZIv-;50G_c?TZ=!y3}sPk)Ki9+{8+QgcOPOrA=RL^LyxFsFGt zb=gz%G2d#A+83<3qTaMbm4SZ9&5| zLii#CM3i*MGK`utw>(^r6J>Ek6q0(taeCddeCo%Vk6TF7y?$Al7cE2@&svtJZf-u6 zsssFH3YZNm1DUN<`m5`U!vRrSWgcfQ%Xi(xWv6E@=(GRk!R-~`V(7Zp~J5U-DZ@PfesEB(A` zFHngv3-O+Eb)Yei$EUb5tEf6ckfk>->*pJv(|lMy_8ZNKx=$qNZKL79%5-+=KbGZp zf1`P9T`<<6lBd9dkC@-mTm1NKrX_D(mf!Zx=ALy?j)f6kNEI(Hm`iV~4m9K)gqEuB z{loy*(uKhb0)|@CChr|#e)N0 zWN&hYgiMvQ?lX}tS(ev*ySYz|G!)J)eidm>xotjihvKXeJyG_>zGGBT6mbms>d8A4 zucHouR73%n5{WYOye!|fqe!W0jQbcfoIupYkLeTlr-n<$J7 zMICDXit75ICG3ltu&!wGX}ooHed>pqvFN;^CT0AQ-dkS(lnw5So4%p3t7OZu=23R6|0+I|_q%)aBSXb?Y09JF#9S~DjZQ%z7?La_5E0oCe zIHxG$s;XU?JYiOpCHrBaHom%SuSM5lu>u!CLiH!PqO2~?0v`jQWWu;~#h6mF|J3!> zJ2#Yt3cG+&tW>Bt=hKIl?U#4EjM>FuYl@v3B%bQ-QR0YLdZoGa;bq6=yY6W|e$xWd zw2E}-q$Nj~K^>6DQZ_jDku9%S$D%{niQq#KVFpRpc#>@*G}kUR6Mb}9W!e zNU`@wJIba>xjZ)rU}hS#UABkLUWSW+Chj4>B7BYZT3}nmD5!|u9B+tD{{FfmHF{Af zG8Vy3M|!N5;`(J3z%#M{;30jD>v)rNbhJS9bm*d){N?q<-_^FB7jwH-oVR{Kg~HtxSM{uEVn0He^>HdwXONCym8m!-~}?$pAW9ZoX6r7vL^Ex z)nfWZd97m`hP-M5OQ!rBrAQLHY%zuFz02|eKPcW(lS%u$?oX*W?sECOqBwEALISl8 z#3$;4nRVp#t>WaGLIf&yX`5^q(lDCO)w*EDs_j->hzU@9E-;Vk7SA%4ezPo}{E()p zVr#>t9d<8{Y>4DpfAp20h-1U!>9@;{&j%dR>gIiSFIo)>$mn9e&e-Ir$t(SC%fsu< zj#HCVPJJJ#Kh@6%JiIt`J$7YQ*bqiq^!~kkk;VqmD2c1(j^~;|rrd4WOm&}^f3$dL z!vY13VeCZQCm5Mdf7^vg{dgv&nqwd~FG3&`vIB6=K#A^H1{DW)3Un+P)|ICGbDGM)W^ljPjuxk)l9!MyLDPkOA;Jq}M3 z*mCGlMn5s1&Rt%5h}D$l&kEY+`ua$y9`h6SES^^1dg@4TT%PaWyY;xnoS6aYslLO^ z6*KFmS&|3wm3Q>u(!Aa+fW5#782~tEHXnHCan~E{>J_tt1 z&%CFQMNg#v@M%2VLvm}h_0Wbqfg?dFq7fI-%)VvI!?joh2?4o3Nrwfw`4^k4g!-o{ zT}6Cy&N%@qLG8VpipQfO;MP%_3U?MqPoxW%9~Af6Det#;@z6SPKMu$Q4$=1GyXm4q zmt4?^FMhyzGz`E?c&(3LOE7mpS@=Wp&^Ol(jyQ6?972_?;uhzyU7 zkLX^i(Ui53OhS`p71KF*$VhN6d}2bA9u^8wOm|~Piu&ihi`5M;(jwDlk3!JuEvI)b zpUHQ9qnLW^f@NaBIl!p^h3Ej1wvbhhjpvI-i$mGE81n-6Qg7Z>t8)2YZ$ngS))kPI z;??-I?~a2{uaUkhD#L8ZKSUL?%yx>yYjR56KrOi-9(U8t#aMCl2vIIBm3(J9h6OBC z$=z7-T)!K?ZYGk%5JMrz-!kRPk}IJ&`XR zFP_?9P9WrC(^d>` zf|FkK66`A08e)qFbzLkktk% z1P!(vP7pGEWXr>K#%Z%O+hxfbN1<-IW_iB!rsAn}!;o%Ppyrw7Jw&Y;NFI2Mad9x*C&S-yxy?7HPo&sR_E zw#S}C-o$@;0FfqH!caMgGgoUM6*k|3s3Kz?%};w=ar%f3&c{y{P2g^>ZY$h7eBYuc z(g8E-c|l1~S#`02H7~=V+$GfZdDinu- zjUxz&$5rlK`h;R?LxjbGM?5J<){wha7bl+6PX&443Fbc?NlbZDeE{Ly75uR_1%gOo zs&;}zHcJ#P(_&9rhOboZeL7&&kikWYEkBgRlz*?{jT0W_71%-uGbV|N_L#~Q%ur%= zEKuEve%`Quv2R^q?rFmL40=TPlD@V)Pu~*@S!nOLC`EH0A^P>@CAUQvM0{kR5+dtq zeQ z>f|H-ws>MatU_dQ5>nZm!IFNpJm2@F*6tf8u`H@%bYx(L(?6EY>1 zVPf@wFgCR3WvQ1=RIz0?Z4~Pi(WW=!YT77zVHRY7Tp+p zhWg=7G9h}-7d^Xp{s;#S6`RxK|9acJ3b=FgCC?6+Z&r{WI3HI*@Yp*Mtd!=FFbw>PdbH}sSEzWO{d^>1lsfvA|kmNRbl*b z-8!oj5`+_W1*E{~f))9ITU*axKP@Wbf7kUpEla$CkC1>y-Jfba6fg38(pBEPqU0`W zTkEXz6OI&9@&oY>*=39Va51C#yd#Tl4HKycD-49d5*PIHtw$Dnj^K!SaI*zbGAPO$ zlV*J9$l@_IMjL)49V7*4I1J`PpIbbx0VyFEL~@%r5FoSZq7_fbcRaUv#7^TUop|Cu zdG`QmGD#iGv;ZZY%(p$a*hl&Xwj~(#OQUFQCS9^(zw*3%$Wg`0hHzMC0KrRa{beUz zy5fL*=g~zozxJqNq@h2A;|nXw@b838y?sTh4u9#W;=v8hn`9BzWdtZ{Wh`B`;?U}F zALu^@B{Gz>$j zcRPRg=wk1Nu+1?rhwn8Z;8v&D}q}!pH zL;_Ixt$0dx(&vvUb{>IIgmOgj5h0a)6dQ7Bzo3r|d=4QmIu}Ip`g!l5o$OYgFE->` zsk2Ehs=rsv7%>zG8V*38d}Y-hIfTU7U+W4IVQh%M|CjYb4@LoWJ?1FF_Aq$Vn)PPPz;TIgQ;`RW;e9Z1Be{>o&Xzr=Wy@|BN5wJQanXW|bn z0hmDuZ(BOJC^%d__JPNpUIQiTJKFV3&=3gDp}Cc^M2MHG3zT9 zK`Cv{p<&cFt!BM+!-_5RDtj&nfd)bs!HHUNfDVUjiygqWo$vj}AZ3)1T3Z;n&?2}h z2ax;zvDj;b;Ydui1Uco})sae6?Mk9`B_-EF7o3GuqHHG*GjxV$`hw!bTEKX$u%!Mm z;q>P7$tM&?jnJKYd&a1`S*zPvX#!FlSre=B#*r|E!?#E$KkdYVt-rz~v4^U2f^Sot zRN{~mi{~(5k42v5)Ra9g;LgQKaqZbi`no)Dpe7;o`*Qgt)Ji;fyH<0wg5rgqM8XrE zw1FIll_7nhlu{lpk0>9U`b8BCIZkX(ARNo^hM|w)B9Z%Hbt5b!ryz(R z^$iP-E&`-{fIi1&xTX=Iu7pb#ACPFT>qzu;FzzS{B2-HMvtkhq{*Qe)L@=mFH3+I2 z@H`I*n9O^>MEqxxdVrgHKIbLz@vXG@XW$#6A9qUXb>2&4V+M@4%{oO=!)}=6--?oh zw?>+bmEKUU1oA(hezszteDYqcM*hQI&|yL{#d4&clq>S-Ng2jz|5iLM@AsbO+J&AS zzgSUjtWsYf(YmL)8y{V`J|(k^1IRrymk;?v&QAW*~3D39Ln4vL?$DapGj2ds%T(-v7S{S`PUdd6H(BJnQIi$nyfzueUs%2Rf`-m;xV; z;ll|qANR826%8;dXC8V8rEC+3sPum;j{j?&)uR`gTlEMlJfr}~!4k#Ooc4<19HgwU z-5ie8C4fN8wNBLu>cIgT z2Oy1H9V-sw@2A%c4g_l+p{@1V?*!n!c5uMz#8N1{1%Pl?y>#aAfEZ9&p#U_JBEb0T z1_wYwG9d&~JegHJy?)0sxNdA6T&J^k+_xH1cb+LPf5Dl>ng->7ejw#ke25?C1gE(kr~l7Ju`Q#;ke-_KbR-rIL6jo%6uM9Me<WHq5;e=YJ3cr6@e$4O z3tn36wBBN8Z43W!Y75EZJ6~6H_{j#X)RVEnM(5>;KaN(ByM1)jSYRtc+L9mh`eM(T zVp@SO{}6T&VUCh#UtesJQ(9h$TsVkB!e+qJ$4Y6L$S0pw?7dzRVPRLIDq01` z<`0}z?6rXtx)l=`hb#ubtA@JzEQ<_S22&<9BQ7P@8Dlz9wVTSgHbE2>k5jHnUdndN zp-Mq$isV_I9Ht}DUb8^62!S`oKk(sv=NtUk2-XEC{EdXoloNT^vu#rlOpN6ls>z@S zuEubrIJ=m@%UDFAo;n(w&`Y?qY;Um0fSmXg-Et$MvGn#GPslsGsW@;ii}(XgR|kRI zsCd&ON_yB*S&aacm+g3LzW3|Jp7|HgXsz1IEJOrHUQTUB);6qihh8r@@f}XQ>rKTZ z7YH#*0Ibu3!0xb=W?QGcbH{wo*Nd?_4G|HBP>5toxzTufm;V3Xt;q(omxdeRk4Q7g zchcpl?8WlY;1YUJyMznrW+ZFjdw$>WJ_{^p7r)Py!}}2WPQV&Kc(fUEwC&vI{loh# zFs@zvJ|7sqYM26bh|M%O4-uAa=QdYuzRlKlw~OEA>dik#v83{6s?ES~sI3=2=Yzxh zEO5zP{G9(B-Uqv4@s~syhNShwLY-}Ooeyokk8lx?^;d7*#qaas;eDhCNDCy&v_f!% z;&y(|M>gMQYe(M2?{m%YKIj=}1tBb6M-H&PZgA~i?_=_W2MLA2D4UHqw)GA^I=qjL z#s+*GrlCTQkHdC;&&P)MS>OP?`0x3+`|R-cVsaBq10NyU!EffYb5zcnM&W*#{ zEHElw{5CfYe~wBGObhahE31Hgd!zJ|oA0BRBjkbBp32~O@%#MO@II4%hj*szJ6LRx z-QwqbYIqJU31X19{JdocQM{dVK0Q1~kfP*y7O2h?0?f0Wb3U{A9Q8d|JYY8n(jE}o zIp?#R&nXSY)J!ucCd=O5tn<0e=SWgxZ#I?voR!owE&dKZKRky@4gg5J1r&-*c{}HP z!8!L`r0ayE2U7<)r-TH)wfJqmSe??{i1twCrbL3^Xm)!y`O@&gaHJG7Or==SK`yuV zW4^rk94ZORyzot#SD3Xg{$yX-d=A7&K!``;`X{^E&N*M*d=4ir`8X9i-GFRxJLlZ& zoRi<`rOCHR$mr!F{D+P${%E%hPf@5LS)?4DHV^PkT>O-;4NnmyV=qvAEVN)`+d1Xy z!yglyjvm`&h4AenKx^Ye3(C(4#7eef7jow&Y9fA zb(sVMN+@fD#BJx4JBGI*kdZ5TabqHVvQJOzdr zV|herS>SPO;ecqcmU@Xal+D(Cl;%EDyxpOS>1KHxM~gpojo)Sn~yWH{)S zzYS+8;NpkKGK_+}128Mw!ybl8MzS8;-ss%FsM?K@Q2he`nJ5Lzb5Ge`gD3JRg*e6> z?_l2Vy~SfUC=~%J;naa7qf1A|1xJvLYV+s#+Kx7c%oa)MBTsHZY_OJ#pm z-H%yOnEV=KO7J9V>DR+{@&h~*#}(+i+MwT5?dW?uBFZK>twnh~mc9HvRw_ypV$Ue3 z7szATtM({*HNb*LX#-`j?9pBWQUDKpIV?H*naRBWmC#!h68lq{Qfvzyu5!ofDz+&W zhD-f*2pb^<%^p{=2~e=x;XO(Pisny$+A+6x-|b0t$*cI5Efy!{s4GnO@0d6Iyy&eb z7@!rzp4)Q(JeSXYKTQr~9B&(iohVHZw8F-7-(U3ViX=Jn5=E$605A5_sVhqn&-$Rj z6eBZ$LojzqR6kJc+X&DH35Ep1eMx50=_{XENp23iz17$Y;-HF&tTT3B#6NCll)ZAx z6F1Qy={@jiu?@M!_M)gWR+gHY#)6WcSFJ25q5U>)EuPuVQ@lEV;OgSh4Yj)PA`o&^ zYsl`?YgYbkzUld`-S(uW;1mL)47)1|_w8IOzyIpuu_Jy0s3x{~2}NNiow>5y3l8%t z9@o)^8>6Pzt^9wveMs}*ja%;+w4GbLKHvAj;^8%xXcPt38b}Xvq?_;gVDZQeKn$R3 zunzR*iYng_f4s+r@UmC03T^hCVK8S`&GZX1)bfakD3NO`evC_xkYgeo*=0ymP#b;B zf7uS;L6)(}Ab7AjbU62x?RH(Dk908tVK{p*|5dwXJ#0@@_l%WM)V~kf1$@9D>z&rH z{CQK=PG~6PrY8!Dh~xwLAJ?e~MZ`QI6@Zgj$8+n$#UqfGTscVOz%HYB(lL_b`0Ivh zFKm(;*QmzxqtlyLZsFE()`yB+MrP!NNE4FU*tJ)t_aD^*=-ITEI42*8)#nsEt^6Sb zenySa1EfZL}bJDiGBjrrfe^wjh4v}muBRdY3GyhT+S0`zp@%F;o!MxE!|Si7-b zG|qE**K3Mn>mi&$IqLbU<|uvB#Vae@JCQy_G4_jb)9{SFq&zS`!t}))ZSy(0ate$~ zS8iFepn`%?DF_frNS57CZ(n&trT%Yyw5T`yL^wNA397=teJWkHa*IlYx=bGI1jm9w z0(ZvKJ62Yu1|s#ab0&+3-HNBD^M;QV2i3_n^<8K%xY0(2lj&V6^RbUE4r*}Pw>S~b z=!@c;$#nV3EhO_S)V&Jw8R?I*COVmSugnMRSv+N7HOw&|r{Z3qXMfMizv|f=6pN-c zo4~-l$pchEuG~Vo9->q73M@MyNlcR7w{rhVZGK0)wNqmbJq#B&S0XU%begVQxrG?L zhTS)a?PX$R766RqtFDV`tSEE^&FMYT($VSsm+N4l(rv&b+FxO+b#j^FSmFl2HHT?^DNc#P-eDe*&*0f$Bm zdgsk*YL)#q3S#?a!1P>j$0BI22 zQM#!-+O7*7*gUJI<1zt{=%-Is2NX|H;R*35Rs|lNiM-#Zic5%Yr;!<8vhc)=V((Ao z13pz;v_1-w)I9>beQKp97k#>Tc0DYA7}AK7{2LsfKC`mi_*h|&Fj}xBu%cO0$o<*D z0Y6K2k4<%|y+k_cbAto$a7(7i5R=5Ui78HXpeF0KH8>TaYD>tcjTJsy{5@fdE>Gp7 zhE05-#P^FU^9es}{>uo-Gj4~-!(Q8bC+29I5BOq;dnirip&)k}8QMCMgsPp>{n%`% zm5oEB0ZBsDPOTDqq^r7Qi=>q0t5y3b4Ke1&PSiqn1qrmx@%K?Di|OFR>yfDOX7heu zq}TB~b!3$i(m;bPL<#=-U)EE4Nrre$8|WsKeE66AajXqAOWbkTDbTOjlcanUB3X)J z9oOHh73-_etlCLrh@Sj@w3E3jWC`(8Em}%nls99UAPG^TS+z@Bp}}k{=u8;&ktLMv zSZs5E?Uy9pV2(L8n$b>Nr5++`bvTbGCmzqWn~Rr@*c>H1Ram8fDQGorUzzVYt9WdE zg2p(d-;ZJ zl~^V#<)CrurSA_;z*W(+8f*Lo?W%1*LS6afg3npttxC#iH7&k^-n)hedL*+%p#4w| zSbfqD1_!WXrn6X`aDl#D`r*oa+RIwK8cndmEnS6D$0Ue{`+BiYO+0R_V`hT7GdJg- zeVxvXh6(8`N23pe%iD@@GJZuwx%-)1shPGWX+^B>@zr zW8z{-ubKq0`e?r68c{`JgR^doguZ;Ph5@9!a}X$ zAHP|=sWxj@EHO&_qX#NEy!czi`=|o!Y#9*+r9U#WlaKs%@!ApJSrFs<8L`R%Blo)h zn?;e2y0xh1N8MT+Ta%v}4!Sr&PMFf>d@JFFeZJ%pCJLWPblA?{yHzbY8IO&RW>sbD zCw8LAyWUpp-&nA;{c`1WX>7eQ)~?u@&#o|lcnM}T6)GmQUMbyG->-<+g4F)i%E~=k zL}aYZ@mF9T@! ziH3X^W(maHLcdQp#}xrtA;Z4ZD^{!0OZOXySK3EKy(mPUmH|Di+oeAbP5`dZS94V{ zZy-N==`ZC8?V5SoZZ`6B3p%H&c5Z(UrD{(oZeb9R*h@_?lulb!?OLP63*U}UwgnVK zdLo@ZH~?%HVi3?NZw+6~^vYGGu4g^KLl_87j!jHR!(R4%70`M(9Z^VxX+za1r&q12 zv`1Ud4C&RY#8}P!8&nkHQ~9~#U#aL^dd;dqIkRX?&4<84m_;Zvn_jyrs;Q^zTd(|Q zuG*s9v<~7XKO!|FZ7`4a)9Y3(GR&Xw169m$9sm&-X@-W(zM<)?Rr%gWDF3j@f+23c z58_Q7SKj}J#oOzYX8tlBHi}eO%$>ceDmsuFDi^Rx8j}!vVQdEQh_%ICK7axW{}_qA zbMmD>D#qDTg-UiRDw3>Y{ZYwZ*-o1x3GyC^V?)j$`77IfQJq|;pvVwB#*8 z0HcB-$_&W9qrIjV3C1ZHY{n%S?&gbsq^LoK&7@F9un`(ds19GORy zo3_MNL}S)$qGLr$gq^*7^8dJs5?q)SXj~o_qnwv)+_MhUFs#r=g!z^M`QEAv4hyN3 z0%i5qw#rnCq}DgRWmP`;nZ=O|_#}0Nm+_Iu#zjDH9UKUqS;)Rs;FlHA>21FL_04~5 z(A%)!agQjt5LWSdYp9ms(f{Ax1OL%@Wktv636n= zN$)nIsr~9yk!qzaYRdkVqE4nOh6jYH%)OMoE5Cs(rS}XD;JD?ZR8va+yZ~8Wb%116 z_7g?9O7j(c_VcN~AO(bz0@eI6O^+()*>vULIx=ZBHBkEt&=`t4K zWp2xh^nq2SKBvwWgrJ;}2pWd)bv#`)H~=U2Bf^VV9ibPJu3ifAlv8=y;BRr+w*{)jpSmOY77$_wD;%5J9C3!_EPOpy{L42{puq59-D0|A5H3 zeA+LC1&W~5T}FMCjZdLp`MzHk^E;J}CrXFSu3*a9bls|dIp&B%dsBJzVN%)G{Hi#( zHeoK{0pt}#4Q9WW@A_3SwzEo8d?MjjH_DgdRo5jH^nab#$Ok$U8dzmAx@GalK_E+Zd~x_MRRgNvB znHq2e(mTmC8cYGxo)Q%a?|CfeCT4=tAK_mJYvK{2V?#ahKRM(XP16Ooa>9*zKJ0 zmBC&1R9B}~$E1xzHQ{XUF8SO)7RT)cNGDx{pZi!$KDYNKZyx>>{J8=g8|p^yrb5`x zgWXd76u($Dr*FXsWzNGGcv~ImYt>yQ_Y5;5u2Mu1s`Lof7k^)0uWq6`T?!03wC^JT zXE@Ps>n7hA{uFVO${-OWS62b#W>|k4-~OBBUG_vBb8FJ=V7JQChGFxz?vi)-OY!J> z6lmB!IXuYdA>HEJtMV=HL$vYC6T48nB8qvlrCY7WR}_zg3d&Jzog=6dE?F~fTeT$< z0V)Wf)=Z)UJiimiR^G|IxM`V~NDtw$> z0o=8lzI*wr^y9$+)EWR$p`a2hc;IaM-@yS46#q@=1xQdonNN2Q4utH2!a)iR zBZ`9cpRCGRzZPquKipz11e!1CS{>U;JB6U83YMob!UdL5%KJV zH#?s09UM@9PWu}fG>1p8E8RC(^Y`7c^-gkOL6I*hcMNvBo$uSR^_04l5Gthuh~=Z8 zDE(&Dz$HEcc+)>sEKmYFlm2g2xWq5np@z9BMdH2&s0s=4iq);dT;GPhb}5i#i({?d z-(THQv}#nq6gYJUX)F%;eZFgT>&OjeZ__YQQ*3rB(D*~XbY1KCnn^?88~`_LS_xww zUE6y8hy+}ih>#07O23KHUVp9T&G__nqJBllXLru(Dtv;J(txl{*|R|XeDS*0^U3i^ zb^4Yv{X9lT`irkT(t2s#MjUF$h=n85BG*o*u3iMgxo>?dm+7PU4@4)KLEA^@P#bLrC6`KqgnN3FM$j=P5hj^}DrR+hCd+^@dV8gfT<< z^#0Wc=KFSQ?Vi89TdP*{<3YQzqq2<kx%-LO~>zUR@cSJy-3 z)B!RX9{_YI?@g;qTa}s|++4_lyWC)Wb}E1CF|BhNii@lUlns8fd8wWLYxQEl-lrCu zCU)Dibzpq~Lim~0WjR>@kSb@HL+k7j1%7t*7S(A%QnRQ~6Ap7wkDETXI*Q7UtXU2A^+$R8Qm>v5LjO7iREcy#dAWz=ZI(e4`8!XE9R={D0Dheo-mPue zVE$q6);5U$Z>;_+@y{VeKE{zU^g;nn=hND)(FPxY@M|FPu#^B$d@W=*>!sUPZ{Z|Y6UKT8 zA}src#rEgmm7nRw$oh(NNI!?bbQ?! zC)Q%<9xA$Ug8M-=I_owvGkX)$P#6e3rqT~rS5P`AR%(U~GF|g`qlO%gIEGc+UhwzA zl5&&HAC*I;m47_ZnyleD4QvxZ*lS5=@}|kwOiic)GbvpM0toNrOD0<$aZV zn2z~Jc8Kbc#R#+SUj2f6f4B9Jyl=O)Yrdh|+VChcL1_{hB#P5aJA?sPOGu!g7lww~ z*75xNu8&D=p)>#r%6p#}RBO+p_7lRZtoPFk0 z>qwRBaweud!Xn^Zr=4$@YQ3ix8hD6X$dO80zWkEMwJu6>Mkp5*shs4Kr-@NZx49T%ZEI^^{mi5iBWC2E2SgKok_nHkZx=~vo82y31YvnkZ=Od z)9+T7+JL(9JeHkMb68f$#nbOs=g}WG|5*XAz!9g&KwFRjUi`!0z?8BVla3!|50L12 zf2Caa8 z(w#KiKVv8X)>RgSSu!z3`pfE)RA=CY0SvrSkSZ0J%O@VtQlUR3q7p>d8b|8Ny5Y2Z z@&STwyAK0f#TGzcqK|IA`+(NJHsrMBb)_C5OJlOS=B)hl16n8MA3w3RZp1pTHkwj7lL>q>y?#w)DGT~h;xg42r4S*DEY4a}TFN%I zo<`Ff)@;FCnk)1%Q=hwut4GK4eotz3g|Bd0&&e}5Xoz|G#si+znixR`IUu<(0n4kp zD6VL)E524%4!gEAN|Wgu*W}Z_U;JBxaKp;GuJZAFVPk~$5-y{01XS1kAKR>_xse>I0aTlf|y`6oNm=W)_ri#mt zdTQ%&BM34%Jl+Rs0X$A`UXyoN(dw-Sv!MA2{DXp+na=n6W8|tZ82X^bM71A zZdph^D5ancHAK9Iw+;>nUBU^EEg&Z?R(R=cg9E<2G$Dcj)j_&Ty0ARZ<2u2!FCG=@ zZq7&-t*LmAPd=^nZq^ejg>Brz{gC|C6np8KE%k^Yr+^TXADclaQPbPkY@tW2>1Egs zRIb3?i0$XcAJSsig|h_Sf&}2iv8&=ca{JKMOE$F+k<`P+DBAK83PNZrf| zVcKYt-VB3p-=WGIp0^6aMVs$X=_P))vYf3EKW+@<0F)z;{Q>{v>j}8uqLWtC; zy~Gd-ALi1>1_z*@_H{1NEGUn7_Ty_xY_t&?aZH}roX;Z7Pr7c+maw{62FAQ1* z>h|9CC$>Cs6FM74>v2RFD4y+|c>S7u%PGx+2pYE<5jW)1j%dyCbuoqe!6pqmM=ul|SDadqGs;uEdTZyL-snm#%B^R4?$e#H^3<3>Qw-isK)x(cVn^Obky zqr}D<^9Kjw5lj~F>0x_>42nkWp~TsBhNn|J<%m=O>a4&86&o9l^K>fP0c{~wwj@Xt z&1?K&%XayIsT+;SIBcF|fvZ!rhv*{|mZUHsKPugP<58ZHjWW#*Wun9+A~mi~+;(+4U&P;|q`nQn-PvTPR?*9Q-^3Epe7EHD<(4Ol;< z$F}iM-x%HmW7VSum7Pfgc+@U>lW%UmiO^jl3SVJtf+$%0ly41B!LN!~O`}wl!tL$c z<=cZ(Hb&w{%q-PqdB}-+@w?o*=7QjH*k&PE>^cwxS=4~vX2HJFZi=yOBWVqK#QMsf zF@0xnz!s3I!o)ZL5_oYh-CiB2=~I9d!XP{@`S@JEYPL02ml_FYO=Y^RrM;K#7+i;D zRtbgROLdCDH=e$?Cf{^5$ruF!ZiA56YGrGu^!+uZa4U8);OB|1u#);r{ru;-);MMqyd@=pV;QF8Lr@#zZr@j7o$P9rmgER;?_dkKsME>dVf?zX( zmpm;DvVR47H*b1g>y1<@w9X7LRVIwagqpwlyw(x*tuw^*)4>lWISu~<;Jpw-bdY|w zri6h3dm*v{a^tdKa_#(y=eHiAE<-**MeQvkBZU&bSd%Z@QI=z%145M(M&W4Sp!fIy z&n}LulR3@DVrb134q#I59UQQ^m4Og@zf*-u@X~#Q10WVVi4x)w49lSB(l0F_A%=o8 zMky!n9DBS6fBLI6e_M*7us$*+p%vYhun;Kz>ophrq&SnFOMk?A`E@Y-&U|j2&^oJ5 z1WHZ?-j<_=M@jm>@~<1^?!gMJL)yw$E@7TQN-bGm;`zHg$rS3MGZ zwSi=pVR+aZOMf075MKvWzzS9I1ycPl)q#=FW`$}`l>_SBnsREs^o3|*aRI;@v!~ut zpO}?ymhB)OB?1Z@5a-sNd4yWD8yh9aA=M3=*C|GqF9fN{amgQSB|%sjRjlcZwFl>` z_ipa?n82DCKd8%x?4o)Xec8EvN^5e1RcRhR=vnocu^D!{qo;s1#-jd74kF1c9Xrx% z%Jy1#+sS+VP=+Z?&+-m0YK2;mQdVwc#kDk{zR#?#LWfA9i;@tgLs^L|t9EP+_!Pya zTEI#(#ZfozTDQi|#v~OWq^ZER9&1ZoVDOvrJ)|vNt5rI^VQrd8PmV7eO=93 zdehpk)V?B(;JFV#a? z0~r!XS7a6tdI?eyk^rSg9F?G&DV-2 zY29h-X49qBff`82S6BBW1)z95}gLK*2N?QyKf^0?f-GM#zXVW{@mK!+L zpe+(54724Q4>6smU*39tLm`EY9QY$oqGF>q_g!nZEEBLKl7q=&ofxrsx_oW9IxTcv zd-vM?^J%BH>iNH3(Rx^ot1J>lRf5R^8#|rvc}45xxDizkQ?Vm4NuYx5{IXM-<$EJA z;dx(~#}?%k&%M@5Aih#6VSyfu#Y5b@Z*AaiFCH;52M{g&Ru(ronyy^zhrhpi)P*SR z#izHP0>j5B@IVAzgN^6=`M0OH&Z$91?RSQE zdVC;^kWlM@8QJ)o%l~#p>z`sR=H|zaB>-4Fdj8!Rt*?UC{o>H(vqOn(sXx5-j2-e_ zAGhuIF&lSVk&pX*Yh7Od>eizkBVfd!!u=oyh|9sWCT_C6N06r%gCfPt`Pf&to&cu< z8;Y0tD|#+O+BIvRmu<88;QYB)w;r=8HjD)O>JCs4kmur;yLQX-9xG8|scj9DW%U)vgekUF5KXA?f4dX!yx8nEZnU)!Q`^(N>= z6*mIIY&XZAcl3wGAZ;7oXsZd&`-Wf(mR^O%(Nn!@{?e97xt6ZFzz3_C(e-#{af`X9Z{ zx?!Vbt4X-B!dMMUd0n{{hR(2*=mo%nr;yiaZ*LHd677?M`|l_M_)PWZF%O2bdf0H1 z*N;l;%B2%i!8#Z%%rF_W22MY#^^%5o*Vd9IG9aJ4QElAX>+^MIwa(wj0ndEJX3+0K zFb`#mmWj5C2Xz&3mL5FW{=#BI>x+xc0$*BtRDRf_niFp-9)g>L4n?Ag=a<=b^5ti@ z#u|wF-W(H+Schz0-c4Uwdvb74PtDzPS`VokV}MxY-%uhInEmus3zvP=7D@(gURyzv zKRX8zE-MbDNo)Wno)!~+ty)BCxI^!Srky*!2zw@ zdBhD}7+eZnEM**58@F}~ytUR1(R%=Erm+C`^Uu!1DwZNF(Ufi<+PR6m@r|usL#2_} z!IdqX1Odw9)*hPgJr4(T&Kreg9G->M$T7S~7>VRhzY$yj^$SCM$)ZhM*b%4Os|6L+ zFe+n<{Y`1_K%wco)q$F)pbWxeVH~kmGx_F!r-nhgD^6wMMmk-j&$jD1li)l%Cw zB03Aa;QND@)FwL=WPwUU;4(U&uX8`cCeD~{G4|{0$c_*E4 z%84(0k%8l=ic_;+P*=E~y!ZL7Zr$AB(*h=yzw&Y>`&%2D^GDPJe>bHIddyq?DE;?h zUF=8ILywFa{K`#XAo70o>o#luYHZwc*#)gj^%iTl#KI<*y!8B{yVsWKSPe3%zS}k- z0D3-L)A{n;I)rvnWhuKKd7k9AlYY9`3US7p4d$3+h?#Kbj1}0ew4_RXYX($!Z#9!G}7WVLnp+J(~d~FCY>2 z_<$c-Pt`8;GquC(5kVryaN~`?uf<|0#_(Mt8J?KUhrP9R2o0AFxU2_ui~||S*?&9u zWC&+~kF}XbCF1DxyTxATOWxM%+KNJSW3)-OIW>`*-T1a`#W8;zT;1Hq?L}=y>_fyw zKmDnUWA=$HGti!+hD5MQ)9L=T`Nk(S_pS48p{*eQ62Jw?pZ=@|9b7yzzu`s2NZxc& zYtK5wSyT}*h7yjztN&6x@yG%Z!>Rep7q=d|%L{2&j(Hw?d^;wnP`5UlLM%(uo!q*( z^(c}Qr9B}CGRvTG+v)Umxb%x#JMBI?dfeQL;?!eiUi2@q2zux!--?oCxxUJ=xWn#^ zSRe(T#ARaesO~2j&R@K^_2>q4!SfawCy9|6B*2n<(%W0lG&O=KB2A9E z8hlcE!@4I`Xa4-{tyX{}m@pn=Od(~g-Ms5%HWrjuTayC2L9;<;(>d!NA16H`pLky2m`M`y(Iqh`by1(Cic$ZwfgZLq=#)*wk z!+~~A5EQOExcZx8-qG5_PMP91TB@ic#z!FA)*Z9?@b2X$c7|XHrK5HpG9&FsZ(27K z)gtY@Td%oOKJ}{B^1NxP*~sm8wv;{M8Ej90bchYUP3q^btJtfLzf&N}XN&;Ph7(j3 z)FQL_hnngtLjMMYQ@3NXHNi*3Q;`(SHv-zj*YCWfJoLJt1v>t3N^VW6w z6NeRi7sNS`{-}60O$yfDwk|ghFAm$uqO;|`HR-~2vt_YM_4wU)3uTnMD)KjrE1gTPFc4ysKad^-E9h(5@3*ge zN+8JZt0=QR{+V1la_`LC&>@*8R7nD)CzKG%(5v9O3T`&l z$R8 zMgt3-&e$M;QWldy2kxcTLNj0(rj)G2cOxp%-Ihef$w^i9#&lFAIltbGdW5hX+L>HA_4sBq}KU3t6|E*b3|bSCVl9=RmWmQu%Z_2oN`h zvH{Tv-Zqy;ohToy!_Ox1j6fDiEKNBni;+P)^%fz4JHLH?iWB4qf z$=OCFby826=L8qg5X(^00IrP&m*=PQ<4w^z7N^Zo2|A>B8!!a~ap-kmTG1ro7*+T$ zMpe{DO#@_K6zPNJ$8E#NZ;>8Pqg7nVHQd1Cz=2@ z$o01|^am0RRzK}EiBoM`GpvB4P+gEr>u(Rf_2SGa>NcQOKzIz`3t<#~;UaJ=!676g z4JQcED2&m(Xi^V~AmL>L2~Y=*TSY_qO1Qm3n;>c;2HF&IK+EVU_~mMEL>z*Ugao>| zK_RF!=kJWl>`_T$kTYu8El>iO1yJDxm1Q% zaEXRK^vn2Y0eSUuM=w>D6eXR2nraA)Zk|} z`R|0!*8R=1Js6%I0S%q*FRB46T*h@N(G(%p}JA^HCks=Hoi1%_qN18}Jbz zAEpw|k9q!S%@MLXq0uhlYC%!(o-)hG&-k*g`SDda4M+w)V;X$TPhOi` z?BZf`ic+L_NF&SqZ=%=y(tmA&3s%Lu(h7u zZ)6;Z?ALYUzKsS7vqUnPRn0{>s+>II@Vn?FxpA|Xk*Z9FuK2V-178JbuMtE5iqI55 zi{cRe0N4|-$)U|&Y9bx1k)x1s1?SH?Rq1~p?IlODj3@nG^cu%mEOp30Z?FWSZ1Imq zLs_2cNHH5c){})*#0&A=ysssKlsg&+pSZwGVkHN-21BBw0W=hqTv!x;Y z#JHo`J@Q!+?kPZ>R<6d>gxpnX6oB~{zKMO4C2 zR}6_D$)Qv|t&rrGylWgFGLT-X@Q`GS`hzZn<|PtgP)h?wAgL#Q*taV0j^k z=(#|{2;Oy1NE6+ghy*ACq5}t!cZ~;kbGRMih2Rr_4b}|GumIX*)gJiCGm}8X-r@C* zL4H7UkXK65GajK_w1cWYAfIqWL3L~p9%#keV?kxR7!`CtTS3$&qUTX3=GjEf;eP(rM|=_$sMDTvggyC1l|~s5a^SGneyVi zhFFsDkK75&70Ldj*V8OLRzonHF~R(MVs*rk$$L;YvRd(wS@>aKA%H6U`(kw@+*R)Z zbUJfT_z%SLBxA4FzID#@k{JP3OG#YPYry~rjwq1^uf5kxi=#Zzp7y*xJP=Hizlh&U zHkYG0F8B(}A;my){KazpKJTy0FYc8J5;&ifA|M~+fA^7vMG!^nOV-kIAPQIjx}odd zE-e{JR6q;MxFJF)LHHMJ2i;RLMHAMws9R6}(O^3iAA~8;6-BS0n9v+8i3J`a<_Wr& zIEJh-lFUGwPrc!FqgfbQIFKPoR~kc+EB3hTRX>Z04ccrAOd6RASzi9qV0)r!Y}8ZM z9-~x3p*TgXK;?B54&LuIbRl0D6G1O7G(6;nEelUak5v$L1yAsxh*oJzsF#5cCL}|| z3XVb9M?lvVFwSd&z$D|m=k&O$G5y<6h{0EDtPc13GaH6lcrls)PKY&(;^c< z>jhGHz?A_L@3Th z&lzaZwZYV~Aqo|)g(@HkLkH60cf8)<&S1`flMocd580XW6D8Q^LG{Pk&hQBU0 zKB!^4mKwIxTDfE@;Mh|x5-lx?XyvIF|EPq$Hen;}kh)srJJQAMCcBO~cklQ5SVHAGMUHe2U;0qxO|(Llw6 z+-MmX|Mu{bzh(Yr+v8=kp|;np$5?5hJ|G(LPr1SDa!S4)KjtMf+Y}*2JERrIp>^fw zW1ew&@IZ&S2`WhkbVL!o`3JAS!J=a2b>N|4gfE$=oAYfImf(jmDd4<7@Z^ObP$lC` z5gf5Au74moxii??1?I*+fN(NaU_&!7ocb(TcJNA>QiR)h_pE>q{^<1~G-O@ojZqp% z`Mh6X6eFYcQ9^h`2MI)P2bFU%@f#L2Xuv=$*@9)SLEGC;uE`Eiy*7R%z+M)_U% zN!FsCWPR{5%H`m3?|l1A2Udzs5a^#7n#iIPUQz6fhbo6pc*X{4S0Whfgi4v&2#~y! zUWYgfqPB+tr2@c&rtu%Ec{&tm$bhxuZX4dG4MidYu$D><0QPLcpd z8Vjx)Pq+X9l@8=5>|%NUxR)pPPhP7SDG>y;peNK^;JwPDr@Wj*t?>knPC^z{D;O*O za(j@@j1FE##*B)}$y25jUpA%cs(>{?y~MH5DumJbl?yUVcB00!1R6|TGP>}u{gw8x z;P3_andTIz#qJ@*0_vo$V^-yY%_b|6deKyoQpu=(joj@?duVWoq*^915jKFb%;fSA zgedInud>q#IFg&U&YD)CzXRc!I?<)XrD~D#{imdDf??eO_X4fL4*{!Y*kWs~h#8T} z%p>;`U!Ev|aaPN5;AG)ou&9xw4!#4YnY~(^7z>!Xn@G#GqnVCyTE@zWM&|rfsPz(x zzAA4{9R+}b(8`|WL~F#WXL7r7bNI}t7C|h5;<)bPwU$R&-~KX4nU@<~nzK@)oL zjWs48t{+MkL9UiKroqh%c0i%IfUnvaLS@>NqNeW3CaI1X0zZMOdwFi&Otd+Zkd+^N4G^5*Ejk27MdNb?GaTyj#1uf zj}WVgi7#wmx+Jm)A?8+R0SE?U!QWcQ>h z-Nwe&v?7WzP;3e#qUFZ?mrnm$W!IF+SCux-2{!}WbgHq*NCZe#=_w@!fdBDg{a5UM zde+YEvMa8htTZG#3`RPSFi6&5eC%NA=^nDYiD{M?R6_uTq-+Io5~TA^drELma;S;v zk&ay^%YonwwIR4}ttM833QE7w@=b3EMMTf6U3O(~9M7VqR5mqkI=&1 z)*k-$*jMd}{~Y^TQ{$v#l(n|Gc5Dck%({==ZI_0>*E`2_O2re&rZ_oD1u9wKd(?g0 zYcl;Dlb?>Zhb4yYPb>>8wzbpkEH}8vF0cKOtrj*jv2;p7!PBDJBf^JGtJXc)$v$>%z>_vpw`aVvs`kYeOEYwhDA-&Zlp)Rp&*yT#e{CF`_^8U>!N06 z8ssC6JcXVZBkC2_23o&)b#K^rhnJZXGfmU6uiB}MT2BZPXv10ear^Cs;c;oUX_Sf? z&@5jhe5?Nnoj@esiw*sU47437^?AY`962BO{Q4t!Zw&gwO3j+z2Z| z;v2{xUBQqeXZc^)a!wjJ&-pDl)jz{uxsd-8z6^XRPnA*ad(xh2m z%gC1IQtKOewx#*Aby&K!GJ~umQq_vP`&O2dF%o9iOCIX&d$F|UP8@=WW-w>uYVv4fsal}VIa?b(4QpkCZ_ zWRqu{#e!jqRpbBkD=%v5=$t2sx$?#L^BKu&cuH#K_D(PDlDL~LD5H;TNNMA_Aep|i-j zQRa0vlfxsf?aUF2Wlm=^EAo&tEBxlVE~c&Zu-wzd{MC9yT68siqmMdGf@@DNnKrp> z35mMq#zv1h*Xk8=^$N}9x~^t~j6T=2YV^2sCEFqNYPW;Kw3OZFa;2qm=v;HL^@J35 zGySb)GP9fMV=b2r-OP}4Ryd8g^-GGYs-~_KJJlpw)zT@|{2}tBvO{-A#e@{MsGeO=GLx2Iqt&uXZ>4 zwdt*F?TPu>DEoVwlhzCJMur(|ZIZT`4B5>xA=6|=UUVkP3vEn>9Nd=NT3*j&>TPjO zo0JJ#9Vu#U{%CEJ$FewjyL^*nMp!TDpA?yt%~W_<{+?|HM_zGyDJ~J053{-d9nvHR zd$3c+~;o7VIKZSgIv?edQH-DO<`n@Qy|@Qu{O8ln)Z>s z&aiNo?YSl`vdo6(UsoRQ)67UeNs_J;>_T$pbub1hHl}_(vDzVb@dtrCp zmm|H*Kn!$tZ*x8d`qtj&JZ$s3y?MhQNxMG0s*jyMvZ{zja%CUW2CF=;4+i8@Ioii$ zTc1g{zGi^+xlHZLr!V9o{v`a<3BagCP)*V<;CYdef;*P`Upl$redQPO!@rVAg{CC( zwbMJ?_dt z48zFo8_M>`)nq~bFH)t9qJ4f>t9(BX< zGxvm7Pg;#J&9aub4W?F1Et@+1F}Hr@)RLHq^`}%_l37_Tr^d3-ZXd(^ezJDI24i^(tK0$MQT|wy()cMi zGQH}mr)&3^%O37(H&Su+^k>3fGyN}X+@kP+_r~&8*6N9iFq%c<%;4B_ZaogKT<6x~ zs+H@*i#|Kfv~TjfTaS}eZg3}r2cH_p6WJKftm?ALO}uk%qJ_*q&v;3j m-G)4Zsa022yy#;3r(QAT^2u3S-1=puGcK>(D*MheyZ#@(8zzhZ delta 237674 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 From 98595eefedffa955705a6256add778e8a62ae8fb Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 27 Nov 2024 21:47:14 -0800 Subject: [PATCH 07/41] fix(segment properties): fix negative constraints on numeric properties (#673) Fixes https://github.com/google/neuroglancer/issues/631. --- .../property_map.spec.ts | 356 +++++++++++++++++- .../property_map.ts | 2 +- 2 files changed, 354 insertions(+), 4 deletions(-) diff --git a/src/segmentation_display_state/property_map.spec.ts b/src/segmentation_display_state/property_map.spec.ts index fbce7ba0c7..51305ac3da 100644 --- a/src/segmentation_display_state/property_map.spec.ts +++ b/src/segmentation_display_state/property_map.spec.ts @@ -14,16 +14,18 @@ * limitations under the License. */ -import { describe, it, expect } from "vitest"; +import { describe, test, expect } from "vitest"; import { mergeSegmentPropertyMaps, + parseSegmentQuery, PreprocessedSegmentPropertyMap, SegmentPropertyMap, } from "#src/segmentation_display_state/property_map.js"; +import { DataType } from "#src/util/data_type.js"; import { Uint64 } from "#src/util/uint64.js"; describe("PreprocessedSegmentPropertyMap", () => { - it("handles lookups correctly", () => { + test("handles lookups correctly", () => { const map = new PreprocessedSegmentPropertyMap({ inlineProperties: { ids: Uint32Array.of(5, 0, 15, 0, 20, 5), @@ -39,7 +41,7 @@ describe("PreprocessedSegmentPropertyMap", () => { }); describe("mergeSegmentPropertyMaps", () => { - it("works correctly for 2 maps", () => { + test("works correctly for 2 maps", () => { const a = new SegmentPropertyMap({ inlineProperties: { ids: Uint32Array.of(5, 0, 6, 0, 8, 0), @@ -65,3 +67,351 @@ describe("mergeSegmentPropertyMaps", () => { }); }); }); + +describe("parseSegmentQuery", () => { + const map = new PreprocessedSegmentPropertyMap({ + inlineProperties: { + ids: Uint32Array.of(), + properties: [ + { type: "label", id: "label", values: [] }, + { + type: "number", + dataType: DataType.INT32, + description: undefined, + id: "prop1", + values: Int32Array.of(), + bounds: [-10, 100], + }, + { + id: "tags", + type: "tags", + tags: ["abc", "def"], + tagDescriptions: ["foo", "bar"], + values: [], + }, + ], + }, + }); + + test("handles empty query", () => { + expect(parseSegmentQuery(undefined, "")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "id", + "order": "<", + }, + ], + } + `); + }); + + test("handles single number", () => { + expect(parseSegmentQuery(undefined, "123")).toMatchInlineSnapshot(` + { + "ids": [ + "123", + ], + } + `); + }); + + test("handles multiple numbers", () => { + expect(parseSegmentQuery(undefined, "123 456")).toMatchInlineSnapshot(` + { + "ids": [ + "123", + "456", + ], + } + `); + }); + + test("handles regular expression", () => { + expect(parseSegmentQuery(map, "/xyz")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [], + "prefix": undefined, + "regexp": /xyz/, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles prefix", () => { + expect(parseSegmentQuery(map, "xyz")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [], + "prefix": "xyz", + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles prefix", () => { + expect(parseSegmentQuery(map, "xyz")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [], + "prefix": "xyz", + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric > comparison", () => { + expect(parseSegmentQuery(map, "prop1>5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + 6, + 100, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric >= comparison", () => { + expect(parseSegmentQuery(map, "prop1>=5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + 5, + 100, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric = comparison", () => { + expect(parseSegmentQuery(map, "prop1=5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + 5, + 5, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric >= comparison", () => { + expect(parseSegmentQuery(map, "prop1>=5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + 5, + 100, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric > comparison", () => { + expect(parseSegmentQuery(map, "prop1>5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + 6, + 100, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles numeric > comparison negative", () => { + expect(parseSegmentQuery(map, "prop1>-5")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [ + { + "bounds": [ + -4, + 100, + ], + "fieldId": "prop1", + }, + ], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles sort field", () => { + expect(parseSegmentQuery(map, ">prop1")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [], + "includeTags": [], + "numericalConstraints": [], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "prop1", + "order": ">", + }, + ], + } + `); + }); + + test("handles column inclusions", () => { + expect(parseSegmentQuery(map, "|prop1")).toMatchInlineSnapshot(` + { + "excludeTags": [], + "includeColumns": [ + "prop1", + ], + "includeTags": [], + "numericalConstraints": [], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); + + test("handles tags", () => { + expect(parseSegmentQuery(map, "#abc -#def")).toMatchInlineSnapshot(` + { + "excludeTags": [ + "def", + ], + "includeColumns": [], + "includeTags": [ + "abc", + ], + "numericalConstraints": [], + "prefix": undefined, + "regexp": undefined, + "sortBy": [ + { + "fieldId": "label", + "order": "<", + }, + ], + } + `); + }); +}); diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index aa1c798530..943bee7110 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -697,7 +697,7 @@ export function parseSegmentQuery( continue; } const constraintMatch = word.match( - /^([a-zA-Z][a-zA-Z0-9_]*)(<|<=|=|>=|>)([0-9.].*)$/, + /^([a-zA-Z][a-zA-Z0-9_]*)(<|<=|=|>=|>)(-?[0-9.].*)$/, ); if (constraintMatch !== null) { let fieldId = constraintMatch[1].toLowerCase(); From c581f201aa3012ff6824c8e4507fc925dd83b008 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Mon, 2 Dec 2024 13:34:20 -0800 Subject: [PATCH 08/41] fix(gzip): Use Compression Streams API in place of pako (#674) This is expected to be faster and also reduces the bundle size. --- build_tools/update-conditions.ts | 4 ++-- .../parcel-project-built/package-lock.json | 5 ++-- .../parcel-project-source/package-lock.json | 16 ++----------- .../vite/vite-project-built/package-lock.json | 5 ++-- .../vite-project-source/package-lock.json | 15 ++---------- .../webpack-project-built/package-lock.json | 5 ++-- .../webpack-project-source/package-lock.json | 16 ++----------- package-lock.json | 15 +----------- package.json | 10 +------- src/async_computation/decode_gzip.ts | 23 ------------------- src/async_computation/decode_gzip_request.ts | 20 ---------------- src/datasource/boss/async_computation.ts | 1 - .../enabled_async_computation_modules.ts | 1 - src/datasource/graphene/async_computation.ts | 1 - src/datasource/n5/async_computation.ts | 1 - src/datasource/n5/backend.ts | 9 ++------ src/datasource/nifti/async_computation.ts | 1 - src/datasource/nifti/backend.ts | 14 +++-------- .../precomputed/async_computation.ts | 1 - src/datasource/precomputed/backend.ts | 21 +++-------------- src/datasource/zarr/async_computation.ts | 1 - src/datasource/zarr/codec/gzip/decode.ts | 13 ++++------- .../backend_chunk_decoders/bossNpz.ts | 12 ++-------- .../backend_chunk_decoders/ndstoreNpz.ts | 12 ++-------- src/util/gzip.ts | 9 +++++++- 25 files changed, 40 insertions(+), 191 deletions(-) delete mode 100644 src/async_computation/decode_gzip.ts delete mode 100644 src/async_computation/decode_gzip_request.ts delete mode 100644 src/datasource/nifti/async_computation.ts diff --git a/build_tools/update-conditions.ts b/build_tools/update-conditions.ts index 6581bf11cc..873829e161 100644 --- a/build_tools/update-conditions.ts +++ b/build_tools/update-conditions.ts @@ -124,8 +124,8 @@ packageJson.imports = imports; packageJson.exports = { ".": "./src/main_module.ts", - "./*.js": "./src/*.ts", - "./*": "./src/*", + "./unstable/*.js": "./src/*.ts", + "./unstable/*": "./src/*", }; const tempPackageJsonPath = packageJsonPath + ".tmp"; diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 84b1c7eb7e..8b7cb6c2cb 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -28,11 +28,10 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "node_modules/@babel/code-frame": { diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index d48589d7eb..a365a3d15c 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -18,7 +18,6 @@ } }, "../../..": { - "name": "neuroglancer", "version": "2.40.1", "license": "Apache-2.0", "dependencies": { @@ -28,15 +27,13 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "devDependencies": { "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", - "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -69,7 +66,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -1291,11 +1288,6 @@ "@types/node": "*" } }, - "../../../node_modules/@types/pako": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/parse-json": { "version": "4.0.2", "dev": true, @@ -9458,10 +9450,6 @@ "node": ">= 14" } }, - "../../../node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, "../../../node_modules/param-case": { "version": "3.0.4", "dev": true, diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index 4c96409511..426618e87f 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -26,11 +26,10 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 7427d782d5..92a35cca70 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -25,15 +25,13 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "devDependencies": { "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", - "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -66,7 +64,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -752,11 +750,6 @@ "@types/node": "*" } }, - "../../../node_modules/@types/pako": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/parse-json": { "version": "4.0.2", "dev": true, @@ -8554,10 +8547,6 @@ "node": ">= 14" } }, - "../../../node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, "../../../node_modules/param-case": { "version": "3.0.4", "dev": true, diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index 557bec6cc3..281acb7b1f 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -32,11 +32,10 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "node_modules/@discoveryjs/json-ext": { diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 307be77270..2c9d8f5e54 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -23,7 +23,6 @@ } }, "../../..": { - "name": "neuroglancer", "version": "2.40.1", "license": "Apache-2.0", "dependencies": { @@ -33,15 +32,13 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.1", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "devDependencies": { "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", - "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -74,7 +71,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">=20.10 <21 || >=21.2" + "node": ">=20.11 <21 || >=21.2" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -1296,11 +1293,6 @@ "@types/node": "*" } }, - "../../../node_modules/@types/pako": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/parse-json": { "version": "4.0.2", "dev": true, @@ -9464,10 +9456,6 @@ "node": ">= 14" } }, - "../../../node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, "../../../node_modules/param-case": { "version": "3.0.4", "dev": true, diff --git a/package-lock.json b/package-lock.json index a44c39f48d..bb11614bf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,15 +15,13 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.2", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "devDependencies": { "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", - "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -1666,12 +1664,6 @@ "@types/node": "*" } }, - "node_modules/@types/pako": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.3.tgz", - "integrity": "sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==", - "dev": true - }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -10421,11 +10413,6 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", diff --git a/package.json b/package.json index 3ac3f3e7b1..81747aaa2f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", - "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -83,8 +82,7 @@ "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.2", - "pako": "^2.1.0" + "numcodecs": "^0.3.2" }, "overrides": { "@puppeteer/browsers": ">=2" @@ -265,12 +263,6 @@ "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/backend.ts", "default": "./src/datasource/nifti/backend.ts" }, - "#datasource/nifti/async_computation": { - "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/async_computation.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/async_computation.ts", - "default": "./src/datasource/nifti/async_computation.ts" - }, "#datasource/nifti/register_default": { "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", diff --git a/src/async_computation/decode_gzip.ts b/src/async_computation/decode_gzip.ts deleted file mode 100644 index 68eeabd70b..0000000000 --- a/src/async_computation/decode_gzip.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { registerAsyncComputation } from "#src/async_computation/handler.js"; - -registerAsyncComputation(decodeGzip, async (data: Uint8Array) => { - const result = (await import("pako")).inflate(data); - return { value: result, transfer: [result.buffer] }; -}); diff --git a/src/async_computation/decode_gzip_request.ts b/src/async_computation/decode_gzip_request.ts deleted file mode 100644 index 91dddb6b85..0000000000 --- a/src/async_computation/decode_gzip_request.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { asyncComputation } from "#src/async_computation/index.js"; - -export const decodeGzip = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeGzip"); diff --git a/src/datasource/boss/async_computation.ts b/src/datasource/boss/async_computation.ts index 69e1442c3a..6ffe0e5ecb 100644 --- a/src/datasource/boss/async_computation.ts +++ b/src/datasource/boss/async_computation.ts @@ -1,2 +1 @@ import "#src/async_computation/decode_jpeg.js"; -import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/enabled_async_computation_modules.ts b/src/datasource/enabled_async_computation_modules.ts index 94f0d6043b..2607da3fce 100644 --- a/src/datasource/enabled_async_computation_modules.ts +++ b/src/datasource/enabled_async_computation_modules.ts @@ -5,7 +5,6 @@ import "#datasource/deepzoom/async_computation"; import "#datasource/dvid/async_computation"; import "#datasource/graphene/async_computation"; import "#datasource/n5/async_computation"; -import "#datasource/nifti/async_computation"; import "#datasource/obj/async_computation"; import "#datasource/precomputed/async_computation"; import "#datasource/render/async_computation"; diff --git a/src/datasource/graphene/async_computation.ts b/src/datasource/graphene/async_computation.ts index 69e1442c3a..6ffe0e5ecb 100644 --- a/src/datasource/graphene/async_computation.ts +++ b/src/datasource/graphene/async_computation.ts @@ -1,2 +1 @@ import "#src/async_computation/decode_jpeg.js"; -import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/n5/async_computation.ts b/src/datasource/n5/async_computation.ts index df029623c4..db56b860ff 100644 --- a/src/datasource/n5/async_computation.ts +++ b/src/datasource/n5/async_computation.ts @@ -1,3 +1,2 @@ -import "#src/async_computation/decode_gzip.js"; import "#src/async_computation/decode_blosc.js"; import "#src/async_computation/decode_zstd.js"; diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index 4f51ce2c69..ef3faee19c 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -15,7 +15,6 @@ */ import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; @@ -29,6 +28,7 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; +import { decodeGzip } from "#src/util/gzip.js"; import { isNotFoundError, responseArrayBuffer, @@ -62,12 +62,7 @@ async function decodeChunk( let buffer = new Uint8Array(response, offset); switch (encoding) { case VolumeChunkEncoding.GZIP: - buffer = await requestAsyncComputation( - decodeGzip, - cancellationToken, - [buffer.buffer], - buffer, - ); + buffer = new Uint8Array(await decodeGzip(buffer)); break; case VolumeChunkEncoding.BLOSC: buffer = await requestAsyncComputation( diff --git a/src/datasource/nifti/async_computation.ts b/src/datasource/nifti/async_computation.ts deleted file mode 100644 index 9f856a9efa..0000000000 --- a/src/datasource/nifti/async_computation.ts +++ /dev/null @@ -1 +0,0 @@ -import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index e3670324e8..0b8192e8a4 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -16,8 +16,6 @@ import type { NIFTI2 } from "nifti-reader-js"; import { isCompressed, NIFTI1, readHeader, readImage } from "nifti-reader-js"; -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { requestAsyncComputation } from "#src/async_computation/request.js"; import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; @@ -44,6 +42,7 @@ import { translationRotationScaleZReflectionToMat4, vec3, } from "#src/util/geom.js"; +import { decodeGzip } from "#src/util/gzip.js"; import * as matrix from "#src/util/matrix.js"; import type { SpecialProtocolCredentials, @@ -59,17 +58,10 @@ export class NiftiFileData { async function decodeNiftiFile( buffer: ArrayBuffer, - cancellationToken: CancellationToken, + _cancellationToken: CancellationToken, ) { if (isCompressed(buffer)) { - buffer = ( - await requestAsyncComputation( - decodeGzip, - cancellationToken, - [buffer], - new Uint8Array(buffer), - ) - ).buffer; + buffer = await decodeGzip(buffer); } const data = new NiftiFileData(); data.uncompressedData = buffer; diff --git a/src/datasource/precomputed/async_computation.ts b/src/datasource/precomputed/async_computation.ts index e6b6457a4f..16f6033b9a 100644 --- a/src/datasource/precomputed/async_computation.ts +++ b/src/datasource/precomputed/async_computation.ts @@ -1,5 +1,4 @@ import "#src/async_computation/decode_jpeg.js"; import "#src/async_computation/decode_jxl.js"; -import "#src/async_computation/decode_gzip.js"; import "#src/async_computation/decode_compresso.js"; import "#src/async_computation/decode_png.js"; diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index ac308f0db0..4ae0bacf1b 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -30,8 +30,6 @@ import { annotationTypeHandlers, annotationTypes, } from "#src/annotation/index.js"; -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { requestAsyncComputation } from "#src/async_computation/request.js"; import type { Chunk, ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; @@ -84,6 +82,7 @@ import type { CancellationToken } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; +import { decodeGzip } from "#src/util/gzip.js"; import { murmurHash3_x86_128Hash64Bits } from "#src/util/hash.js"; import { isNotFoundError, @@ -219,14 +218,7 @@ function getMinishardIndexDataSource( cancellationToken, ); if (sharding.minishardIndexEncoding === DataEncoding.GZIP) { - minishardIndexResponse = ( - await requestAsyncComputation( - decodeGzip, - cancellationToken, - [minishardIndexResponse], - new Uint8Array(minishardIndexResponse), - ) - ).buffer; + minishardIndexResponse = await decodeGzip(minishardIndexResponse); } if (minishardIndexResponse.byteLength % 24 !== 0) { throw new Error( @@ -352,14 +344,7 @@ async function getShardedData( cancellationToken, ); if (minishardIndexSource.sharding.dataEncoding === DataEncoding.GZIP) { - data = ( - await requestAsyncComputation( - decodeGzip, - cancellationToken, - [data], - new Uint8Array(data), - ) - ).buffer; + data = await decodeGzip(data); } return { data, diff --git a/src/datasource/zarr/async_computation.ts b/src/datasource/zarr/async_computation.ts index df029623c4..db56b860ff 100644 --- a/src/datasource/zarr/async_computation.ts +++ b/src/datasource/zarr/async_computation.ts @@ -1,3 +1,2 @@ -import "#src/async_computation/decode_gzip.js"; import "#src/async_computation/decode_blosc.js"; import "#src/async_computation/decode_zstd.js"; diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 3be3ef77e9..8003868eb9 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -14,27 +14,22 @@ * limitations under the License. */ -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { requestAsyncComputation } from "#src/async_computation/request.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { Configuration } from "#src/datasource/zarr/codec/gzip/resolve.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { CancellationToken } from "#src/util/cancellation.js"; +import { decodeGzip } from "#src/util/gzip.js"; registerCodec({ name: "gzip", kind: CodecKind.bytesToBytes, - decode( + async decode( configuration: Configuration, encoded: Uint8Array, cancellationToken: CancellationToken, ): Promise { configuration; - return requestAsyncComputation( - decodeGzip, - cancellationToken, - [encoded.buffer], - encoded, - ); + cancellationToken; + return new Uint8Array(await decodeGzip(encoded)); }, }); diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index 2ee975c7b7..e8f056ba08 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -22,13 +22,12 @@ * (each corresponding to a different variable) in NPY binary format. */ -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import type { CancellationToken } from "#src/util/cancellation.js"; import { vec3Key } from "#src/util/geom.js"; +import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeBossNpzChunk( @@ -36,14 +35,7 @@ export async function decodeBossNpzChunk( cancellationToken: CancellationToken, response: ArrayBuffer, ) { - const parseResult = parseNpy( - await requestAsyncComputation( - decodeGzip, - cancellationToken, - [response], - new Uint8Array(response), - ), - ); + const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index 6f7164d628..a4b4fa2150 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -22,13 +22,12 @@ * (each corresponding to a different variable) in NPY binary format. */ -import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; -import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { arraysEqual } from "#src/util/array.js"; import type { CancellationToken } from "#src/util/cancellation.js"; +import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeNdstoreNpzChunk( @@ -36,14 +35,7 @@ export async function decodeNdstoreNpzChunk( cancellationToken: CancellationToken, response: ArrayBuffer, ) { - const parseResult = parseNpy( - await requestAsyncComputation( - decodeGzip, - cancellationToken, - [response], - new Uint8Array(response), - ), - ); + const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; diff --git a/src/util/gzip.ts b/src/util/gzip.ts index 35ab3cfad3..118e037032 100644 --- a/src/util/gzip.ts +++ b/src/util/gzip.ts @@ -22,6 +22,13 @@ export function isGzipFormat(data: ArrayBufferView) { return view.length > 2 && view[0] === 0x1f && view[1] === 0x8b; } +export async function decodeGzip(data: ArrayBuffer | ArrayBufferView) { + const decompressedStream = new Response(data).body!.pipeThrough( + new DecompressionStream("gzip"), + ); + return await new Response(decompressedStream).arrayBuffer(); +} + /** * Decompress `data` if it is in gzip format, otherwise just return it. */ @@ -33,7 +40,7 @@ export async function maybeDecompressGzip(data: ArrayBuffer | ArrayBufferView) { byteView = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); } if (isGzipFormat(byteView)) { - return (await import("pako")).inflate(byteView); + return new Uint8Array(await decodeGzip(byteView)); } return byteView; } From e9c1ff74114f32c64e61ca4eb9515947b77b620e Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sat, 7 Dec 2024 21:56:00 -0800 Subject: [PATCH 09/41] fix(gzip): Fix decoding of zlib-format data This was accidentally broken by the change to use `CompressionStream`. Fixes https://github.com/google/neuroglancer/issues/679. --- python/tests/n5_test.py | 7 +++-- python/tests/zarr_test.py | 1 + src/datasource/n5/backend.ts | 5 ++- src/datasource/n5/base.ts | 9 +++--- src/datasource/n5/frontend.ts | 12 +++++++ src/datasource/nifti/backend.ts | 2 +- src/datasource/precomputed/backend.ts | 7 +++-- src/datasource/zarr/codec/gzip/decode.ts | 31 +++++++++++-------- src/datasource/zarr/codec/gzip/resolve.ts | 20 ++++++------ src/datasource/zarr/metadata/parse.ts | 9 +----- .../backend_chunk_decoders/bossNpz.ts | 4 ++- .../backend_chunk_decoders/ndstoreNpz.ts | 4 ++- src/util/gzip.ts | 9 ++++-- 13 files changed, 75 insertions(+), 45 deletions(-) diff --git a/python/tests/n5_test.py b/python/tests/n5_test.py index d03e23009e..9281302087 100644 --- a/python/tests/n5_test.py +++ b/python/tests/n5_test.py @@ -27,6 +27,10 @@ [ {"driver": "n5", "metadata": {"compression": {"type": "raw"}}}, {"driver": "n5", "metadata": {"compression": {"type": "gzip"}}}, + { + "driver": "n5", + "metadata": {"compression": {"type": "gzip", "useZlib": True}}, + }, { "driver": "n5", "metadata": { @@ -38,8 +42,7 @@ } }, }, - # TODO(jbms): Add once tensorstore supports zstd - # {"driver": "n5", "metadata": {"compression": {"type": "zstd"}}}, + {"driver": "n5", "metadata": {"compression": {"type": "zstd"}}}, ], ids=str, ) diff --git a/python/tests/zarr_test.py b/python/tests/zarr_test.py index 74b3586ccd..529e264064 100644 --- a/python/tests/zarr_test.py +++ b/python/tests/zarr_test.py @@ -26,6 +26,7 @@ "spec", [ {"driver": "zarr"}, + {"driver": "zarr", "metadata": {"compressor": {"id": "zlib"}}}, {"driver": "zarr", "schema": {"chunk_layout": {"inner_order": [2, 1, 0]}}}, {"driver": "zarr3"}, {"driver": "zarr3", "schema": {"chunk_layout": {"inner_order": [2, 1, 0]}}}, diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index ef3faee19c..d2fd83a20b 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -61,8 +61,11 @@ async function decodeChunk( chunk.chunkDataSize = shape; let buffer = new Uint8Array(response, offset); switch (encoding) { + case VolumeChunkEncoding.ZLIB: + buffer = new Uint8Array(await decodeGzip(buffer, "deflate")); + break; case VolumeChunkEncoding.GZIP: - buffer = new Uint8Array(await decodeGzip(buffer)); + buffer = new Uint8Array(await decodeGzip(buffer, "gzip")); break; case VolumeChunkEncoding.BLOSC: buffer = await requestAsyncComputation( diff --git a/src/datasource/n5/base.ts b/src/datasource/n5/base.ts index ef471c8c16..5dc6a2f444 100644 --- a/src/datasource/n5/base.ts +++ b/src/datasource/n5/base.ts @@ -15,10 +15,11 @@ */ export enum VolumeChunkEncoding { - RAW = 0, - GZIP = 1, - BLOSC = 2, - ZSTD = 3, + RAW, + ZLIB, + GZIP, + BLOSC, + ZSTD, } export class VolumeChunkSourceParameters { diff --git a/src/datasource/n5/frontend.ts b/src/datasource/n5/frontend.ts index ed4299a528..92dba794bb 100644 --- a/src/datasource/n5/frontend.ts +++ b/src/datasource/n5/frontend.ts @@ -68,6 +68,7 @@ import { expectArray, parseArray, parseFixedLengthArray, + verifyBoolean, verifyEnumString, verifyFinitePositiveFloat, verifyObject, @@ -235,6 +236,17 @@ class ScaleMetadata { encoding = verifyObjectProperty(compression, "type", (x) => verifyEnumString(x, VolumeChunkEncoding), ); + if ( + encoding === VolumeChunkEncoding.GZIP && + verifyOptionalObjectProperty( + compression, + "useZlib", + verifyBoolean, + false, + ) === true + ) { + encoding = VolumeChunkEncoding.ZLIB; + } }); if (encoding === undefined) { encoding = verifyObjectProperty(obj, "compressionType", (x) => diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index 0b8192e8a4..4778a49b15 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -61,7 +61,7 @@ async function decodeNiftiFile( _cancellationToken: CancellationToken, ) { if (isCompressed(buffer)) { - buffer = await decodeGzip(buffer); + buffer = await decodeGzip(buffer, "gzip"); } const data = new NiftiFileData(); data.uncompressedData = buffer; diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 4ae0bacf1b..c58f695966 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -218,7 +218,10 @@ function getMinishardIndexDataSource( cancellationToken, ); if (sharding.minishardIndexEncoding === DataEncoding.GZIP) { - minishardIndexResponse = await decodeGzip(minishardIndexResponse); + minishardIndexResponse = await decodeGzip( + minishardIndexResponse, + "gzip", + ); } if (minishardIndexResponse.byteLength % 24 !== 0) { throw new Error( @@ -344,7 +347,7 @@ async function getShardedData( cancellationToken, ); if (minishardIndexSource.sharding.dataEncoding === DataEncoding.GZIP) { - data = await decodeGzip(data); + data = await decodeGzip(data, "gzip"); } return { data, diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 8003868eb9..288688adb4 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -20,16 +20,21 @@ import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { CancellationToken } from "#src/util/cancellation.js"; import { decodeGzip } from "#src/util/gzip.js"; -registerCodec({ - name: "gzip", - kind: CodecKind.bytesToBytes, - async decode( - configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { - configuration; - cancellationToken; - return new Uint8Array(await decodeGzip(encoded)); - }, -}); +for (const [name, compressionFormat] of [ + ["gzip", "gzip"], + ["zlib", "deflate"], +] as const) { + registerCodec({ + name, + kind: CodecKind.bytesToBytes, + async decode( + configuration: Configuration, + encoded: Uint8Array, + cancellationToken: CancellationToken, + ): Promise { + configuration; + cancellationToken; + return new Uint8Array(await decodeGzip(encoded, compressionFormat)); + }, + }); +} diff --git a/src/datasource/zarr/codec/gzip/resolve.ts b/src/datasource/zarr/codec/gzip/resolve.ts index eec56f4c64..60d058247d 100644 --- a/src/datasource/zarr/codec/gzip/resolve.ts +++ b/src/datasource/zarr/codec/gzip/resolve.ts @@ -26,12 +26,14 @@ export interface Configuration { level: number; } -registerCodec({ - name: "gzip", - kind: CodecKind.bytesToBytes, - resolve(configuration: unknown): { configuration: Configuration } { - verifyObject(configuration); - const level = verifyObjectProperty(configuration, "level", verifyInt); - return { configuration: { level } }; - }, -}); +for (const name of ["gzip", "zlib"]) { + registerCodec({ + name, + kind: CodecKind.bytesToBytes, + resolve(configuration: unknown): { configuration: Configuration } { + verifyObject(configuration); + const level = verifyObjectProperty(configuration, "level", verifyInt); + return { configuration: { level } }; + }, + }); +} diff --git a/src/datasource/zarr/metadata/parse.ts b/src/datasource/zarr/metadata/parse.ts index af158972b5..a4f515f98e 100644 --- a/src/datasource/zarr/metadata/parse.ts +++ b/src/datasource/zarr/metadata/parse.ts @@ -396,16 +396,9 @@ export function parseV2Metadata( break; case "zlib": case "gzip": - codecs.push({ - name: "gzip", - configuration: { - level: verifyObjectProperty(compressor, "level", verifyInt), - }, - }); - break; case "zstd": codecs.push({ - name: "zstd", + name: id, configuration: { level: verifyObjectProperty(compressor, "level", verifyInt), }, diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index e8f056ba08..76075224a7 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -35,7 +35,9 @@ export async function decodeBossNpzChunk( cancellationToken: CancellationToken, response: ArrayBuffer, ) { - const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); + const parseResult = parseNpy( + new Uint8Array(await decodeGzip(response, "deflate")), + ); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index a4b4fa2150..5bf2f83a36 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -35,7 +35,9 @@ export async function decodeNdstoreNpzChunk( cancellationToken: CancellationToken, response: ArrayBuffer, ) { - const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); + const parseResult = parseNpy( + new Uint8Array(await decodeGzip(response, "deflate")), + ); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; diff --git a/src/util/gzip.ts b/src/util/gzip.ts index 118e037032..8e04f08560 100644 --- a/src/util/gzip.ts +++ b/src/util/gzip.ts @@ -22,9 +22,12 @@ export function isGzipFormat(data: ArrayBufferView) { return view.length > 2 && view[0] === 0x1f && view[1] === 0x8b; } -export async function decodeGzip(data: ArrayBuffer | ArrayBufferView) { +export async function decodeGzip( + data: ArrayBuffer | ArrayBufferView, + format: CompressionFormat, +) { const decompressedStream = new Response(data).body!.pipeThrough( - new DecompressionStream("gzip"), + new DecompressionStream(format), ); return await new Response(decompressedStream).arrayBuffer(); } @@ -40,7 +43,7 @@ export async function maybeDecompressGzip(data: ArrayBuffer | ArrayBufferView) { byteView = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); } if (isGzipFormat(byteView)) { - return new Uint8Array(await decodeGzip(byteView)); + return new Uint8Array(await decodeGzip(byteView, "gzip")); } return byteView; } From 5ef8e6a50735689c0585909e7bc6d82ab0467fb5 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sun, 8 Dec 2024 21:13:48 -0800 Subject: [PATCH 10/41] chore(mypy): fix mypy typing issues with NumPy 2.2 --- python/neuroglancer/coordinate_space.py | 1 + python/neuroglancer/write_annotations.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/python/neuroglancer/coordinate_space.py b/python/neuroglancer/coordinate_space.py index 26c361a44c..4e14c42546 100644 --- a/python/neuroglancer/coordinate_space.py +++ b/python/neuroglancer/coordinate_space.py @@ -237,6 +237,7 @@ def __init__( names_tuple = tuple(names) rank = len(names_tuple) self.names = names_tuple + scales_array: np.typing.NDArray[np.float64] if scales is None: scales_array = np.ones(rank, dtype=np.float64) else: diff --git a/python/neuroglancer/write_annotations.py b/python/neuroglancer/write_annotations.py index 272cd80cf6..6e1d3f87c6 100644 --- a/python/neuroglancer/write_annotations.py +++ b/python/neuroglancer/write_annotations.py @@ -82,6 +82,8 @@ def _get_dtype_for_properties( class AnnotationWriter: annotations: list[Annotation] related_annotations: list[dict[int, list[Annotation]]] + lower_bound: np.typing.NDArray[np.float64] + upper_bound: np.typing.NDArray[np.float64] def __init__( self, From 9f7c2384abb468079bb626ad12c344c7903a7f80 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sat, 7 Dec 2024 21:31:13 -0800 Subject: [PATCH 11/41] refactor: Eliminate CancellationToken, use AbortSignal instead CancellationToken was introduced before `AbortSignal` was supported by browsers. This commit also unifies handling of authentication status messages and popup windows. Some features previously supported only for middleauth are now supported for all credential providers: - Display authentication status message in "modal" mode by default - Detecting when authentication popup window is closed - Closing the popup if the user navigates away from the page without completing authentication. --- .github/workflows/build.yml | 15 +- build_tools/cli.ts | 2 +- .../vite/vite-project-built/package-lock.json | 1 + .../vite-project-source/package-lock.json | 1 + .../webpack-project-built/package-lock.json | 1 + .../webpack-project-source/package-lock.json | 1 + package-lock.json | 11 + package.json | 2 + python/neuroglancer/server.py | 2 + python/neuroglancer/webdriver.py | 6 + python/tests/conftest.py | 6 + python/tests/zarr_test.py | 47 +++ src/annotation/backend.ts | 19 +- src/async_computation.bundle.js | 1 + src/async_computation/request.ts | 36 ++- src/chunk_manager/backend.ts | 31 +- src/chunk_manager/frontend.ts | 12 +- src/chunk_manager/generic_file_source.ts | 134 ++++---- src/chunk_worker.bundle.js | 1 + src/credentials_provider/http_request.ts | 26 +- src/credentials_provider/index.ts | 37 ++- .../interactive_credentials_provider.ts | 129 ++++++++ src/credentials_provider/oauth2.ts | 20 +- src/credentials_provider/shared.ts | 15 +- .../shared_counterpart.ts | 5 +- src/datasource/boss/api.ts | 20 +- src/datasource/boss/backend.ts | 42 ++- src/datasource/boss/credentials_provider.ts | 269 +++++++--------- src/datasource/boss/frontend.ts | 61 ++-- src/datasource/brainmaps/api.ts | 30 +- src/datasource/brainmaps/backend.ts | 236 ++++++-------- src/datasource/brainmaps/frontend.ts | 60 ++-- src/datasource/deepzoom/backend.ts | 31 +- src/datasource/deepzoom/frontend.ts | 12 +- src/datasource/dvid/api.ts | 95 +----- src/datasource/dvid/backend.ts | 53 ++-- src/datasource/dvid/credentials_provider.ts | 105 ++----- src/datasource/dvid/frontend.ts | 16 +- src/datasource/graphene/backend.ts | 96 +++--- src/datasource/graphene/base.ts | 2 - src/datasource/graphene/frontend.ts | 46 +-- src/datasource/index.ts | 18 +- .../middleauth/credentials_provider.ts | 147 +++++---- src/datasource/n5/backend.ts | 32 +- src/datasource/n5/frontend.ts | 13 +- src/datasource/ngauth/credentials_provider.ts | 131 ++++---- src/datasource/nggraph/frontend.ts | 12 +- src/datasource/nifti/backend.ts | 21 +- src/datasource/nifti/frontend.ts | 9 +- src/datasource/obj/backend.ts | 15 +- src/datasource/obj/frontend.ts | 2 +- src/datasource/precomputed/backend.ts | 125 +++----- src/datasource/precomputed/frontend.ts | 13 +- src/datasource/python/backend.ts | 49 ++- src/datasource/render/backend.ts | 26 +- src/datasource/state_share.ts | 19 +- src/datasource/vtk/backend.ts | 15 +- src/datasource/vtk/frontend.ts | 2 +- src/datasource/zarr/backend.ts | 9 +- src/datasource/zarr/codec/blosc/decode.ts | 5 +- src/datasource/zarr/codec/bytes/decode.ts | 5 +- src/datasource/zarr/codec/crc32c/decode.ts | 5 +- src/datasource/zarr/codec/decode.ts | 19 +- src/datasource/zarr/codec/gzip/decode.ts | 8 +- .../zarr/codec/sharding_indexed/decode.ts | 15 +- src/datasource/zarr/codec/transpose/decode.ts | 5 +- src/datasource/zarr/codec/zstd/decode.ts | 5 +- src/datasource/zarr/frontend.ts | 13 +- src/kvstore/index.ts | 6 +- src/kvstore/special/index.ts | 26 +- src/layer/layer_data_source.ts | 7 +- src/main.bundle.js | 1 + src/mesh/backend.ts | 16 +- src/python_integration/volume.ts | 18 +- src/single_mesh/backend.ts | 19 +- src/sliceview/backend.ts | 12 +- .../backend_chunk_decoders/bossNpz.ts | 5 +- .../compressed_segmentation.ts | 5 +- .../backend_chunk_decoders/compresso.ts | 7 +- src/sliceview/backend_chunk_decoders/index.ts | 3 +- src/sliceview/backend_chunk_decoders/jpeg.ts | 7 +- src/sliceview/backend_chunk_decoders/jxl.ts | 7 +- .../backend_chunk_decoders/ndstoreNpz.ts | 5 +- src/sliceview/backend_chunk_decoders/png.ts | 7 +- .../backend_chunk_decoders/postprocess.ts | 8 +- src/sliceview/backend_chunk_decoders/raw.ts | 7 +- src/sliceview/frontend.ts | 6 +- src/status.ts | 5 + src/ui/layer_data_sources_tab.ts | 8 +- src/ui/url_hash_binding.ts | 20 +- src/util/abort.spec.ts | 91 ++++++ src/util/abort.ts | 137 +++++++++ src/util/byte_range_http_requests.ts | 25 +- src/util/cancellation.spec.ts | 175 ----------- src/util/cancellation.ts | 206 ------------- src/util/disposable.ts | 3 + src/util/gcs_bucket_listing.ts | 14 +- src/util/google_oauth2.ts | 288 +++++++----------- src/util/gzip.ts | 15 +- src/util/http_path_completion.ts | 32 +- src/util/http_request.ts | 50 +-- src/util/polyfills.ts | 2 + src/util/s3.ts | 20 +- src/util/s3_bucket_listing.ts | 16 +- src/util/special_protocol_request.ts | 31 +- src/widget/multiline_autocomplete.ts | 22 +- src/worker_rpc.ts | 62 ++-- tsconfig.json | 2 +- 108 files changed, 1644 insertions(+), 2225 deletions(-) create mode 100644 src/credentials_provider/interactive_credentials_provider.ts create mode 100644 src/util/abort.spec.ts create mode 100644 src/util/abort.ts delete mode 100644 src/util/cancellation.spec.ts delete mode 100644 src/util/cancellation.ts create mode 100644 src/util/polyfills.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c6d1ad621..0c732e3257 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,13 @@ on: tags: - v** pull_request: + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: "Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)" + required: false + default: false jobs: client: @@ -97,12 +104,12 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - # Uncomment the action below for an interactive shell - # - name: Setup tmate session - # uses: mxschmitt/action-tmate@v3 + - uses: ./.github/actions/setup-firefox + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} - name: Install Python packaging/test tools run: pip install tox nox wheel numpy -r python/requirements-test.txt - - uses: ./.github/actions/setup-firefox - run: nox -s lint format mypy - name: Check for dirty working directory run: git diff --exit-code diff --git a/build_tools/cli.ts b/build_tools/cli.ts index 854871136c..c791dca5e6 100644 --- a/build_tools/cli.ts +++ b/build_tools/cli.ts @@ -211,7 +211,7 @@ function parseArgs() { group: "Development server options", type: "number", nargs: 1, - default: 8080, + default: 0, description: "Port number for the development server", }, host: { diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index 426618e87f..e89e5092aa 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -21,6 +21,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 92a35cca70..a333c77b1c 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -20,6 +20,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index 281acb7b1f..ae56c53956 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -27,6 +27,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 2c9d8f5e54..44d489277d 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -27,6 +27,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/package-lock.json b/package-lock.json index bb11614bf3..4f72ce3474 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", @@ -4256,6 +4257,16 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", diff --git a/package.json b/package.json index 81747aaa2f..73f3408324 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "format:check": "prettier --cache . -c", "format:fix": "prettier --cache -w -l .", "typecheck": "tsc --noEmit", + "typecheck:watch": "tsc --noEmit --watch", "version": "tsx ./build_tools/after-version-change.ts" }, "devDependencies": { @@ -77,6 +78,7 @@ }, "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/python/neuroglancer/server.py b/python/neuroglancer/server.py index f3408f6e36..11e7ea47d7 100644 --- a/python/neuroglancer/server.py +++ b/python/neuroglancer/server.py @@ -538,6 +538,8 @@ def set_dev_server_content_source(): "dev-server-python", "--", "--port=0", + "--no-lint", + "--no-typecheck", ], cwd=root_dir, stdin=subprocess.PIPE, diff --git a/python/neuroglancer/webdriver.py b/python/neuroglancer/webdriver.py index ed93f73f75..83b5255bd5 100644 --- a/python/neuroglancer/webdriver.py +++ b/python/neuroglancer/webdriver.py @@ -35,6 +35,7 @@ def __init__( self, headless=True, browser="chrome", + browser_binary_path: Optional[str] = None, window_size=(1920, 1080), debug=False, docker=False, @@ -50,6 +51,7 @@ def __init__( list(extra_command_line_args) if extra_command_line_args else [] ) self.debug = debug + self.browser_binary_path = browser_binary_path self._log_listeners_lock = threading.Lock() self._log_listeners: dict[LogListener, None] = {} @@ -70,6 +72,8 @@ def _init_chrome(self): if self.headless: chrome_options.add_argument("--headless=new") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) + if self.browser_binary_path: + chrome_options.binary_location = self.browser_binary_path if self.docker: # https://www.intricatecloud.io/2019/05/running-webdriverio-tests-using-headless-chrome-inside-a-container/ chrome_options.add_argument("--no-sandbox") @@ -90,6 +94,8 @@ def _init_firefox(self): if self.headless: options.add_argument("--headless") options.arguments.extend(self.extra_command_line_args) + if self.browser_binary_path: + options.binary_location = self.browser_binary_path self.driver = selenium.webdriver.Firefox( options=options, ) diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 23fcb184bc..6c6df3c33b 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -62,6 +62,10 @@ def pytest_addoption(parser): default="chrome", help="Specifies the browser to use.", ) + parser.addoption( + "--browser-binary-path", + help="Overrides default browser executable path.", + ) parser.addoption( "--skip-browser-tests", action="store_true", @@ -89,6 +93,7 @@ def _webdriver_internal(request): docker=request.config.getoption("--webdriver-docker"), debug=request.config.getoption("--debug-webdriver"), browser=request.config.getoption("--browser"), + browser_binary_path=request.config.getoption("--browser-binary-path"), ) if request.config.getoption("--neuroglancer-server-debug"): neuroglancer.server.debug = True @@ -105,6 +110,7 @@ def webdriver_generic(request): docker=request.config.getoption("--webdriver-docker"), debug=request.config.getoption("--debug-webdriver"), browser=request.config.getoption("--browser"), + browser_binary_path=request.config.getoption("--browser-binary-path"), ) atexit.register(webdriver.driver.close) return webdriver diff --git a/python/tests/zarr_test.py b/python/tests/zarr_test.py index 529e264064..14e1fb60f4 100644 --- a/python/tests/zarr_test.py +++ b/python/tests/zarr_test.py @@ -156,6 +156,53 @@ def test_zarr(tempdir_server: tuple[pathlib.Path, str], webdriver, spec): np.testing.assert_equal(a, b) +def test_zarr_corrupt(tempdir_server: tuple[pathlib.Path, str], webdriver): + import tensorstore as ts + + tmp_path, server_url = tempdir_server + + shape = [10, 20, 30] + + a = np.arange(np.prod(shape), dtype=np.int32).reshape(shape) + + full_spec_for_chunks = { + "driver": "zarr3", + "kvstore": { + "driver": "file", + "path": str(tmp_path), + }, + "metadata": {"codecs": ["zstd"]}, + } + + full_spec_for_metadata = { + "driver": "zarr3", + "kvstore": { + "driver": "file", + "path": str(tmp_path), + }, + "metadata": {"codecs": ["gzip"]}, + } + + ts.open(full_spec_for_metadata, create=True, dtype=ts.int32, shape=shape).result() + store = ts.open( + full_spec_for_chunks, + open=True, + assume_metadata=True, + dtype=ts.int32, + shape=shape, + ).result() + store[...] = a + + with webdriver.viewer.txn() as s: + s.layers.append( + name="a", layer=neuroglancer.ImageLayer(source=f"zarr3://{server_url}") + ) + + vol = webdriver.viewer.volume("a").result() + with pytest.raises(ValueError, match=".*Failed to decode gzip"): + vol.read().result() + + EXCLUDED_ZARR_V2_CASES = { ".zgroup", ".zattrs", diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index febc1812db..599a9667c2 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -66,7 +66,6 @@ import { } from "#src/sliceview/backend.js"; import type { TransformedSource } from "#src/sliceview/base.js"; import { registerNested, WatchableValue } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import type { Uint64 } from "#src/util/uint64.js"; import { @@ -171,11 +170,8 @@ class AnnotationMetadataChunkSource extends ChunkSource { return chunk; } - download( - chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, - ) { - return this.parent!.downloadMetadata(chunk, cancellationToken); + download(chunk: AnnotationMetadataChunk, abortSignal: AbortSignal) { + return this.parent!.downloadMetadata(chunk, abortSignal); } } @@ -209,14 +205,11 @@ class AnnotationSubsetGeometryChunkSource extends ChunkSource { } return chunk; } - download( - chunk: AnnotationSubsetGeometryChunk, - cancellationToken: CancellationToken, - ) { + download(chunk: AnnotationSubsetGeometryChunk, abortSignal: AbortSignal) { return this.parent!.downloadSegmentFilteredGeometry( chunk, this.relationshipIndex, - cancellationToken, + abortSignal, ); } } @@ -227,12 +220,12 @@ export interface AnnotationSource { // TypeScript supports mixins with abstract classes. downloadMetadata( chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } diff --git a/src/async_computation.bundle.js b/src/async_computation.bundle.js index 25801ea045..329ef67e3c 100644 --- a/src/async_computation.bundle.js +++ b/src/async_computation.bundle.js @@ -1,6 +1,7 @@ // Note: This file uses ".js" rather than ".ts" extension because we cannot rely // on Node.js subpath imports to translate paths for Workers since those paths // must be valid for use in `new URL` with multiple bundlers. +import "#src/util/polyfills.js"; import "#src/async_computation/encode_compressed_segmentation.js"; import "#src/datasource/enabled_async_computation_modules.js"; import "#src/async_computation/handler.js"; diff --git a/src/async_computation/request.ts b/src/async_computation/request.ts index 05ddd5c106..f641b6fefc 100644 --- a/src/async_computation/request.ts +++ b/src/async_computation/request.ts @@ -15,21 +15,18 @@ */ import type { AsyncComputationSpec } from "#src/async_computation/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; let numWorkers = 0; const freeWorkers: Worker[] = []; const pendingTasks = new Map< number, - { msg: any; transfer: Transferable[] | undefined } + { msg: any; transfer: Transferable[] | undefined; cleanup?: () => void } >(); const tasks = new Map< number, { resolve: (value: any) => void; reject: (error: any) => void; - cleanup: () => void; } >(); // On Safari, `navigator.hardwareConcurrency` is not defined. @@ -42,6 +39,7 @@ let nextTaskId = 0; function returnWorker(worker: Worker) { for (const [id, task] of pendingTasks) { pendingTasks.delete(id); + task.cleanup?.(); worker.postMessage(task.msg, task.transfer as Transferable[]); return; } @@ -75,7 +73,6 @@ function launchWorker() { const callbacks = tasks.get(id)!; tasks.delete(id); if (callbacks === undefined) return; - callbacks.cleanup(); if (error !== undefined) { callbacks.reject(new Error(error)); } else { @@ -88,27 +85,40 @@ export function requestAsyncComputation< Signature extends (...args: any) => any, >( request: AsyncComputationSpec, - cancellationToken: CancellationToken, + abortSignal: AbortSignal | undefined, transfer: Transferable[] | undefined, ...args: Parameters ): Promise> { - if (cancellationToken.isCanceled) return Promise.reject(CANCELED); const id = nextTaskId++; const msg = { t: request.id, id, args: args }; - const cleanup = cancellationToken.add(() => { - pendingTasks.delete(id); - tasks.delete(id); - }); + + abortSignal?.throwIfAborted(); + const promise = new Promise>((resolve, reject) => { - tasks.set(id, { resolve, reject, cleanup }); + tasks.set(id, { resolve, reject }); }); + if (freeWorkers.length !== 0) { freeWorkers.pop()!.postMessage(msg, transfer as Transferable[]); } else { - pendingTasks.set(id, { msg, transfer }); + let cleanup: (() => void) | undefined; + if (abortSignal !== undefined) { + function abortHandler() { + pendingTasks.delete(id); + const task = tasks.get(id)!; + tasks.delete(id); + task.reject(abortSignal!.reason); + } + abortSignal.addEventListener("abort", abortHandler, { once: true }); + cleanup = () => { + abortSignal.removeEventListener("abort", abortHandler); + }; + } + pendingTasks.set(id, { msg, transfer, cleanup }); if (tasks.size > numWorkers && numWorkers < maxWorkers) { launchWorker(); } } + return promise; } diff --git a/src/chunk_manager/backend.ts b/src/chunk_manager/backend.ts index 4c6e7800bf..70f02db41d 100644 --- a/src/chunk_manager/backend.ts +++ b/src/chunk_manager/backend.ts @@ -36,8 +36,6 @@ import { } from "#src/chunk_manager/base.js"; import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { Borrowed, Disposable } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; import LinkedList0 from "#src/util/linked_list.0.js"; @@ -127,10 +125,10 @@ export class Chunk implements Disposable { newRequestedState = ChunkState.NEW; /** - * Cancellation token used to cancel the pending download. Set to undefined except when state !== + * Abort controller used to cancel the pending download. Set to undefined except when state !== * DOWNLOADING. This should not be accessed by code outside this module. */ - downloadCancellationToken: CancellationTokenSource | undefined = undefined; + downloadAbortController: AbortController | undefined = undefined; initialize(key: string) { this.key = key; @@ -414,13 +412,12 @@ export interface ChunkSourceBase { * Note: This method must be defined by subclasses. * * @param chunk Chunk to download. - * @param cancellationToken If this token is canceled, the download/decoding should be aborted if - * possible. + * @param abortSignal Used to abort download. * * TODO(jbms): Move this back to the class definition above and declare this abstract once mixins * are compatible with abstract classes. */ - download(chunk: Chunk, cancellationToken: CancellationToken): Promise; + download(chunk: Chunk, abortSignal: AbortSignal): Promise; } export class ChunkSource extends ChunkSourceBase { @@ -434,13 +431,13 @@ export class ChunkSource extends ChunkSourceBase { } function startChunkDownload(chunk: Chunk) { - const downloadCancellationToken = (chunk.downloadCancellationToken = - new CancellationTokenSource()); + const downloadAbortController = (chunk.downloadAbortController = + new AbortController()); const startTime = Date.now(); - chunk.source!.download(chunk, downloadCancellationToken).then( + chunk.source!.download(chunk, downloadAbortController.signal).then( () => { - if (chunk.downloadCancellationToken === downloadCancellationToken) { - chunk.downloadCancellationToken = undefined; + if (chunk.downloadAbortController === downloadAbortController) { + chunk.downloadAbortController = undefined; const endTime = Date.now(); const { statistics } = chunk.source!; statistics[ @@ -453,8 +450,8 @@ function startChunkDownload(chunk: Chunk) { } }, (error: any) => { - if (chunk.downloadCancellationToken === downloadCancellationToken) { - chunk.downloadCancellationToken = undefined; + if (chunk.downloadAbortController === downloadAbortController) { + chunk.downloadAbortController = undefined; chunk.downloadFailed(error); console.log(`Error retrieving chunk ${chunk}: ${error}`); } @@ -463,9 +460,9 @@ function startChunkDownload(chunk: Chunk) { } function cancelChunkDownload(chunk: Chunk) { - const token = chunk.downloadCancellationToken!; - chunk.downloadCancellationToken = undefined; - token.cancel(); + const controller = chunk.downloadAbortController!; + chunk.downloadAbortController = undefined; + controller.abort(); } class ChunkPriorityQueue { diff --git a/src/chunk_manager/frontend.ts b/src/chunk_manager/frontend.ts index bc85aea127..54621ba2e5 100644 --- a/src/chunk_manager/frontend.ts +++ b/src/chunk_manager/frontend.ts @@ -29,8 +29,6 @@ import { import { SharedWatchableValue } from "#src/shared_watchable_value.js"; import { TrackableBoolean } from "#src/trackable_boolean.js"; import { TrackableValue } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; import { StringMemoize } from "#src/util/memoize.js"; @@ -198,9 +196,9 @@ export class ChunkQueueManager extends SharedObject { } private handleFetch_(source: ChunkSource, update: any) { - const { resolve, reject, cancellationToken } = update.promise; - if ((cancellationToken).isCanceled) { - reject(CANCELED); + const { resolve, reject, abortSignal } = update.promise; + if (abortSignal.aborted) { + reject(abortSignal.reason); return; } @@ -352,9 +350,9 @@ registerRPC("Chunk.update", function (x) { registerPromiseRPC( "Chunk.retrieve", - function (x, cancellationToken): RPCPromise { + function (x, abortSignal): RPCPromise { return new Promise<{ value: any }>((resolve, reject) => { - x.promise = { resolve, reject, cancellationToken }; + x.promise = { resolve, reject, abortSignal }; updateChunk(this, x); }); }, diff --git a/src/chunk_manager/generic_file_source.ts b/src/chunk_manager/generic_file_source.ts index 6a90579489..42605866d8 100644 --- a/src/chunk_manager/generic_file_source.ts +++ b/src/chunk_manager/generic_file_source.ts @@ -22,18 +22,12 @@ import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, ChunkSourceBase } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - CANCELED, - makeCancelablePromise, - MultipleConsumerCancellationTokenSource, -} from "#src/util/cancellation.js"; +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; -import { responseArrayBuffer } from "#src/util/http_request.js"; import { stableStringify } from "#src/util/json.js"; import { getObjectId } from "#src/util/object_id.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; export type PriorityGetter = () => { priorityTier: ChunkPriorityTier; @@ -44,6 +38,7 @@ interface FileDataRequester { resolve: (data: Data) => void; reject: (error: any) => void; getPriority: PriorityGetter; + cleanup: () => void; } class GenericSharedDataChunk extends Chunk { @@ -83,7 +78,7 @@ export interface GenericSharedDataSourceOptions { encodeKey?: (key: Key) => string; download: ( key: Key, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise<{ size: number; data: Data }>; sourceQueueLevel?: number; } @@ -95,7 +90,7 @@ export class GenericSharedDataSource extends ChunkSourceBase { private downloadFunction: ( key: Key, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise<{ size: number; data: Data }>; constructor( @@ -139,11 +134,11 @@ export class GenericSharedDataSource extends ChunkSourceBase { async download( chunk: GenericSharedDataChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const { size, data } = await this.downloadFunction( chunk.decodedKey!, - cancellationToken, + abortSignal, ); chunk.systemMemoryBytes = size; chunk.data = data; @@ -152,11 +147,7 @@ export class GenericSharedDataSource extends ChunkSourceBase { /** * Precondition: priorityTier <= ChunkPriorityTier.LAST_ORDERED_TIER */ - getData( - key: Key, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, - ) { + getData(key: Key, getPriority: PriorityGetter, abortSignal: AbortSignal) { const encodedKey = this.encodeKeyFunction(key); let chunk = this.chunks.get(encodedKey); if (chunk === undefined) { @@ -167,37 +158,37 @@ export class GenericSharedDataSource extends ChunkSourceBase { chunk.initialize(encodedKey); this.addChunk(chunk); } - return makeCancelablePromise( - cancellationToken, - (resolve, reject, token) => { - // If the data is already available or the request has already failed, resolve/reject the - // promise immediately. - switch (chunk!.state) { - case ChunkState.FAILED: - reject(chunk!.error); - return; + return new Promise((resolve, reject) => { + // If the data is already available or the request has already failed, resolve/reject the + // promise immediately. + switch (chunk!.state) { + case ChunkState.FAILED: + reject(chunk!.error); + return; - case ChunkState.SYSTEM_MEMORY_WORKER: - resolve(chunk!.data!); - return; + case ChunkState.SYSTEM_MEMORY_WORKER: + resolve(chunk!.data!); + return; + } + function handleAbort() { + const { requesters } = chunk!; + if (requesters !== undefined) { + requesters.delete(requester); + chunk!.chunkManager!.scheduleUpdateChunkPriorities(); } - const requester: FileDataRequester = { - resolve, - reject, - getPriority, - }; - chunk!.requesters!.add(requester); - token.add(() => { - const { requesters } = chunk!; - if (requesters !== undefined) { - requesters.delete(requester); - this.chunkManager.scheduleUpdateChunkPriorities(); - } - reject(CANCELED); - }); - this.chunkManager.scheduleUpdateChunkPriorities(); - }, - ); + reject(abortSignal.reason); + } + + const requester: FileDataRequester = { + resolve, + reject, + getPriority, + cleanup: () => abortSignal.removeEventListener("abort", handleAbort), + }; + chunk!.requesters!.add(requester); + abortSignal.addEventListener("abort", handleAbort, { once: true }); + this.chunkManager.scheduleUpdateChunkPriorities(); + }); } static get( @@ -217,14 +208,14 @@ export class GenericSharedDataSource extends ChunkSourceBase { options: GenericSharedDataSourceOptions, key: Key, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const source = GenericSharedDataSource.get( chunkManager, memoizeKey, options, ); - const result = source.getData(key, getPriority, cancellationToken); + const result = source.getData(key, getPriority, abortSignal); source.dispose(); return result; } @@ -234,35 +225,32 @@ export class GenericSharedDataSource extends ChunkSourceBase { credentialsProvider: SpecialProtocolCredentialsProvider, decodeFunction: ( buffer: ArrayBuffer, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise<{ size: number; data: Data }>, url: string, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { return GenericSharedDataSource.getData( chunkManager, `${getObjectId(decodeFunction)}`, { - download: (url: string, cancellationToken: CancellationToken) => - cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFunction(response, cancellationToken)), + download: (url: string, abortSignal: AbortSignal) => + fetchSpecialOk(credentialsProvider, url, { signal: abortSignal }) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFunction(response, abortSignal)), }, url, getPriority, - cancellationToken, + abortSignal, ); } } class AsyncCacheChunk extends Chunk { promise: Promise | undefined; - cancellationSource: MultipleConsumerCancellationTokenSource | undefined; + outstandingRequests: number = 0; + sharedAbortController: SharedAbortController | undefined; initialize(key: string) { super.initialize(key); @@ -270,7 +258,6 @@ class AsyncCacheChunk extends Chunk { freeSystemMemory() { this.promise = undefined; - this.cancellationSource = undefined; } } @@ -278,7 +265,7 @@ export interface SimpleAsyncCacheOptions { encodeKey?: (key: Key) => string; get: ( key: Key, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise<{ size: number; data: Value }>; } @@ -297,10 +284,10 @@ export class SimpleAsyncCache extends ChunkSourceBase { encodeKeyFunction: (key: Key) => string; downloadFunction: ( key: Key, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise<{ size: number; data: Value }>; - get(key: Key, cancellationToken: CancellationToken): Promise { + get(key: Key, abortSignal?: AbortSignal): Promise { const encodedKey = this.encodeKeyFunction(key); let chunk = this.chunks.get(encodedKey); if (chunk === undefined) { @@ -308,11 +295,14 @@ export class SimpleAsyncCache extends ChunkSourceBase { chunk.initialize(encodedKey); this.addChunk(chunk); } - if (chunk.promise === undefined) { + if ( + chunk.promise === undefined || + chunk.sharedAbortController?.signal.aborted + ) { let completed = false; - const cancellationSource = (chunk!.cancellationSource = - new MultipleConsumerCancellationTokenSource()); - cancellationSource.add(() => { + const sharedAbortController = (chunk!.sharedAbortController = + new SharedAbortController()); + sharedAbortController.signal.addEventListener("abort", () => { if (!completed) { chunk!.promise = undefined; } @@ -321,7 +311,7 @@ export class SimpleAsyncCache extends ChunkSourceBase { try { const { data, size } = await this.downloadFunction( key, - cancellationSource, + sharedAbortController.signal, ); chunk.systemMemoryBytes = size; chunk!.queueManager.updateChunkState( @@ -334,11 +324,13 @@ export class SimpleAsyncCache extends ChunkSourceBase { throw e; } finally { completed = true; + sharedAbortController[Symbol.dispose](); } })(); } - chunk.cancellationSource!.addConsumer(cancellationToken); - return chunk.promise; + chunk!.sharedAbortController!.addConsumer(abortSignal); + chunk!.sharedAbortController!.start(); + return raceWithAbort(chunk.promise, abortSignal); } } diff --git a/src/chunk_worker.bundle.js b/src/chunk_worker.bundle.js index 159e988adc..a5cb4b9bbc 100644 --- a/src/chunk_worker.bundle.js +++ b/src/chunk_worker.bundle.js @@ -1,6 +1,7 @@ // Note: This file uses ".js" rather than ".ts" extension because we cannot rely // on Node.js subpath imports to translate paths for Workers since those paths // must be valid for use in `new URL` with multiple bundlers. +import "#src/util/polyfills.js"; import "#src/shared_watchable_value.js"; import "#src/chunk_manager/backend.js"; import "#src/sliceview/backend.js"; diff --git a/src/credentials_provider/http_request.ts b/src/credentials_provider/http_request.ts index 825dd5b705..d3998a66f5 100644 --- a/src/credentials_provider/http_request.ts +++ b/src/credentials_provider/http_request.ts @@ -18,32 +18,23 @@ import type { CredentialsProvider, CredentialsWithGeneration, } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { throwIfCanceled, uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { - cancellableFetchOk, - HttpError, - pickDelay, -} from "#src/util/http_request.js"; +import { fetchOk, HttpError, pickDelay } from "#src/util/http_request.js"; const maxCredentialsAttempts = 3; -export async function fetchWithCredentials( +export async function fetchWithCredentials( credentialsProvider: CredentialsProvider, input: RequestInfo | ((credentials: Credentials) => RequestInfo), init: RequestInit, - transformResponse: ResponseTransform, applyCredentials: ( credentials: Credentials, requestInit: RequestInit, ) => RequestInit, errorHandler: (httpError: HttpError, credentials: Credentials) => "refresh", - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { let credentials: CredentialsWithGeneration | undefined; for (let credentialsAttempt = 0; ; ) { - throwIfCanceled(cancellationToken); + init.signal?.throwIfAborted(); if (credentialsAttempt > 1) { // Don't delay on the first attempt, and also don't delay on the second attempt, since if the // credentials have expired and there is no problem on the server there is no reason to delay @@ -52,13 +43,14 @@ export async function fetchWithCredentials( setTimeout(resolve, pickDelay(credentialsAttempt - 2)), ); } - credentials = await credentialsProvider.get(credentials, cancellationToken); + credentials = await credentialsProvider.get( + credentials, + init.signal ?? undefined, + ); try { - return await cancellableFetchOk( + return await fetchOk( typeof input === "function" ? input(credentials.credentials) : input, applyCredentials(credentials.credentials, init), - transformResponse, - cancellationToken, ); } catch (error) { if (error instanceof HttpError) { diff --git a/src/credentials_provider/index.ts b/src/credentials_provider/index.ts index c0aab02d6f..41ec25ede0 100644 --- a/src/credentials_provider/index.ts +++ b/src/credentials_provider/index.ts @@ -18,8 +18,7 @@ * @file Generic facility for providing authentication/authorization credentials. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { MultipleConsumerCancellationTokenSource } from "#src/util/cancellation.js"; +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; import { StringMemoize } from "#src/util/memoize.js"; @@ -43,26 +42,24 @@ export abstract class CredentialsProvider extends RefCounted { */ abstract get: ( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + abortSignal?: AbortSignal | undefined, ) => Promise>; } export function makeCachedCredentialsGetter( getUncached: ( invalidCredentials: CredentialsWithGeneration | undefined, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise>, ) { let cachedCredentials: CredentialsWithGeneration | undefined; let pendingCredentials: | Promise> | undefined; - let pendingCancellationToken: - | MultipleConsumerCancellationTokenSource - | undefined; + let pendingAbortController: SharedAbortController | undefined; return ( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + abortSignal?: AbortSignal, ) => { if ( pendingCredentials !== undefined && @@ -71,24 +68,26 @@ export function makeCachedCredentialsGetter( cachedCredentials.generation !== invalidCredentials.generation) ) { if (cachedCredentials === undefined) { - pendingCancellationToken!.addConsumer(cancellationToken); + pendingAbortController!.addConsumer(abortSignal); } - return pendingCredentials; + return raceWithAbort(pendingCredentials, abortSignal); } cachedCredentials = undefined; - pendingCancellationToken = new MultipleConsumerCancellationTokenSource(); + pendingAbortController = new SharedAbortController(); pendingCredentials = getUncached( invalidCredentials, - pendingCancellationToken, + pendingAbortController.signal, ).then( (credentials) => { cachedCredentials = credentials; - pendingCancellationToken = undefined; + pendingAbortController![Symbol.dispose](); + pendingAbortController = undefined; return credentials; }, (reason) => { - if (pendingCancellationToken!.isCanceled) { - pendingCancellationToken = undefined; + pendingAbortController![Symbol.dispose](); + if (pendingAbortController?.signal.aborted) { + pendingAbortController = undefined; pendingCredentials = undefined; } throw reason; @@ -99,14 +98,12 @@ export function makeCachedCredentialsGetter( } export function makeCredentialsGetter( - getWithoutGeneration: ( - cancellationToken: CancellationToken, - ) => Promise, + getWithoutGeneration: (abortSignal: AbortSignal) => Promise, ) { let generation = 0; return makeCachedCredentialsGetter( - (_invalidCredentials, cancellationToken) => - getWithoutGeneration(cancellationToken).then((credentials) => ({ + (_invalidCredentials, abortSignal) => + getWithoutGeneration(abortSignal).then((credentials) => ({ generation: ++generation, credentials, })), diff --git a/src/credentials_provider/interactive_credentials_provider.ts b/src/credentials_provider/interactive_credentials_provider.ts new file mode 100644 index 0000000000..9f66c18d70 --- /dev/null +++ b/src/credentials_provider/interactive_credentials_provider.ts @@ -0,0 +1,129 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { StatusMessage } from "#src/status.js"; +import { scopedAbortCallback } from "#src/util/abort.js"; + +export function getCredentialsWithStatus( + options: { + description: string; + requestDescription?: string; + supportsImmediate?: boolean; + get: (abortSignal: AbortSignal, immediate: boolean) => Promise; + }, + abortSignal: AbortSignal, +): Promise { + const { requestDescription = "login" } = options; + const status = new StatusMessage(/*delay=*/ true); + let abortController: AbortController | undefined; + return new Promise((resolve, reject) => { + const disposeAbortCallback = scopedAbortCallback(abortSignal, (reason) => { + if (abortController !== undefined) { + abortController.abort(reason); + abortController = undefined; + status.dispose(); + reject(reason); + } + }); + function dispose() { + if (abortController === undefined) return; + abortController = undefined; + status.dispose(); + disposeAbortCallback?.[Symbol.dispose](); + } + function writeLoginStatus( + msg = `${options.description} ${requestDescription} required.`, + linkMessage = `Request ${requestDescription}.`, + ) { + status.setText(msg + " "); + const button = document.createElement("button"); + button.textContent = linkMessage; + status.element.appendChild(button); + button.addEventListener("click", () => { + login(/*immediate=*/ false); + }); + } + function login(immediate: boolean) { + abortController?.abort(); + abortController = new AbortController(); + writeLoginStatus( + `Waiting for ${options.description} ${requestDescription}...`, + "Retry", + ); + options.get(abortController.signal, immediate).then( + (token) => { + dispose(); + resolve(token); + }, + (reason) => { + if (abortController === undefined) { + // Already completed, ignore. + return; + } + abortController = undefined; + status.setVisible(true); + status.setModal(true); + if (immediate) { + writeLoginStatus(); + } else { + writeLoginStatus( + `${options.description} ${requestDescription} failed: ${reason}.`, + "Retry", + ); + } + }, + ); + } + if (options.supportsImmediate === true) { + login(/*immediate=*/ true); + } else { + writeLoginStatus(); + status.setVisible(true); + } + }); +} + +export class AuthWindowClosedError extends Error { + constructor() { + super("Authentication window was closed"); + } +} + +export function monitorAuthPopupWindow( + popup: Window, + abortController: AbortController, +) { + window.addEventListener( + "beforeunload", + () => { + popup.close(); + }, + { signal: abortController.signal }, + ); + const checkClosed = setInterval(() => { + if (popup.closed) { + abortController.abort(new AuthWindowClosedError()); + } + }, 1000); + abortController.signal.addEventListener("abort", () => { + try { + popup.close(); + } catch { + // Ignore error closing window. + } + clearInterval(checkClosed); + }); +} diff --git a/src/credentials_provider/oauth2.ts b/src/credentials_provider/oauth2.ts index 444b5fd95a..2eec784848 100644 --- a/src/credentials_provider/oauth2.ts +++ b/src/credentials_provider/oauth2.ts @@ -16,10 +16,7 @@ import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; /** * OAuth2 token @@ -30,26 +27,18 @@ export interface OAuth2Credentials { email?: string; } -export function fetchWithOAuth2Credentials( +export function fetchWithOAuth2Credentials( credentialsProvider: CredentialsProvider | undefined, input: RequestInfo, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { if (credentialsProvider === undefined) { - return cancellableFetchOk( - input, - init, - transformResponse, - cancellationToken, - ); + return fetchOk(input, init); } return fetchWithCredentials( credentialsProvider, input, init, - transformResponse, (credentials, init) => { if (!credentials.accessToken) return init; const headers = new Headers(init.headers); @@ -76,6 +65,5 @@ export function fetchWithOAuth2Credentials( } throw error; }, - cancellationToken, ); } diff --git a/src/credentials_provider/shared.ts b/src/credentials_provider/shared.ts index 60308ec9e6..1703a0f94f 100644 --- a/src/credentials_provider/shared.ts +++ b/src/credentials_provider/shared.ts @@ -26,7 +26,6 @@ import { CREDENTIALS_PROVIDER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, } from "#src/credentials_provider/shared_common.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Owned } from "#src/util/disposable.js"; import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { @@ -51,9 +50,9 @@ export class SharedCredentialsProvider get( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + abortSignal?: AbortSignal, ): Promise> { - return this.provider.get(invalidCredentials, cancellationToken); + return this.provider.get(invalidCredentials, abortSignal); } } @@ -62,13 +61,11 @@ registerPromiseRPC( function ( this: RPC, x: { providerId: number; invalidCredentials: any }, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): RPCPromise> { const obj = >this.get(x.providerId); - return obj - .get(x.invalidCredentials, cancellationToken) - .then((credentials) => ({ - value: credentials, - })); + return obj.get(x.invalidCredentials, abortSignal).then((credentials) => ({ + value: credentials, + })); }, ); diff --git a/src/credentials_provider/shared_counterpart.ts b/src/credentials_provider/shared_counterpart.ts index 7a9910977b..22436a53b2 100644 --- a/src/credentials_provider/shared_counterpart.ts +++ b/src/credentials_provider/shared_counterpart.ts @@ -29,7 +29,6 @@ import { CREDENTIALS_PROVIDER_GET_RPC_ID, CREDENTIALS_PROVIDER_RPC_ID, } from "#src/credentials_provider/shared_common.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { registerSharedObject, SharedObjectCounterpart, @@ -43,12 +42,12 @@ export class SharedCredentialsProviderCounterpart get = makeCachedCredentialsGetter( ( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + abortSignal?: AbortSignal, ): Promise> => this.rpc!.promiseInvoke( CREDENTIALS_PROVIDER_GET_RPC_ID, { providerId: this.rpcId, invalidCredentials: invalidCredentials }, - cancellationToken, + abortSignal, ), ); } diff --git a/src/datasource/boss/api.ts b/src/datasource/boss/api.ts index 71b3a3e88d..cfed87d1fb 100644 --- a/src/datasource/boss/api.ts +++ b/src/datasource/boss/api.ts @@ -16,10 +16,7 @@ import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; export type BossToken = string; @@ -28,19 +25,12 @@ export type BossToken = string; */ export const credentialsKey = "boss"; -export function fetchWithBossCredentials( +export async function fetchWithBossCredentials( credentialsProvider: CredentialsProvider, input: RequestInfo, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - return cancellableFetchOk( - input, - init, - transformResponse, - cancellationToken, - ).catch((error) => { +): Promise { + return fetchOk(input, init).catch((error) => { if ( error.status !== 500 && error.status !== 401 && @@ -55,7 +45,6 @@ export function fetchWithBossCredentials( credentialsProvider, input, init, - transformResponse, (credentials) => { const headers = new Headers(init.headers); headers.set("Authorization", `Bearer ${credentials}`); @@ -69,7 +58,6 @@ export function fetchWithBossCredentials( } throw error; }, - cancellationToken, ); }); } diff --git a/src/datasource/boss/backend.ts b/src/datasource/boss/backend.ts index 58d6cd40f6..3b16ca3159 100644 --- a/src/datasource/boss/backend.ts +++ b/src/datasource/boss/backend.ts @@ -35,12 +35,7 @@ import type { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.j import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; import type { SharedObject } from "#src/worker_rpc.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @@ -72,7 +67,7 @@ export class BossVolumeChunkSource extends BossSource( ) { chunkDecoder = chunkDecoders.get(this.parameters.encoding)!; - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const { parameters } = this; let url = `${parameters.baseUrl}/latest/cutout/${parameters.collection}/${parameters.experiment}/${parameters.channel}/${parameters.resolution}`; { @@ -92,11 +87,12 @@ export class BossVolumeChunkSource extends BossSource( const response = await fetchWithBossCredentials( this.credentialsProvider, url, - { headers: { Accept: acceptHeaders.get(parameters.encoding)! } }, - responseArrayBuffer, - cancellationToken, + { + signal: abortSignal, + headers: { Accept: acceptHeaders.get(parameters.encoding)! }, + }, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); } } @@ -123,23 +119,25 @@ export class BossMeshSource extends BossSource( MeshSource, MeshSourceParameters, ) { - download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + download(chunk: ManifestChunk, abortSignal: AbortSignal) { const { parameters } = this; - return cancellableFetchOk( + return fetchWithBossCredentials( + this.credentialsProvider, `${parameters.baseUrl}${chunk.objectId}`, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeManifestChunk(chunk, response)); + { signal: abortSignal }, + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeManifestChunk(chunk, response)); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; - return cancellableFetchOk( + return fetchWithBossCredentials( + this.credentialsProvider, `${parameters.baseUrl}${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + { signal: abortSignal }, + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } diff --git a/src/datasource/boss/credentials_provider.ts b/src/datasource/boss/credentials_provider.ts index cf75d9a030..939a44e400 100644 --- a/src/datasource/boss/credentials_provider.ts +++ b/src/datasource/boss/credentials_provider.ts @@ -23,138 +23,124 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; -import { StatusMessage } from "#src/status.js"; import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { verifyObject, verifyString } from "#src/util/json.js"; + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; +import { raceWithAbort } from "#src/util/abort.js"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; import { getRandomHexString } from "#src/util/random.js"; -import { Signal } from "#src/util/signal.js"; export type BossToken = string; -class PendingRequest { - finished = new Signal<(token?: BossToken, error?: any) => void>(); +function makeAuthRequestUrl(options: { + authServer: string; + clientId: string; + redirect_uri: string; + state?: string; + nonce?: string; +}) { + let url = `${options.authServer}/realms/BOSS/protocol/openid-connect/auth?`; + url += `client_id=${encodeURIComponent(options.clientId)}`; + url += `&redirect_uri=${encodeURIComponent(options.redirect_uri)}`; + url += "&response_mode=fragment"; + url += "&response_type=code%20id_token%20token"; + if (options.state) { + url += `&state=${options.state}`; + } + if (options.nonce) { + url += `&nonce=${options.nonce}`; + } + return url; } -class AuthHandler { - oidcCallbackService = "bossAuthCallback"; - relayReadyPromise: Promise; - pendingRequests = new Map(); +function waitForAuthResponseMessage( + source: Window, + state: string, + abortSignal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.origin !== location.origin) { + return; + } - constructor() { - this.registerListener(); - } + if (event.source !== source) return; - registerListener() { - addEventListener("message", (event: MessageEvent) => { - if (event.origin !== location.origin) { - // Ignore messages from different origins. - return; - } - try { - const data = verifyObject(JSON.parse(event.data)); - const service = verifyString(data.service); - if (service === this.oidcCallbackService) { - const accessToken = verifyString(data.access_token); - const state = verifyString(data.state); - const request = this.pendingRequests.get(state); - if (request === undefined) { - // Request may have been cancelled. - return; + try { + const obj = verifyObject(JSON.parse(event.data)); + if ( + verifyObjectProperty(obj, "service", verifyString) !== + "bossAuthCallback" + ) { + throw new Error("Unexpected service"); + } + const receivedState = verifyObjectProperty( + obj, + "state", + verifyString, + ); + if (receivedState !== state) { + throw new Error("invalid state"); } - request.finished.dispatch(accessToken); + const accessToken = verifyObjectProperty( + obj, + "access_token", + verifyString, + ); + resolve(accessToken); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); } - } catch (parseError) { - // Ignore invalid message. - } - }); - } - - addPendingRequest(state: string) { - const request = new PendingRequest(); - this.pendingRequests.set(state, request); - request.finished.add(() => { - this.pendingRequests.delete(state); - }); - return request; - } - - makeAuthRequestUrl(options: { - authServer: string; - clientId: string; - redirect_uri: string; - state?: string; - nonce?: string; - }) { - let url = `${options.authServer}/realms/BOSS/protocol/openid-connect/auth?`; - url += `client_id=${encodeURIComponent(options.clientId)}`; - url += `&redirect_uri=${encodeURIComponent(options.redirect_uri)}`; - url += "&response_mode=fragment"; - url += "&response_type=code%20id_token%20token"; - if (options.state) { - url += `&state=${options.state}`; - } - if (options.nonce) { - url += `&nonce=${options.nonce}`; - } - return url; - } -} - -let authHandlerInstance: AuthHandler; - -function authHandler() { - if (authHandlerInstance === undefined) { - authHandlerInstance = new AuthHandler(); - } - return authHandlerInstance; + }, + { signal: abortSignal }, + ); + }); } /** * Obtain a Keycloak OIDC authentication token. * @return A Promise that resolves to an authentication token. */ -export function authenticateKeycloakOIDC( +export async function authenticateKeycloakOIDC( options: { realm: string; clientId: string; authServer: string }, - cancellationToken = uncancelableToken, -) { + abortSignal: AbortSignal, +): Promise { const state = getRandomHexString(); const nonce = getRandomHexString(); - const handler = authHandler(); - const url = handler.makeAuthRequestUrl({ + const url = makeAuthRequestUrl({ state: state, clientId: options.clientId, redirect_uri: new URL("./bossauth.html", import.meta.url).href, authServer: options.authServer, nonce: nonce, }); - const request = handler.addPendingRequest(state); - const promise = new Promise((resolve, reject) => { - request.finished.add((token: string, error: string) => { - if (token !== undefined) { - resolve(token); - } else { - reject(error); - } - }); - }); - request.finished.add( - cancellationToken.add(() => { - request.finished.dispatch(undefined, CANCELED); - }), - ); - if (!cancellationToken.isCanceled) { + const abortController = new AbortController(); + abortSignal = AbortSignal.any([abortController.signal, abortSignal]); + try { const newWindow = open(url); - if (newWindow !== null) { - request.finished.add(() => { - newWindow.close(); - }); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(newWindow, state, abortController.signal), + abortSignal, + ); + } finally { + abortController.abort(); } - return promise; } export class BossCredentialsProvider extends CredentialsProvider { @@ -162,64 +148,21 @@ export class BossCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter((cancellationToken) => { - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeLoginStatus( - msg = "Boss authorization required.", - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - login(); - }); - status.setVisible(true); - } - const authServer = this.authServer; - function login() { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeLoginStatus("Waiting for Boss authorization...", "Retry"); - authenticateKeycloakOIDC( - { realm: "boss", clientId: "endpoint", authServer: authServer }, - cancellationSource, - ).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - writeLoginStatus( - `Boss authorization failed: ${reason}.`, - "Retry", - ); - } - }, - ); - } - writeLoginStatus(); - }); - }); + get = makeCredentialsGetter((abortSignal) => + getCredentialsWithStatus( + { + description: "Boss", + get: (signal) => + authenticateKeycloakOIDC( + { + realm: "boss", + clientId: "endpoint", + authServer: this.authServer, + }, + signal, + ), + }, + abortSignal, + ), + ); } diff --git a/src/datasource/boss/frontend.ts b/src/datasource/boss/frontend.ts index 88ad19db0f..69d5302529 100644 --- a/src/datasource/boss/frontend.ts +++ b/src/datasource/boss/frontend.ts @@ -66,7 +66,6 @@ import { getPrefixMatchesWithDescriptions, } from "#src/util/completion.js"; import { vec2, vec3 } from "#src/util/geom.js"; -import { responseJson } from "#src/util/http_request.js"; import { parseArray, parseQueryStringParameters, @@ -514,17 +513,18 @@ export function getExperimentInfo( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/`, {}, - responseJson, - ).then((value) => - parseExperimentInfo( - value, - chunkManager, - hostname, - credentialsProvider, - collection, - experiment, + ) + .then((response) => response.json()) + .then((value) => + parseExperimentInfo( + value, + chunkManager, + hostname, + credentialsProvider, + collection, + experiment, + ), ), - ), ); } @@ -549,8 +549,9 @@ export function getChannelInfo( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/channel/${channel}/`, {}, - responseJson, - ).then(parseChannelInfo), + ) + .then((response) => response.json()) + .then(parseChannelInfo), ); } @@ -577,8 +578,7 @@ export function getDownsampleInfoForChannel( credentialsProvider, `${hostname}/latest/downsample/${collection}/${experimentInfo.key}/${channel}`, {}, - responseJson, - ), + ).then((response) => response.json()), ) .then((downsampleObj) => { return parseDownsampleInfoForChannel( @@ -747,12 +747,13 @@ export function getCollections( credentialsProvider, `${hostname}/latest/collection/`, {}, - responseJson, - ).then((value) => - verifyObjectProperty(value, "collections", (x) => - parseArray(x, verifyString), + ) + .then((response) => response.json()) + .then((value) => + verifyObjectProperty(value, "collections", (x) => + parseArray(x, verifyString), + ), ), - ), ); } @@ -769,12 +770,13 @@ export function getExperiments( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/`, {}, - responseJson, - ).then((value) => - verifyObjectProperty(value, "experiments", (x) => - parseArray(x, verifyString), + ) + .then((response) => response.json()) + .then((value) => + verifyObjectProperty(value, "experiments", (x) => + parseArray(x, verifyString), + ), ), - ), ); } @@ -797,10 +799,11 @@ export function getCoordinateFrame( credentialsProvider, `${hostname}/latest/coord/${key}/`, {}, - responseJson, - ).then((coordinateFrameObj) => - parseCoordinateFrame(coordinateFrameObj, experimentInfo), - ), + ) + .then((response) => response.json()) + .then((coordinateFrameObj) => + parseCoordinateFrame(coordinateFrameObj, experimentInfo), + ), ); } diff --git a/src/datasource/brainmaps/api.ts b/src/datasource/brainmaps/api.ts index 4809b30b57..e2cfd481d5 100644 --- a/src/datasource/brainmaps/api.ts +++ b/src/datasource/brainmaps/api.ts @@ -17,9 +17,6 @@ import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; export type { OAuth2Credentials }; @@ -100,32 +97,21 @@ export interface HttpCall { method: "GET" | "POST"; path: string; payload?: string; + signal?: AbortSignal; } export function makeRequest( instance: BrainmapsInstance, credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; -export function makeRequest( - instance: BrainmapsInstance, - credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - instance: BrainmapsInstance, - credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): any { + httpCall: HttpCall, +): Promise { return fetchWithOAuth2Credentials( credentialsProvider, `${instance.serverUrl}${httpCall.path}`, - { method: httpCall.method, body: httpCall.payload }, - httpCall.responseType === "json" ? responseJson : responseArrayBuffer, - cancellationToken, + { + signal: httpCall.signal, + method: httpCall.method, + body: httpCall.payload, + }, ); } diff --git a/src/datasource/brainmaps/backend.ts b/src/datasource/brainmaps/backend.ts index 15f29e8a13..af3c722b81 100644 --- a/src/datasource/brainmaps/backend.ts +++ b/src/datasource/brainmaps/backend.ts @@ -79,7 +79,6 @@ import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { kInfinityVec, kZeroVec, vec3, vec3Key } from "#src/util/geom.js"; import { @@ -178,7 +177,7 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( } } - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const { parameters } = this; // chunkPosition must not be captured, since it will be invalidated by the next call to @@ -205,11 +204,10 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( method: "POST", payload: JSON.stringify(payload), path, - responseType: "arraybuffer", + signal: abortSignal, }, - cancellationToken, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); } } @@ -487,7 +485,7 @@ async function makeBatchMeshRequest( meshName: string; }, ids: Map, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const path = "/v1/objects/meshes:batch"; const batches: BatchMeshFragment[] = []; @@ -512,17 +510,14 @@ async function makeBatchMeshRequest( batches: batches, }; try { - return await makeRequest( - parameters.instance, - credentialsProvider, - { + return await ( + await makeRequest(parameters.instance, credentialsProvider, { method: "POST", path, payload: JSON.stringify(payload), - responseType: "arraybuffer", - }, - cancellationToken, - ); + signal: abortSignal, + }) + ).arrayBuffer(); } finally { for (const [id, idData] of pendingIds) { ids.set(id, idData); @@ -544,31 +539,25 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( return ""; })(); - download( - chunk: BrainmapsMultiscaleManifestChunk, - cancellationToken: CancellationToken, - ) { + download(chunk: BrainmapsMultiscaleManifestChunk, abortSignal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.info.lods[0].info.name}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "GET", - path, - responseType: "json", - }, - cancellationToken, - ).then((response) => decodeMultiscaleManifestChunk(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, { + method: "GET", + path, + signal: abortSignal, + }) + .then((response) => response.json()) + .then((response) => decodeMultiscaleManifestChunk(chunk, response)); } async downloadFragment( chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const { parameters } = this; @@ -652,7 +641,7 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( meshName, }, ids, - cancellationToken, + abortSignal, ) .then((response) => { --requestsInProgress; @@ -783,29 +772,25 @@ export class BrainmapsMeshSource extends BrainmapsSource( return ""; })(); - download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + download(chunk: ManifestChunk, abortSignal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.meshName}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "GET", - path, - responseType: "json", - }, - cancellationToken, - ).then((response) => decodeManifestChunkWithSupervoxelIds(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, { + signal: abortSignal, + method: "GET", + path, + }) + .then((response) => response.json()) + .then((response) => + decodeManifestChunkWithSupervoxelIds(chunk, response), + ); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { + async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; const ids = new Map(); @@ -822,7 +807,7 @@ export class BrainmapsMeshSource extends BrainmapsSource( credentialsProvider, parameters, ids, - cancellationToken, + abortSignal, ); decodeBatchMeshResponse(response, (fragment) => { if (!ids.delete(fragment.fullKey)) { @@ -867,7 +852,7 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, abortSignal: AbortSignal) { const { parameters } = this; const payload: SkeletonPayload = { object_id: `${chunk.objectId}`, @@ -877,17 +862,14 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( `/meshes/${parameters.meshName}` + "/skeleton:binary"; applyChangeStack(parameters.changeSpec, payload); - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "POST", - path, - payload: JSON.stringify(payload), - responseType: "arraybuffer", - }, - cancellationToken, - ).then((response) => decodeSkeletonChunk(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, { + method: "POST", + path, + payload: JSON.stringify(payload), + signal: abortSignal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => decodeSkeletonChunk(chunk, response)); } } @@ -1152,27 +1134,19 @@ export class BrainmapsAnnotationGeometryChunkSource extends BrainmapsSource( AnnotationGeometryChunkSourceBackend, AnnotationSpatialIndexSourceParameters, ) { - async download( - chunk: AnnotationGeometryChunk, - cancellationToken: CancellationToken, - ) { + async download(chunk: AnnotationGeometryChunk, abortSignal: AbortSignal) { const { parameters } = this; return Promise.all( spatialAnnotationTypes.map((spatialAnnotationType) => - makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: spatialAnnotationType, - ignore_payload: true, - }), - responseType: "json", - }, - cancellationToken, - ), + makeRequest(parameters.instance, this.credentialsProvider, { + signal: abortSignal, + method: "POST", + path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + payload: JSON.stringify({ + type: spatialAnnotationType, + ignore_payload: true, + }), + }).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); @@ -1188,63 +1162,52 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, _relationshipIndex: number, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const { parameters } = this; return Promise.all( spatialAnnotationTypes.map((spatialAnnotationType) => - makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: spatialAnnotationType, - object_labels: [chunk.objectId.toString()], - ignore_payload: true, - }), - responseType: "json", - }, - cancellationToken, - ), + makeRequest(parameters.instance, this.credentialsProvider, { + signal: abortSignal, + method: "POST", + path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + payload: JSON.stringify({ + type: spatialAnnotationType, + object_labels: [chunk.objectId.toString()], + ignore_payload: true, + }), + }).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); }); } - downloadMetadata( - chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, - ) { + downloadMetadata(chunk: AnnotationMetadataChunk, abortSignal: AbortSignal) { const { parameters } = this; const id = chunk.key!; - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: getSpatialAnnotationTypeFromId(id), - id: getFullSpatialAnnotationId(parameters, id), - }), - responseType: "json", - }, - cancellationToken, - ).then( - (response) => { - chunk.annotation = parseAnnotationResponse( - response, - getIdPrefix(parameters), - id, - ); - }, - () => { - chunk.annotation = null; - }, - ); + return makeRequest(parameters.instance, this.credentialsProvider, { + signal: abortSignal, + method: "POST", + path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + payload: JSON.stringify({ + type: getSpatialAnnotationTypeFromId(id), + id: getFullSpatialAnnotationId(parameters, id), + }), + }) + .then((response) => response.json()) + .then( + (response) => { + chunk.annotation = parseAnnotationResponse( + response, + getIdPrefix(parameters), + id, + ); + }, + () => { + chunk.annotation = null; + }, + ); } add(annotation: Annotation) { @@ -1254,18 +1217,19 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( method: "POST", path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - responseType: "json", - }).then((response) => { - verifyObject(response); - const ids = verifyObjectProperty(response, "ids", verifyStringArray); - if (ids.length !== 1) { - throw new Error( - `Expected list of 1 id, but received ${JSON.stringify(ids)}.`, - ); - } - const idPrefix = getIdPrefix(this.parameters); - return parseBrainmapsAnnotationId(idPrefix, ids[0]); - }); + }) + .then((response) => response.json()) + .then((response) => { + verifyObject(response); + const ids = verifyObjectProperty(response, "ids", verifyStringArray); + if (ids.length !== 1) { + throw new Error( + `Expected list of 1 id, but received ${JSON.stringify(ids)}.`, + ); + } + const idPrefix = getIdPrefix(this.parameters); + return parseBrainmapsAnnotationId(idPrefix, ids[0]); + }); } update(id: AnnotationId, annotation: Annotation) { @@ -1276,8 +1240,7 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( method: "POST", path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - responseType: "json", - }); + }).then((response) => response.json()); } delete(id: AnnotationId) { @@ -1289,7 +1252,6 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( type: getSpatialAnnotationTypeFromId(id), ids: [getFullSpatialAnnotationId(parameters, id)], }), - responseType: "json", - }); + }).then((response) => response.json()); } } diff --git a/src/datasource/brainmaps/frontend.ts b/src/datasource/brainmaps/frontend.ts index b713dad7bd..f066531b87 100644 --- a/src/datasource/brainmaps/frontend.ts +++ b/src/datasource/brainmaps/frontend.ts @@ -793,8 +793,9 @@ export class BrainmapsDataSource extends DataSourceProvider { makeRequest(this.instance, this.credentialsProvider, { method: "GET", path: `/v1beta2/volumes/${volumeId}`, - responseType: "json", - }).then((response) => new MultiscaleVolumeInfo(response)), + }) + .then((response) => response.json()) + .then((response) => new MultiscaleVolumeInfo(response)), ); } @@ -810,8 +811,9 @@ export class BrainmapsDataSource extends DataSourceProvider { makeRequest(this.instance, this.credentialsProvider, { method: "GET", path: `/v1beta2/objects/${volumeId}/meshes`, - responseType: "json", - }).then((response) => parseMeshesResponse(response)), + }) + .then((response) => response.json()) + .then((response) => parseMeshesResponse(response)), ); } @@ -1020,10 +1022,11 @@ export class BrainmapsDataSource extends DataSourceProvider { const promise = makeRequest(this.instance, this.credentialsProvider, { method: "GET", path: "/v1beta2/projects", - responseType: "json", - }).then((projectsResponse) => { - return parseProjectList(projectsResponse); - }); + }) + .then((response) => response.json()) + .then((projectsResponse) => { + return parseProjectList(projectsResponse); + }); const description = `${this.instance.description} project list`; StatusMessage.forPromise(promise, { delay: true, @@ -1042,10 +1045,11 @@ export class BrainmapsDataSource extends DataSourceProvider { const promise = makeRequest(this.instance, this.credentialsProvider, { method: "GET", path: `/v1beta2/datasets?project_id=${project}`, - responseType: "json", - }).then((datasetsResponse) => { - return parseAPIResponseList(datasetsResponse, "datasetIds"); - }); + }) + .then((response) => response.json()) + .then((datasetsResponse) => { + return parseAPIResponseList(datasetsResponse, "datasetIds"); + }); const description = `${this.instance.description} dataset list`; StatusMessage.forPromise(promise, { delay: true, @@ -1067,19 +1071,20 @@ export class BrainmapsDataSource extends DataSourceProvider { const promise = makeRequest(this.instance, this.credentialsProvider, { method: "GET", path: `/v1beta2/volumes?project_id=${project}&dataset_id=${dataset}`, - responseType: "json", - }).then((volumesResponse) => { - const fullyQualifyiedVolumeList = parseAPIResponseList( - volumesResponse, - "volumeId", - ); - const splitPoint = project.length + dataset.length + 2; - const volumeList = []; - for (const volume of fullyQualifyiedVolumeList) { - volumeList.push(volume.substring(splitPoint)); - } - return volumeList; - }); + }) + .then((response) => response.json()) + .then((volumesResponse) => { + const fullyQualifyiedVolumeList = parseAPIResponseList( + volumesResponse, + "volumeId", + ); + const splitPoint = project.length + dataset.length + 2; + const volumeList = []; + for (const volume of fullyQualifyiedVolumeList) { + volumeList.push(volume.substring(splitPoint)); + } + return volumeList; + }); const description = `${this.instance.description} volume list`; StatusMessage.forPromise(promise, { delay: true, @@ -1105,9 +1110,10 @@ export class BrainmapsDataSource extends DataSourceProvider { { method: "GET", path: `/v1beta2/changes/${volumeId}/change_stacks`, - responseType: "json", }, - ).then((response) => parseChangeStackList(response)); + ) + .then((response) => response.json()) + .then((response) => parseChangeStackList(response)); const description = `change stacks for ${volumeId}`; StatusMessage.forPromise(promise, { delay: true, diff --git a/src/datasource/deepzoom/backend.ts b/src/datasource/deepzoom/backend.ts index 0c7ac55a44..a5bf1e7122 100644 --- a/src/datasource/deepzoom/backend.ts +++ b/src/datasource/deepzoom/backend.ts @@ -26,13 +26,9 @@ import { import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { transposeArray2d } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - isNotFoundError, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; /* This is enough if support for these aren't needed: @@ -57,10 +53,7 @@ export class DeepzoomImageTileSource extends WithParameters( return gridShape; })(); - async download( - chunk: VolumeChunk, - cancellationToken: CancellationToken, - ): Promise { + async download(chunk: VolumeChunk, abortSignal: AbortSignal): Promise { const { parameters } = this; // /* This block is enough if support for these aren't needed: @@ -70,7 +63,7 @@ export class DeepzoomImageTileSource extends WithParameters( // const {tilesize, overlap} = parameters; // const [x, y] = chunk.chunkGridPosition; // const url = `${parameters.url}/${x}_${y}.${ImageTileEncoding[parameters.encoding].toLowerCase()}`; - // const response: Blob = await cancellableFetchSpecialOk(this.credentialsProvider, url, {}, response => response.blob(), cancellationToken); + // const response: Blob = await (await fetchSpecialOk(this.credentialsProvider, url, {signal: abortSignal})).blob(); // const tile = await createImageBitmap(response); // const canvas = new OffscreenCanvas(tilesize, tilesize); // const ctx = canvas.getContext("2d")!; @@ -91,13 +84,11 @@ export class DeepzoomImageTileSource extends WithParameters( const oy = y === 0 ? 0 : overlap; const url = `${parameters.url}/${x}_${y}.${parameters.format}`; try { - const responseBuffer = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); + const responseBuffer = await ( + await fetchSpecialOk(this.credentialsProvider, url, { + signal: abortSignal, + }) + ).arrayBuffer(); let tilewidth = 0; let tileheight = 0; @@ -106,7 +97,7 @@ export class DeepzoomImageTileSource extends WithParameters( case ImageTileEncoding.PNG: { const pngbitmap = await requestAsyncComputation( decodePng, - cancellationToken, + abortSignal, [responseBuffer], new Uint8Array(responseBuffer), undefined, @@ -129,7 +120,7 @@ export class DeepzoomImageTileSource extends WithParameters( case ImageTileEncoding.JPEG: { const jpegbitmap = await requestAsyncComputation( decodeJpeg, - cancellationToken, + abortSignal, [responseBuffer], new Uint8Array(responseBuffer), undefined, diff --git a/src/datasource/deepzoom/frontend.ts b/src/datasource/deepzoom/frontend.ts index d91f269dec..502e2e6cbc 100644 --- a/src/datasource/deepzoom/frontend.ts +++ b/src/datasource/deepzoom/frontend.ts @@ -31,7 +31,6 @@ import { ImageTileEncoding, ImageTileSourceParameters, } from "#src/datasource/deepzoom/base.js"; -import { responseText } from "#src/datasource/dvid/api.js"; import type { CompleteUrlOptions, ConvertLegacyUrlOptions, @@ -72,7 +71,7 @@ import type { SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; @@ -248,11 +247,8 @@ function getDZIMetadata( credentialsProvider: getObjectId(credentialsProvider), }, async () => { - const text = await cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseText, + const text = await fetchSpecialOk(credentialsProvider, url, {}).then( + (response) => response.text(), ); const xml = new DOMParser().parseFromString(text, "text/xml"); const image = xml.documentElement; @@ -346,7 +342,7 @@ export class DeepzoomDataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/dvid/api.ts b/src/datasource/dvid/api.ts index 731c2c2846..32d556cb3d 100644 --- a/src/datasource/dvid/api.ts +++ b/src/datasource/dvid/api.ts @@ -20,14 +20,6 @@ import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { - cancellableFetchOk, - responseArrayBuffer, - responseJson, -} from "#src/util/http_request.js"; export interface DVIDToken { // If token is undefined, it indicates anonymous credentials that may be retried. @@ -36,12 +28,6 @@ export interface DVIDToken { export const credentialsKey = "DVID"; -interface HttpCall { - method: "GET" | "POST" | "DELETE" | "HEAD"; - url: string; - payload?: string; -} - export class DVIDInstance { constructor( public baseUrl: string, @@ -85,91 +71,15 @@ export function appendQueryStringForDvid( return url; } -export function responseText(response: Response): Promise { - return response.text(); -} - -export function makeRequest( - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: "" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): any { - const requestInfo = `${httpCall.url}`; - const init = { method: httpCall.method, body: httpCall.payload }; - - if (httpCall.responseType === "") { - return cancellableFetchOk( - requestInfo, - init, - responseText, - cancellationToken, - ); - } - return cancellableFetchOk(requestInfo, init, responseJson, cancellationToken); -} - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - return fetchWithDVIDCredentials( - credentialsProvider, - httpCall.url, - { method: httpCall.method, body: httpCall.payload }, - httpCall.responseType === "" - ? responseText - : httpCall.responseType === "json" - ? responseJson - : responseArrayBuffer, - cancellationToken, - ); -} - -export function fetchWithDVIDCredentials( +export function fetchWithDVIDCredentials( credentialsProvider: CredentialsProvider, input: string, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { return fetchWithCredentials( credentialsProvider, input, init, - transformResponse, (credentials: DVIDToken, init: RequestInit) => { const newInit: RequestInit = { ...init }; if (credentials.token) { @@ -188,6 +98,5 @@ export function fetchWithDVIDCredentials( } throw error; }, - cancellationToken, ); } diff --git a/src/datasource/dvid/backend.ts b/src/datasource/dvid/backend.ts index 94d8ca0311..7edc1602f1 100644 --- a/src/datasource/dvid/backend.ts +++ b/src/datasource/dvid/backend.ts @@ -20,7 +20,7 @@ import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provi import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { DVIDInstance, - makeRequestWithCredentials, + fetchWithDVIDCredentials, appendQueryStringForDvid, } from "#src/datasource/dvid/api.js"; import { @@ -42,7 +42,6 @@ import { decodeCompressedSegmentationChunk } from "#src/sliceview/backend_chunk_ import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import type { SharedObject } from "#src/worker_rpc.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @@ -65,7 +64,7 @@ export class DVIDSkeletonSource extends DVIDSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, abortSignal: AbortSignal) { const { parameters } = this; const bodyid = `${chunk.objectId}`; const url = @@ -73,18 +72,18 @@ export class DVIDSkeletonSource extends DVIDSource( `/${parameters.dataInstanceKey}/key/` + bodyid + "_swc"; - return makeRequestWithCredentials( + return fetchWithDVIDCredentials( this.credentialsProvider, + appendQueryStringForDvid(url, parameters.user), { - method: "GET", - url: appendQueryStringForDvid(url, parameters.user), - responseType: "arraybuffer", + signal: abortSignal, }, - cancellationToken, - ).then((response) => { - const enc = new TextDecoder("utf-8"); - decodeSwcSkeletonChunk(chunk, enc.decode(response)); - }); + ) + .then((response) => response.arrayBuffer()) + .then((response) => { + const enc = new TextDecoder("utf-8"); + decodeSwcSkeletonChunk(chunk, enc.decode(response)); + }); } } @@ -118,7 +117,7 @@ export class DVIDMeshSource extends DVIDSource( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; const dvidInstance = new DVIDInstance( parameters.baseUrl, @@ -129,15 +128,15 @@ export class DVIDMeshSource extends DVIDSource( `${chunk.fragmentId}.ngmesh`, ); - return makeRequestWithCredentials( + return fetchWithDVIDCredentials( this.credentialsProvider, + appendQueryStringForDvid(meshUrl, parameters.user), { - method: "GET", - url: appendQueryStringForDvid(meshUrl, parameters.user), - responseType: "arraybuffer", + signal: abortSignal, }, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } @@ -146,7 +145,7 @@ export class DVIDVolumeChunkSource extends DVIDSource( VolumeChunkSource, VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const params = this.parameters; let path: string; { @@ -159,18 +158,14 @@ export class DVIDVolumeChunkSource extends DVIDSource( path = this.getPath(chunkPosition, chunkDataSize); } const decoder = this.getDecoder(params); - const response = await makeRequestWithCredentials( + const response = await fetchWithDVIDCredentials( this.credentialsProvider, - { - method: "GET", - url: appendQueryStringForDvid(`${params.baseUrl}${path}`, params.user), - responseType: "arraybuffer", - }, - cancellationToken, - ); + appendQueryStringForDvid(`${params.baseUrl}${path}`, params.user), + { signal: abortSignal }, + ).then((response) => response.arrayBuffer()); await decoder( chunk, - cancellationToken, + abortSignal, params.encoding === VolumeChunkEncoding.JPEG ? response.slice(16) : response, diff --git a/src/datasource/dvid/credentials_provider.ts b/src/datasource/dvid/credentials_provider.ts index 24362dfa2b..1bdf2e9f62 100644 --- a/src/datasource/dvid/credentials_provider.ts +++ b/src/datasource/dvid/credentials_provider.ts @@ -23,26 +23,20 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; +import { getCredentialsWithStatus } from "#src/credentials_provider/interactive_credentials_provider.js"; import type { DVIDToken } from "#src/datasource/dvid/api.js"; -import { responseText } from "#src/datasource/dvid/api.js"; -import { StatusMessage } from "#src/status.js"; -import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; async function getAuthToken( authServer: string, - cancellationToken = uncancelableToken, + abortSignal: AbortSignal, ): Promise { - const token = await cancellableFetchOk( - authServer, - { method: "GET", credentials: "include" }, - responseText, - cancellationToken, - ); + const response = await fetchOk(authServer, { + method: "GET", + credentials: "include", + signal: abortSignal, + }); + const token = await response.text(); return { token }; } @@ -51,80 +45,33 @@ class BaseDVIDCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter((cancellationToken) => { - if (!this.authServer) return Promise.resolve({ token: "" }); - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeAuthStatus( - authServer: string, - msg = "DVID authorization required.", - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { + get = makeCredentialsGetter(async (abortSignal) => { + const { authServer } = this; + if (!authServer) return { token: "" }; + return await getCredentialsWithStatus( + { + description: `DVID server ${this.authServer}`, + supportsImmediate: true, + get: async (abortSignal, immediate) => { + if (immediate) { + return await getAuthToken(authServer, abortSignal); + } // In the current DVID setup, https://flyemlogin. is expected for the login server const match = authServer.match(/^[^/]+\/\/[^/.]+\.([^/]+)/); if (match) { const loginServer = `https://flyemlogin.${match[1]}/login`; - window.alert( + throw new Error( `Please log into ${loginServer} and then refresh the neurogalncer page to try again.\nIf you are unable to log into ${loginServer}, please check your authorization server ${authServer} to make sure it is correct.`, ); } else { - window.alert( + throw new Error( `Please check your authorization server ${authServer} to make sure it is correct.`, ); } - }); - status.setVisible(true); - } - - function requestAuth(authServer: string) { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeAuthStatus( - authServer, - "Waiting for DVID authorization...", - "Retry", - ); - getAuthToken(authServer, cancellationSource).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - writeAuthStatus( - authServer, - `DVID authorization failed: ${reason}.`, - "Retry", - ); - } - }, - ); - } - requestAuth(this.authServer!); - }); + }, + }, + abortSignal, + ); }); } diff --git a/src/datasource/dvid/frontend.ts b/src/datasource/dvid/frontend.ts index 9121f80821..82b5ec2bc7 100644 --- a/src/datasource/dvid/frontend.ts +++ b/src/datasource/dvid/frontend.ts @@ -36,7 +36,7 @@ import type { import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { credentialsKey, - makeRequestWithCredentials, + fetchWithDVIDCredentials, } from "#src/datasource/dvid/api.js"; import type { DVIDSourceParameters } from "#src/datasource/dvid/base.js"; import { @@ -457,11 +457,15 @@ export function getServerInfo( return chunkManager.memoize.getUncounted( { type: "dvid:getServerInfo", baseUrl }, () => { - const result = makeRequestWithCredentials(credentialsProvider, { - url: `${baseUrl}/api/repos/info`, - method: "GET", - responseType: "json", - }).then((response) => new ServerInfo(response)); + const result = fetchWithDVIDCredentials( + credentialsProvider, + `${baseUrl}/api/repos/info`, + { + method: "GET", + }, + ) + .then((response) => response.json()) + .then((response) => new ServerInfo(response)); const description = `repository info for DVID server ${baseUrl}`; StatusMessage.forPromise(result, { initialMessage: `Retrieving ${description}.`, diff --git a/src/datasource/graphene/backend.ts b/src/datasource/graphene/backend.ts index b49783b22d..edd4a1bd6c 100644 --- a/src/datasource/graphene/backend.ts +++ b/src/datasource/graphene/backend.ts @@ -27,7 +27,6 @@ import type { ChunkedGraphChunkSpecification } from "#src/datasource/graphene/ba import { getGrapheneFragmentKey, GRAPHENE_MESH_NEW_SEGMENT_RPC_ID, - responseIdentity, ChunkedGraphSourceParameters, MeshSourceParameters, CHUNKED_GRAPH_LAYER_RPC_ID, @@ -61,14 +60,12 @@ import { import { computeChunkBounds } from "#src/sliceview/volume/backend.js"; import { Uint64Set } from "#src/uint64_set.js"; import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { vec3, vec3Key } from "#src/util/geom.js"; -import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; import type { SpecialProtocolCredentials, SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, @@ -82,7 +79,7 @@ function getVerifiedFragmentPromise( credentialsProvider: SpecialProtocolCredentialsProvider, chunk: FragmentChunk, parameters: MeshSourceParameters, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { if (chunk.fragmentId && chunk.fragmentId.charAt(0) === "~") { const parts = chunk.fragmentId.substr(1).split(":"); @@ -93,23 +90,21 @@ function getVerifiedFragmentPromise( `${parameters.fragmentUrl}/initial/${parts[0]}`, startOffset, endOffset, - cancellationToken, + abortSignal, ); } - return cancellableFetchSpecialOk( + return fetchSpecialOk( credentialsProvider, `${parameters.fragmentUrl}/dynamic/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, - ); + { signal: abortSignal }, + ).then((response) => response.arrayBuffer()); } function getFragmentDownloadPromise( credentialsProvider: SpecialProtocolCredentialsProvider, chunk: FragmentChunk, parameters: MeshSourceParameters, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { let fragmentDownloadPromise; if (parameters.sharding) { @@ -117,16 +112,14 @@ function getFragmentDownloadPromise( credentialsProvider, chunk, parameters, - cancellationToken, + abortSignal, ); } else { - fragmentDownloadPromise = cancellableFetchSpecialOk( + fragmentDownloadPromise = fetchSpecialOk( credentialsProvider, `${parameters.fragmentUrl}/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, - ); + { signal: abortSignal }, + ).then((response) => response.arrayBuffer()); } return fragmentDownloadPromise; } @@ -158,51 +151,46 @@ export class GrapheneMeshSource extends WithParameters( }, TEN_MINUTES); } - async download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + async download(chunk: ManifestChunk, abortSignal: AbortSignal) { const { parameters, newSegments, manifestRequestCount } = this; if (isBaseSegmentId(chunk.objectId, parameters.nBitsForLayerId)) { return decodeManifestChunk(chunk, { fragments: [] }); } const url = `${parameters.manifestUrl}/manifest`; const manifestUrl = `${url}/${chunk.objectId}:${parameters.lod}?verify=1&prepend_seg_ids=1`; - await cancellableFetchSpecialOk( - this.credentialsProvider, - manifestUrl, - {}, - responseJson, - cancellationToken, - ).then((response) => { - const chunkIdentifier = manifestUrl; - if (newSegments.has(chunk.objectId)) { - const requestCount = - (manifestRequestCount.get(chunkIdentifier) || 0) + 1; - manifestRequestCount.set(chunkIdentifier, requestCount); - setTimeout( - () => { - this.chunkManager.queueManager.updateChunkState( - chunk, - ChunkState.QUEUED, - ); - }, - 2 ** requestCount * 1000, - ); - } else { - manifestRequestCount.delete(chunkIdentifier); - } - return decodeManifestChunk(chunk, response); - }); + await fetchSpecialOk(this.credentialsProvider, manifestUrl, { + signal: abortSignal, + }) + .then((response) => response.json()) + .then((response) => { + const chunkIdentifier = manifestUrl; + if (newSegments.has(chunk.objectId)) { + const requestCount = + (manifestRequestCount.get(chunkIdentifier) || 0) + 1; + manifestRequestCount.set(chunkIdentifier, requestCount); + setTimeout( + () => { + this.chunkManager.queueManager.updateChunkState( + chunk, + ChunkState.QUEUED, + ); + }, + 2 ** requestCount * 1000, + ); + } else { + manifestRequestCount.delete(chunkIdentifier); + } + return decodeManifestChunk(chunk, response); + }); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { + async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; const response = await getFragmentDownloadPromise( undefined, chunk, parameters, - cancellationToken, + abortSignal, ); await decodeDracoFragmentChunk(chunk, response); } @@ -282,7 +270,7 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( async download( chunk: ChunkedGraphChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const { parameters } = this; const chunkPosition = this.computeChunkBounds(chunk); @@ -292,12 +280,10 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( `${chunkPosition[1]}-${chunkPosition[1] + chunkDataSize[1]}_` + `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; - const request = cancellableFetchSpecialOk( + const request = fetchSpecialOk( this.credentialsProvider, `${parameters.url}/${chunk.segment}/leaves?int64_as_str=1&bounds=${bounds}`, - {}, - responseIdentity, - cancellationToken, + { signal: abortSignal }, ); await this.withErrorMessage( request, diff --git a/src/datasource/graphene/base.ts b/src/datasource/graphene/base.ts index 52048f98db..28a6403af3 100644 --- a/src/datasource/graphene/base.ts +++ b/src/datasource/graphene/base.ts @@ -68,8 +68,6 @@ export class MultiscaleMeshMetadata { sharding: Array | undefined; } -export const responseIdentity = async (x: any) => x; - export function isBaseSegmentId(segmentId: Uint64, nBitsForLayerId: number) { const layerId = Uint64.rshift(new Uint64(), segmentId, 64 - nBitsForLayerId); return Uint64.equal(layerId, Uint64.ONE); diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 04a1281b69..81e64d154a 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -51,7 +51,6 @@ import { makeChunkedGraphChunkSpecification, MeshSourceParameters, PYCG_APP_VERSION, - responseIdentity, } from "#src/datasource/graphene/base.js"; import type { DataSource, @@ -161,11 +160,7 @@ import type { ValueOrError } from "#src/util/error.js"; import { makeValueOrError, valueOrThrow } from "#src/util/error.js"; import { EventActionMap } from "#src/util/event_action_map.js"; import { mat4, vec3, vec4 } from "#src/util/geom.js"; -import { - HttpError, - isNotFoundError, - responseJson, -} from "#src/util/http_request.js"; +import { HttpError, isNotFoundError } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -190,7 +185,7 @@ import type { SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; @@ -566,11 +561,8 @@ function getJsonMetadata( credentialsProvider: getObjectId(credentialsProvider), }, async () => { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/info`, - {}, - responseJson, + return await fetchSpecialOk(credentialsProvider, `${url}/info`, {}).then( + (response) => response.json(), ); }, ); @@ -1607,12 +1599,7 @@ class GrapheneGraphServerInterface { Number.isNaN(timestampEpoch) ? "" : `×tamp=${timestampEpoch}` }`; - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseIdentity, - ); + const promise = fetchSpecialOk(this.credentialsProvider, url, {}); const response = await withErrorMessageHTTP(promise, { initialMessage: `Retrieving root for segment ${segment}`, @@ -1632,7 +1619,7 @@ class GrapheneGraphServerInterface { return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); } - const promise = cancellableFetchSpecialOk( + const promise = fetchSpecialOk( this.credentialsProvider, `${url}/merge?int64_as_str=1`, { @@ -1648,7 +1635,6 @@ class GrapheneGraphServerInterface { ], ]), }, - responseIdentity, ); try { @@ -1674,7 +1660,7 @@ class GrapheneGraphServerInterface { return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); } - const promise = cancellableFetchSpecialOk( + const promise = fetchSpecialOk( this.credentialsProvider, `${url}/split?int64_as_str=1`, { @@ -1690,7 +1676,6 @@ class GrapheneGraphServerInterface { ]), }), }, - responseIdentity, ); const response = await withErrorMessageHTTP(promise, { @@ -1708,17 +1693,12 @@ class GrapheneGraphServerInterface { async filterLatestRoots(segments: Uint64[]): Promise { const url = `${this.url}/is_latest_roots`; - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - url, - { - method: "POST", - body: JSON.stringify({ - node_ids: segments.map((x) => x.toJSON()), - }), - }, - responseIdentity, - ); + const promise = fetchSpecialOk(this.credentialsProvider, url, { + method: "POST", + body: JSON.stringify({ + node_ids: segments.map((x) => x.toJSON()), + }), + }); const response = await withErrorMessageHTTP(promise, { errorPrefix: "Could not check latest: ", diff --git a/src/datasource/index.ts b/src/datasource/index.ts index e1cc361c05..398f887f08 100644 --- a/src/datasource/index.ts +++ b/src/datasource/index.ts @@ -35,8 +35,6 @@ import type { SingleMeshSource } from "#src/single_mesh/frontend.js"; import type { SkeletonSource } from "#src/skeleton/frontend.js"; import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import type { BasicCompletionResult, CompletionWithDescription, @@ -97,7 +95,7 @@ export function suggestLayerNameBasedOnSeparator( export interface GetDataSourceOptionsBase { chunkManager: ChunkManager; - cancellationToken?: CancellationToken; + abortSignal?: AbortSignal; url: string; transform: CoordinateTransformSpecification | undefined; globalCoordinateSpace: WatchableValueInterface; @@ -107,7 +105,7 @@ export interface GetDataSourceOptionsBase { export interface GetDataSourceOptions extends GetDataSourceOptionsBase { registry: DataSourceProviderRegistry; providerUrl: string; - cancellationToken: CancellationToken; + abortSignal: AbortSignal; providerProtocol: string; credentialsManager: CredentialsManager; } @@ -151,14 +149,14 @@ export interface DataSubsource { export interface CompleteUrlOptionsBase { url: string; - cancellationToken?: CancellationToken; + abortSignal?: AbortSignal; chunkManager: ChunkManager; } export interface CompleteUrlOptions extends CompleteUrlOptionsBase { registry: DataSourceProviderRegistry; providerUrl: string; - cancellationToken: CancellationToken; + abortSignal: AbortSignal; credentialsManager: CredentialsManager; } @@ -382,7 +380,7 @@ export class DataSourceProviderRegistry extends RefCounted { async get(options: GetDataSourceOptionsBase): Promise { const redirectLog = new Set(); - const { cancellationToken = uncancelableToken } = options; + const { abortSignal } = options; let url: string = options.url; while (true) { const [provider, providerUrl, providerProtocol] = this.getProvider( @@ -396,7 +394,7 @@ export class DataSourceProviderRegistry extends RefCounted { providerProtocol, providerUrl, registry: this, - cancellationToken, + abortSignal: abortSignal ?? new AbortController().signal, credentialsManager: this.credentialsManager, }); } catch (e) { @@ -460,7 +458,7 @@ export class DataSourceProviderRegistry extends RefCounted { options: CompleteUrlOptionsBase, ): Promise { // Check if url matches a protocol. Note that protocolPattern always matches. - const { url, cancellationToken = uncancelableToken } = options; + const { url, abortSignal } = options; const protocolMatch = url.match(protocolPattern)!; const protocol = protocolMatch[1]; if (protocol === undefined) { @@ -481,7 +479,7 @@ export class DataSourceProviderRegistry extends RefCounted { url, providerUrl: protocolMatch[2], chunkManager: options.chunkManager, - cancellationToken, + abortSignal: abortSignal ?? new AbortController().signal, credentialsManager: this.credentialsManager, }); return applyCompletionOffset(protocol.length + 3, completions); diff --git a/src/datasource/middleauth/credentials_provider.ts b/src/datasource/middleauth/credentials_provider.ts index c5a6ab9995..719ed4738a 100644 --- a/src/datasource/middleauth/credentials_provider.ts +++ b/src/datasource/middleauth/credentials_provider.ts @@ -22,7 +22,12 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; +import { + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; import { StatusMessage } from "#src/status.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { verifyObject, verifyObjectProperty, @@ -51,83 +56,68 @@ function openPopupCenter(url: string, width: number, height: number) { ); } -async function waitForLogin(serverUrl: string): Promise { - const status = new StatusMessage(/*delay=*/ false, /*modal=*/ true); - - const res: Promise = new Promise((f) => { - function writeLoginStatus(message: string, buttonMessage: string) { - status.element.textContent = message + " "; - const button = document.createElement("button"); - button.textContent = buttonMessage; - status.element.appendChild(button); - - button.addEventListener("click", () => { - writeLoginStatus( - `Waiting for login to middleauth server ${serverUrl}...`, - "Retry", - ); - - const auth_popup = openPopupCenter( - `${serverUrl}/api/v1/authorize`, - 400, - 650, - ); - - const closeAuthPopup = () => { - auth_popup?.close(); - }; - - window.addEventListener("beforeunload", closeAuthPopup); - const checkClosed = setInterval(() => { - if (auth_popup?.closed) { - clearInterval(checkClosed); - writeLoginStatus( - `Login window closed for middleauth server ${serverUrl}.`, - "Retry", - ); - } - }, 1000); - - const tokenListener = async (ev: MessageEvent) => { - if (ev.source === auth_popup) { - clearInterval(checkClosed); - window.removeEventListener("message", tokenListener); - window.removeEventListener("beforeunload", closeAuthPopup); - closeAuthPopup(); - - verifyObject(ev.data); - const accessToken = verifyObjectProperty( - ev.data, - "token", - verifyString, - ); - const appUrls = verifyObjectProperty( - ev.data, - "app_urls", - verifyStringArray, - ); - - const token: MiddleAuthToken = { - tokenType: "Bearer", - accessToken, - url: serverUrl, - appUrls, - }; - f(token); - } - }; - - window.addEventListener("message", tokenListener); - }); - } - - writeLoginStatus(`middleauth server ${serverUrl} login required.`, "Login"); +function waitForAuthResponseMessage( + serverUrl: string, + source: Window, + abortSignal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event) => { + if (event.source !== source) return; + try { + const obj = verifyObject(event.data); + const accessToken = verifyObjectProperty(obj, "token", verifyString); + const appUrls = verifyObjectProperty( + obj, + "app_urls", + verifyStringArray, + ); + + const token: MiddleAuthToken = { + tokenType: "Bearer", + accessToken, + url: serverUrl, + appUrls, + }; + resolve(token); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); + } + }, + { signal: abortSignal }, + ); }); +} +async function waitForLogin( + serverUrl: string, + abortSignal: AbortSignal, +): Promise { + const abortController = new AbortController(); + abortSignal = AbortSignal.any([abortController.signal, abortSignal]); try { - return await res; + const newWindow = openPopupCenter( + `${serverUrl}/api/v1/authorize`, + 400, + 650, + ); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), + abortSignal, + ); } finally { - status.dispose(); + abortController.abort(); } } @@ -154,7 +144,7 @@ export class MiddleAuthCredentialsProvider extends CredentialsProvider { + get = makeCredentialsGetter(async (abortSignal) => { let token = undefined; if (!this.alreadyTriedLocalStorage) { @@ -163,7 +153,14 @@ export class MiddleAuthCredentialsProvider extends CredentialsProvider waitForLogin(this.serverUrl, abortSignal), + }, + abortSignal, + ); saveAuthTokenToLocalStorage(this.serverUrl, token); } diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index d2fd83a20b..0a20bd745d 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -26,20 +26,16 @@ import { import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import { decodeGzip } from "#src/util/gzip.js"; -import { - isNotFoundError, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; async function decodeChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, encoding: VolumeChunkEncoding, ) { @@ -70,7 +66,7 @@ async function decodeChunk( case VolumeChunkEncoding.BLOSC: buffer = await requestAsyncComputation( decodeBlosc, - cancellationToken, + abortSignal, [buffer.buffer], buffer, ); @@ -78,7 +74,7 @@ async function decodeChunk( case VolumeChunkEncoding.ZSTD: buffer = await requestAsyncComputation( decodeZstd, - cancellationToken, + abortSignal, [buffer.buffer], buffer, ); @@ -86,7 +82,7 @@ async function decodeChunk( } await decodeRawChunk( chunk, - cancellationToken, + abortSignal, buffer.buffer, Endianness.BIG, buffer.byteOffset, @@ -101,7 +97,7 @@ export class PrecomputedVolumeChunkSource extends WithParameters( ), VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const { parameters } = this; const { chunkGridPosition } = chunk; let url = parameters.url; @@ -110,17 +106,13 @@ export class PrecomputedVolumeChunkSource extends WithParameters( url += `/${chunkGridPosition[i]}`; } try { - const response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); + const response = await fetchSpecialOk(this.credentialsProvider, url, { + signal: abortSignal, + }); await decodeChunk( chunk, - cancellationToken, - response, + abortSignal, + await response.arrayBuffer(), parameters.encoding, ); } catch (e) { diff --git a/src/datasource/n5/frontend.ts b/src/datasource/n5/frontend.ts index 92dba794bb..e76695b2ad 100644 --- a/src/datasource/n5/frontend.ts +++ b/src/datasource/n5/frontend.ts @@ -59,11 +59,7 @@ import { import { transposeNestedArrays } from "#src/util/array.js"; import type { Borrowed } from "#src/util/disposable.js"; import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { - isNotFoundError, - parseUrl, - responseJson, -} from "#src/util/http_request.js"; +import { isNotFoundError, parseUrl } from "#src/util/http_request.js"; import { expectArray, parseArray, @@ -86,7 +82,7 @@ import type { SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; @@ -304,7 +300,8 @@ function getIndividualAttributesJson( credentialsProvider: getObjectId(credentialsProvider), }, () => - cancellableFetchSpecialOk(credentialsProvider, url, {}, responseJson) + fetchSpecialOk(credentialsProvider, url, {}) + .then((response) => response.json()) .then((j) => { try { return verifyObject(j); @@ -591,7 +588,7 @@ export class N5DataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/ngauth/credentials_provider.ts b/src/datasource/ngauth/credentials_provider.ts index 2d3affd68c..ed24973eba 100644 --- a/src/datasource/ngauth/credentials_provider.ts +++ b/src/datasource/ngauth/credentials_provider.ts @@ -19,9 +19,13 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; +import { + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import { StatusMessage } from "#src/status.js"; -import { HttpError, responseJson } from "#src/util/http_request.js"; +import { raceWithAbort } from "#src/util/abort.js"; +import { HttpError } from "#src/util/http_request.js"; import { verifyObject, verifyObjectProperty, @@ -39,74 +43,92 @@ export interface Credentials { token: string; } -async function waitForLogin(serverUrl: string): Promise { - const status = new StatusMessage(/*delay=*/ false); - function writeLoginStatus(message: string, buttonMessage: string) { - status.element.textContent = message + " "; - const button = document.createElement("button"); - button.textContent = buttonMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - window.open( - `${serverUrl}/login?origin=${encodeURIComponent(self.origin)}`, - ); - writeLoginStatus( - `Waiting for login to ngauth server ${serverUrl}...`, - "Retry", - ); - }); - } - const messagePromise = new Promise((resolve, reject) => { - function messageHandler(event: MessageEvent) { - const eventOrigin = - event.origin || ((event).originalEvent).origin; - if (eventOrigin !== serverUrl) { - return; - } - const removeListener = () => { - window.removeEventListener("message", messageHandler, false); - }; - const { data } = event; - if (event.data === "badorigin") { - removeListener(); - reject(makeOriginError(serverUrl)); - } - try { - verifyObject(data); - const token = verifyObjectProperty(data, "token", verifyString); - removeListener(); - resolve(token); - } catch (e) { - console.log( - "ngauth: Received unexpected message from ${serverUrl}", - event, - ); - } - } - window.addEventListener("message", messageHandler, false); - }); - writeLoginStatus(`ngauth server ${serverUrl} login required.`, "Login"); +async function waitForLogin( + serverUrl: string, + abortSignal: AbortSignal, +): Promise { + const abortController = new AbortController(); + abortSignal = AbortSignal.any([abortController.signal, abortSignal]); try { - return { token: await messagePromise }; + const newWindow = window.open( + `${serverUrl}/login?origin=${encodeURIComponent(self.origin)}`, + ); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), + abortSignal, + ); } finally { - status.dispose(); + abortController.abort(); } } +function waitForAuthResponseMessage( + serverUrl: string, + source: Window, + abortSignal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.source !== source) return; + const eventOrigin = + event.origin || ((event).originalEvent).origin; + if (eventOrigin !== serverUrl) { + return; + } + const { data } = event; + if (event.data === "badorigin") { + reject(makeOriginError(serverUrl)); + return; + } + try { + verifyObject(data); + const token = verifyObjectProperty(data, "token", verifyString); + resolve({ token }); + } catch (e) { + reject( + new Error( + `Received unexpected authentication response: ${e.message}`, + ), + ); + console.error( + "ngauth: Received unexpected message from ${serverUrl}", + event, + ); + } + }, + { signal: abortSignal }, + ); + }); +} + export class NgauthCredentialsProvider extends CredentialsProvider { constructor(public serverUrl: string) { super(); } - get = makeCredentialsGetter(async () => { + get = makeCredentialsGetter(async (abortSignal) => { const response = await fetch(`${this.serverUrl}/token`, { method: "POST", credentials: "include", + signal: abortSignal, }); switch (response.status) { case 200: return { token: await response.text() }; case 401: - return await waitForLogin(this.serverUrl); + return await getCredentialsWithStatus( + { + description: `ngauth server ${this.serverUrl}`, + requestDescription: "login", + get: (abortSignal) => waitForLogin(this.serverUrl, abortSignal), + }, + abortSignal, + ); case 403: throw makeOriginError(this.serverUrl); default: @@ -128,7 +150,6 @@ export class NgauthGcsCredentialsProvider extends CredentialsProvider { return { ...init, @@ -146,6 +167,6 @@ export class NgauthGcsCredentialsProvider extends CredentialsProvider { return fetchWithCredentials( credentialsProvider, `${serverUrl}${path}`, init, - responseJson, (credentials, init) => { const headers = new Headers(init.headers); headers.set("Authorization", credentials.token); @@ -628,8 +623,7 @@ function fetchWithNggraphCredentials( if (status === 401) return "refresh"; throw error; }, - cancellationToken, - ); + ).then((response) => response.json()); } interface EntityCredentials extends Credentials { @@ -642,14 +636,12 @@ function nggraphServerFetch( serverUrl: string, path: string, init: RequestInit, - cancellationToken: CancellationToken = uncancelableToken, ): Promise { return fetchWithNggraphCredentials( getCredentialsProvider(chunkManager, serverUrl), serverUrl, path, init, - cancellationToken, ); } @@ -710,14 +702,12 @@ function nggraphGraphFetch( entityName: string, path: string, init: RequestInit, - cancellationToken: CancellationToken = uncancelableToken, ): Promise { return fetchWithNggraphCredentials( getEntityCredentialsProvider(chunkManager, serverUrl, entityName), serverUrl, path, init, - cancellationToken, ); } diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index 4778a49b15..1235cd6981 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -32,7 +32,6 @@ import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { DataType } from "#src/sliceview/volume/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import { Endianness } from "#src/util/endian.js"; import { @@ -58,7 +57,7 @@ export class NiftiFileData { async function decodeNiftiFile( buffer: ArrayBuffer, - _cancellationToken: CancellationToken, + _cancellationToken: AbortSignal, ) { if (isCompressed(buffer)) { buffer = await decodeGzip(buffer, "gzip"); @@ -78,7 +77,7 @@ function getNiftiFileData( credentialsProvider: SpecialProtocolCredentialsProvider, url: string, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { return GenericSharedDataSource.getUrl( chunkManager, @@ -86,7 +85,7 @@ function getNiftiFileData( decodeNiftiFile, url, getPriority, - cancellationToken, + abortSignal, ); } @@ -96,7 +95,7 @@ async function getNiftiHeaderInfo( chunkManager: Borrowed, credentialsProvider: SpecialProtocolCredentialsProvider, url: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const data = await getNiftiFileData( chunkManager, @@ -106,7 +105,7 @@ async function getNiftiHeaderInfo( priorityTier: ChunkPriorityTier.VISIBLE, priority: NIFTI_HEADER_INFO_PRIORITY, }), - cancellationToken, + abortSignal, ); return data.header; } @@ -166,7 +165,7 @@ const DATA_TYPE_CONVERSIONS = new Map([ registerPromiseRPC( GET_NIFTI_VOLUME_INFO_RPC_ID, - async function (x, cancellationToken): RPCPromise { + async function (x, abortSignal): RPCPromise { const chunkManager = this.getRef(x.chunkManager); const credentialsProvider = this.getOptionalRef< SharedCredentialsProviderCounterpart< @@ -178,7 +177,7 @@ registerPromiseRPC( chunkManager, credentialsProvider, x.url, - cancellationToken, + abortSignal, ); const dataTypeInfo = DATA_TYPE_CONVERSIONS.get(header.datatypeCode); if (dataTypeInfo === undefined) { @@ -321,19 +320,19 @@ export class NiftiVolumeChunkSource extends WithParameters( ), VolumeSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const data = await getNiftiFileData( this.chunkManager, this.credentialsProvider, this.parameters.url, () => ({ priorityTier: chunk.priorityTier, priority: chunk.priority }), - cancellationToken, + abortSignal, ); const imageBuffer = readImage(data.header, data.uncompressedData); await decodeRawChunk( chunk, - cancellationToken, + abortSignal, imageBuffer, data.header.littleEndian ? Endianness.LITTLE : Endianness.BIG, ); diff --git a/src/datasource/nifti/frontend.ts b/src/datasource/nifti/frontend.ts index c61ebdbfb7..4243fc20f5 100644 --- a/src/datasource/nifti/frontend.ts +++ b/src/datasource/nifti/frontend.ts @@ -51,8 +51,6 @@ import { MultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import { completeHttpPath } from "#src/util/http_path_completion.js"; import * as matrix from "#src/util/matrix.js"; import type { @@ -121,7 +119,7 @@ function getNiftiVolumeInfo( chunkManager: ChunkManager, credentialsProvider: SpecialProtocolCredentialsProvider, url: string, - cancellationToken: CancellationToken, + abortSignal?: AbortSignal, ) { return chunkManager.rpc!.promiseInvoke( GET_NIFTI_VOLUME_INFO_RPC_ID, @@ -134,7 +132,7 @@ function getNiftiVolumeInfo( ), url: url, }, - cancellationToken, + abortSignal, ); } @@ -154,7 +152,6 @@ function getDataSource( chunkManager, credentialsProvider, parsedUrl, - uncancelableToken, ); const volume = new NiftiMultiscaleVolumeChunkSource( chunkManager, @@ -223,7 +220,7 @@ export class NiftiDataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/obj/backend.ts b/src/datasource/obj/backend.ts index 0cbb36b33a..bc5f42c798 100644 --- a/src/datasource/obj/backend.ts +++ b/src/datasource/obj/backend.ts @@ -18,16 +18,15 @@ import { parseOBJFromArrayBuffer } from "#src/async_computation/obj_mesh_request import { requestAsyncComputation } from "#src/async_computation/request.js"; import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; /** * This needs to be a global function, because it identifies the instance of GenericSharedDataSource * to use. */ -function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { +function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { return requestAsyncComputation( parseOBJFromArrayBuffer, - cancellationToken, + abortSignal, [buffer], buffer, ); @@ -35,19 +34,13 @@ function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { registerSingleMeshFactory("obj", { description: "OBJ", - getMesh: ( - chunkManager, - credentialsProvider, - url, - getPriority, - cancellationToken, - ) => + getMesh: (chunkManager, credentialsProvider, url, getPriority, abortSignal) => GenericSharedDataSource.getUrl( chunkManager, credentialsProvider, parse, url, getPriority, - cancellationToken, + abortSignal, ), }); diff --git a/src/datasource/obj/frontend.ts b/src/datasource/obj/frontend.ts index a5a6e09500..e2d9ab15a6 100644 --- a/src/datasource/obj/frontend.ts +++ b/src/datasource/obj/frontend.ts @@ -60,7 +60,7 @@ export class ObjDataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index c58f695966..0d885563b8 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -78,24 +78,19 @@ import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; import { decodeGzip } from "#src/util/gzip.js"; import { murmurHash3_x86_128Hash64Bits } from "#src/util/hash.js"; -import { - isNotFoundError, - responseArrayBuffer, - responseJson, -} from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import { stableStringify } from "#src/util/json.js"; import { getObjectId } from "#src/util/object_id.js"; import type { SpecialProtocolCredentials, SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { encodeZIndexCompressed, @@ -153,10 +148,7 @@ function getMinishardIndexDataSource( credentialsProvider: getObjectId(credentialsProvider), }), { - download: async ( - shardAndMinishard: Uint64, - cancellationToken: CancellationToken, - ) => { + download: async (shardAndMinishard: Uint64, abortSignal: AbortSignal) => { const minishard = Uint64.lowMask(new Uint64(), sharding.minishardBits); Uint64.and(minishard, minishard, shardAndMinishard); const shard = Uint64.lowMask(new Uint64(), sharding.shardBits); @@ -184,7 +176,7 @@ function getMinishardIndexDataSource( shardUrl, shardIndexStart, shardIndexEnd, - cancellationToken, + abortSignal, ); } catch (e) { if (isNotFoundError(e)) return { data: undefined, size: 0 }; @@ -215,7 +207,7 @@ function getMinishardIndexDataSource( shardUrl, minishardStartOffset, minishardEndOffset, - cancellationToken, + abortSignal, ); if (sharding.minishardIndexEncoding === DataEncoding.GZIP) { minishardIndexResponse = await decodeGzip( @@ -315,7 +307,7 @@ async function getShardedData( minishardIndexSource: MinishardIndexSource, chunk: Chunk, key: Uint64, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise<{ shardInfo: ShardInfo; data: ArrayBuffer } | undefined> { const { sharding } = minishardIndexSource; const hashFunction = shardingHashFunctions.get(sharding.hash)!; @@ -333,7 +325,7 @@ async function getShardedData( const minishardIndex = await minishardIndexSource.getData( shardAndMinishard, getPriority, - cancellationToken, + abortSignal, ); if (minishardIndex === undefined) return undefined; const minishardEntry = findMinishardEntry(minishardIndex, key); @@ -344,7 +336,7 @@ async function getShardedData( minishardIndex.shardUrl, startOffset, endOffset, - cancellationToken, + abortSignal, ); if (minishardIndexSource.sharding.dataEncoding === DataEncoding.GZIP) { data = await decodeGzip(data, "gzip"); @@ -394,10 +386,7 @@ export class PrecomputedVolumeChunkSource extends WithParameters( return gridShape; })(); - async download( - chunk: VolumeChunk, - cancellationToken: CancellationToken, - ): Promise { + async download(chunk: VolumeChunk, abortSignal: AbortSignal): Promise { const { parameters } = this; const { minishardIndexSource } = this; @@ -417,13 +406,9 @@ export class PrecomputedVolumeChunkSource extends WithParameters( `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; } try { - response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); + response = await fetchSpecialOk(this.credentialsProvider, url, { + signal: abortSignal, + }).then((response) => response.arrayBuffer()); } catch (e) { if (isNotFoundError(e)) { response = undefined; @@ -452,12 +437,12 @@ export class PrecomputedVolumeChunkSource extends WithParameters( minishardIndexSource, chunk, chunkIndex, - cancellationToken, + abortSignal, ) )?.data; } if (response !== undefined) { - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, abortSignal, response); } } } @@ -490,31 +475,24 @@ export class PrecomputedMeshSource extends WithParameters( ), MeshSourceParameters, ) { - async download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + async download(chunk: ManifestChunk, abortSignal: AbortSignal) { const { parameters } = this; - const response = await cancellableFetchSpecialOk( + const response = await fetchSpecialOk( this.credentialsProvider, `${parameters.url}/${chunk.objectId}:${parameters.lod}`, - {}, - responseJson, - cancellationToken, + { signal: abortSignal }, ); - decodeManifestChunk(chunk, response); + decodeManifestChunk(chunk, await response.json()); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { + async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; - const response = await cancellableFetchSpecialOk( + const response = await fetchSpecialOk( this.credentialsProvider, `${parameters.url}/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, + { signal: abortSignal }, ); - decodeFragmentChunk(chunk, response); + decodeFragmentChunk(chunk, await response.arrayBuffer()); } } @@ -775,25 +753,23 @@ export class PrecomputedMultiscaleMeshSource extends WithParameters( async download( chunk: PrecomputedMultiscaleManifestChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const { parameters, minishardIndexSource } = this; let data: ArrayBuffer; if (minishardIndexSource === undefined) { - data = await cancellableFetchSpecialOk( + data = await fetchSpecialOk( this.credentialsProvider, `${parameters.url}/${chunk.objectId}.index`, - {}, - responseArrayBuffer, - cancellationToken, - ); + { signal: abortSignal }, + ).then((response) => response.arrayBuffer()); } else { ({ data, shardInfo: chunk.shardInfo } = getOrNotFoundError( await getShardedData( minishardIndexSource, chunk, chunk.objectId, - cancellationToken, + abortSignal, ), )); } @@ -802,7 +778,7 @@ export class PrecomputedMultiscaleMeshSource extends WithParameters( async downloadFragment( chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const { parameters } = this; const manifestChunk = @@ -845,7 +821,7 @@ export class PrecomputedMultiscaleMeshSource extends WithParameters( requestUrl, adjustedStartOffset, adjustedEndOffset, - cancellationToken, + abortSignal, ); await decodeMultiscaleFragmentChunk(chunk, response); } @@ -857,17 +833,13 @@ async function fetchByUint64( chunk: Chunk, minishardIndexSource: MinishardIndexSource | undefined, id: Uint64, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { if (minishardIndexSource === undefined) { try { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/${id}`, - {}, - responseArrayBuffer, - cancellationToken, - ); + return await fetchSpecialOk(credentialsProvider, `${url}/${id}`, { + signal: abortSignal, + }).then((response) => response.arrayBuffer()); } catch (e) { if (isNotFoundError(e)) return undefined; throw e; @@ -877,7 +849,7 @@ async function fetchByUint64( minishardIndexSource, chunk, id, - cancellationToken, + abortSignal, ); if (result === undefined) return undefined; return result.data; @@ -895,7 +867,7 @@ export class PrecomputedSkeletonSource extends WithParameters( this.credentialsProvider, { url: this.parameters.url, sharding: this.parameters.metadata.sharding }, ); - async download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + async download(chunk: SkeletonChunk, abortSignal: AbortSignal) { const { parameters } = this; const response = getOrNotFoundError( await fetchByUint64( @@ -904,7 +876,7 @@ export class PrecomputedSkeletonSource extends WithParameters( chunk, this.minishardIndexSource, chunk.objectId, - cancellationToken, + abortSignal, ), ); decodeSkeletonChunk(chunk, response, parameters.metadata.vertexAttributes); @@ -1061,10 +1033,7 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete this.parameters, ); parent: PrecomputedAnnotationSourceBackend; - async download( - chunk: AnnotationGeometryChunk, - cancellationToken: CancellationToken, - ) { + async download(chunk: AnnotationGeometryChunk, abortSignal: AbortSignal) { const { parameters } = this; const { minishardIndexSource } = this; @@ -1074,13 +1043,9 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete if (minishardIndexSource === undefined) { const url = `${parameters.url}/${chunkGridPosition.join("_")}`; try { - response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); + response = await fetchSpecialOk(this.credentialsProvider, url, { + signal: abortSignal, + }).then((response) => response.arrayBuffer()); } catch (e) { if (!isNotFoundError(e)) throw e; } @@ -1096,7 +1061,7 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete minishardIndexSource, chunk, chunkIndex, - cancellationToken, + abortSignal, ); if (result !== undefined) response = result.data; } @@ -1136,7 +1101,7 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( async downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const { parameters } = this; const response = await fetchByUint64( @@ -1145,7 +1110,7 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( chunk, this.relationshipIndexSource[relationshipIndex], chunk.objectId, - cancellationToken, + abortSignal, ); if (response !== undefined) { chunk.data = parseAnnotations( @@ -1158,7 +1123,7 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( async downloadMetadata( chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const { parameters } = this; const id = Uint64.parseString(chunk.key!); @@ -1168,7 +1133,7 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( chunk, this.byIdMinishardIndexSource, id, - cancellationToken, + abortSignal, ); if (response === undefined) { chunk.annotation = null; diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index 3ee7808d4b..6cec9c310e 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -93,7 +93,7 @@ import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; import type { Borrowed } from "#src/util/disposable.js"; import { mat4, vec3 } from "#src/util/geom.js"; import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError, responseJson } from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -119,7 +119,7 @@ import type { SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; import { Uint64 } from "#src/util/uint64.js"; @@ -749,11 +749,8 @@ function getJsonMetadata( credentialsProvider: getObjectId(credentialsProvider), }, async () => { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/info`, - {}, - responseJson, + return await fetchSpecialOk(credentialsProvider, `${url}/info`, {}).then( + (response) => response.json(), ); }, ); @@ -1443,7 +1440,7 @@ export class PrecomputedDataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/python/backend.ts b/src/datasource/python/backend.ts index 134ef939bc..a947a19311 100644 --- a/src/datasource/python/backend.ts +++ b/src/datasource/python/backend.ts @@ -38,12 +38,8 @@ import { VolumeChunk, VolumeChunkSource, } from "#src/sliceview/volume/backend.js"; -import { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); @@ -59,7 +55,7 @@ export class PythonVolumeChunkSource extends WithParameters( chunkDecoder = chunkDecoders.get(this.parameters["encoding"])!; encoding = VolumeChunkEncoding[this.parameters.encoding].toLowerCase(); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const { parameters } = this; let path = `../../neuroglancer/${this.encoding}/${parameters.key}/${parameters.scaleKey}`; { @@ -74,13 +70,10 @@ export class PythonVolumeChunkSource extends WithParameters( path += (chunkPosition[i] + chunkDataSize[i]).toString(); } } - const response = await cancellableFetchOk( - new URL(path, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ); - await this.chunkDecoder(chunk, cancellationToken, response); + const response = await fetchOk(new URL(path, parameters.baseUrl).href, { + signal: abortSignal, + }); + await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); } } @@ -112,17 +105,16 @@ export class PythonMeshSource extends WithParameters( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/mesh/${parameters.key}/${ chunk.manifestChunk!.objectId }`; - return cancellableFetchOk( - new URL(requestPath, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + return fetchOk(new URL(requestPath, parameters.baseUrl).href, { + signal: abortSignal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } @@ -131,16 +123,15 @@ export class PythonSkeletonSource extends WithParameters( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, abortSignal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/skeleton/${parameters.key}/${chunk.objectId}`; - return cancellableFetchOk( - new URL(requestPath, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => - decodeSkeletonChunk(chunk, response, parameters.vertexAttributes), - ); + return fetchOk(new URL(requestPath, parameters.baseUrl).href, { + signal: abortSignal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => + decodeSkeletonChunk(chunk, response, parameters.vertexAttributes), + ); } } diff --git a/src/datasource/render/backend.ts b/src/datasource/render/backend.ts index ad53c010c4..97b5176cd4 100644 --- a/src/datasource/render/backend.ts +++ b/src/datasource/render/backend.ts @@ -23,13 +23,9 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postpr import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); @@ -37,13 +33,13 @@ chunkDecoders.set( "jpg", async ( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) => { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - cancellationToken, + abortSignal, [response], new Uint8Array(response), undefined, @@ -52,11 +48,11 @@ chunkDecoders.set( 3, true, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, abortSignal, decoded); }, ); -chunkDecoders.set("raw16", (chunk, cancellationToken, response) => { - return decodeRawChunk(chunk, cancellationToken, response, Endianness.BIG); +chunkDecoders.set("raw16", (chunk, abortSignal, response) => { + return decodeRawChunk(chunk, abortSignal, response, Endianness.BIG); }); @registerSharedObject() @@ -95,7 +91,7 @@ export class TileChunkSource extends WithParameters( return query_params.join("&"); })(); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { const { parameters } = this; const { chunkGridPosition } = chunk; @@ -124,12 +120,10 @@ export class TileChunkSource extends WithParameters( imageMethod = "jpeg-image"; } const path = `/render-ws/v1/owner/${parameters.owner}/project/${parameters.project}/stack/${parameters.stack}/z/${chunkPosition[2]}/box/${chunkPosition[0]},${chunkPosition[1]},${xTileSize},${yTileSize},${scale}/${imageMethod}`; - const response = await cancellableFetchOk( + const response = await fetchOk( `${parameters.baseUrl}${path}?${this.queryString}`, - {}, - responseArrayBuffer, - cancellationToken, + { signal: abortSignal }, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); } } diff --git a/src/datasource/state_share.ts b/src/datasource/state_share.ts index 9535ba2c66..376ad438cd 100644 --- a/src/datasource/state_share.ts +++ b/src/datasource/state_share.ts @@ -1,9 +1,8 @@ import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; import { StatusMessage } from "#src/status.js"; import { RefCounted } from "#src/util/disposable.js"; -import { responseJson } from "#src/util/http_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; import type { Viewer } from "#src/viewer.js"; @@ -85,16 +84,12 @@ export class StateShare extends RefCounted { ); StatusMessage.forPromise( - cancellableFetchSpecialOk( - credentialsProvider, - parsedUrl, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(viewer.state.toJSON()), - }, - responseJson, - ) + fetchSpecialOk(credentialsProvider, parsedUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(viewer.state.toJSON()), + }) + .then((response) => response.json()) .then((res) => { const stateUrlProtcol = new URL(res).protocol; const stateUrlWithoutProtocol = res.substring( diff --git a/src/datasource/vtk/backend.ts b/src/datasource/vtk/backend.ts index d58fd46af6..b2f1f3f586 100644 --- a/src/datasource/vtk/backend.ts +++ b/src/datasource/vtk/backend.ts @@ -19,17 +19,16 @@ import { parseVTKFromArrayBuffer } from "#src/async_computation/vtk_mesh_request import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; import type { SingleMesh } from "#src/single_mesh/backend.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; /** * This needs to be a global function, because it identifies the instance of GenericSharedDataSource * to use. */ -function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { +function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { return requestAsyncComputation( parseVTKFromArrayBuffer, - cancellationToken, + abortSignal, [buffer], buffer, ); @@ -37,20 +36,14 @@ function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { registerSingleMeshFactory("vtk", { description: "VTK", - getMesh: ( - chunkManager, - credentialsProvider, - url, - getPriority, - cancellationToken, - ) => + getMesh: (chunkManager, credentialsProvider, url, getPriority, abortSignal) => GenericSharedDataSource.getUrl( chunkManager, credentialsProvider, parse, url, getPriority, - cancellationToken, + abortSignal, ).then((mesh) => { const result: SingleMesh = { info: { diff --git a/src/datasource/vtk/frontend.ts b/src/datasource/vtk/frontend.ts index 086dbf54fb..ce59208e64 100644 --- a/src/datasource/vtk/frontend.ts +++ b/src/datasource/vtk/frontend.ts @@ -60,7 +60,7 @@ export class VtkDataSource extends DataSourceProvider { return completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/datasource/zarr/backend.ts b/src/datasource/zarr/backend.ts index 66e23bea90..bbcbdda792 100644 --- a/src/datasource/zarr/backend.ts +++ b/src/datasource/zarr/backend.ts @@ -34,7 +34,6 @@ import { getSpecialProtocolKvStore } from "#src/kvstore/special/index.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @@ -54,7 +53,7 @@ export class ZarrVolumeChunkSource extends WithParameters( ), ); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, abortSignal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const { parameters } = this; const { chunkGridPosition } = chunk; @@ -94,15 +93,15 @@ export class ZarrVolumeChunkSource extends WithParameters( const { chunkKvStore } = this; const response = await chunkKvStore.kvStore.read( chunkKvStore.getChunkKey(chunkGridPosition, baseKey), - { cancellationToken }, + { abortSignal }, ); if (response !== undefined) { const decoded = await decodeArray( chunkKvStore.decodeCodecs, response.data, - cancellationToken, + abortSignal, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, abortSignal, decoded); } } } diff --git a/src/datasource/zarr/codec/blosc/decode.ts b/src/datasource/zarr/codec/blosc/decode.ts index f7d125f1df..1f33d84bcf 100644 --- a/src/datasource/zarr/codec/blosc/decode.ts +++ b/src/datasource/zarr/codec/blosc/decode.ts @@ -19,7 +19,6 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import type { Configuration } from "#src/datasource/zarr/codec/blosc/resolve.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "blosc", @@ -27,12 +26,12 @@ registerCodec({ decode( configuration: Configuration, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { configuration; return requestAsyncComputation( decodeBlosc, - cancellationToken, + abortSignal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/codec/bytes/decode.ts b/src/datasource/zarr/codec/bytes/decode.ts index 53ae1eda0a..3a795a4320 100644 --- a/src/datasource/zarr/codec/bytes/decode.ts +++ b/src/datasource/zarr/codec/bytes/decode.ts @@ -18,7 +18,6 @@ import type { Configuration } from "#src/datasource/zarr/codec/bytes/resolve.js" import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; import { convertEndian } from "#src/util/endian.js"; @@ -29,9 +28,9 @@ registerCodec({ configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { - cancellationToken; + abortSignal; const { dataType, chunkShape } = decodedArrayInfo; const numElements = chunkShape.reduce((a, b) => a * b, 1); const bytesPerElement = DATA_TYPE_BYTES[dataType]; diff --git a/src/datasource/zarr/codec/crc32c/decode.ts b/src/datasource/zarr/codec/crc32c/decode.ts index 569b2b477c..ec6e6405d7 100644 --- a/src/datasource/zarr/codec/crc32c/decode.ts +++ b/src/datasource/zarr/codec/crc32c/decode.ts @@ -17,7 +17,6 @@ import type { Configuration } from "#src/datasource/zarr/codec/crc32c/resolve.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; const checksumSize = 4; @@ -27,10 +26,10 @@ registerCodec({ async decode( configuration: Configuration, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { configuration; - cancellationToken; + abortSignal; if (encoded.length < checksumSize) { throw new Error( `Expected buffer of size at least ${checksumSize} bytes but received: ${encoded.length} bytes`, diff --git a/src/datasource/zarr/codec/decode.ts b/src/datasource/zarr/codec/decode.ts index bd5c5f49a7..2db3a367ce 100644 --- a/src/datasource/zarr/codec/decode.ts +++ b/src/datasource/zarr/codec/decode.ts @@ -21,7 +21,6 @@ import type { } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { ReadableKvStore } from "#src/kvstore/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { RefCounted } from "#src/util/disposable.js"; export interface Codec { @@ -35,7 +34,7 @@ export interface ArrayToArrayCodec extends Codec { configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: ArrayBufferView, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } @@ -45,7 +44,7 @@ export interface ArrayToBytesCodec extends Codec { configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } @@ -68,7 +67,7 @@ export interface BytesToBytesCodec extends Codec { decode( configuration: Configuration, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } @@ -96,7 +95,7 @@ export function registerCodec( export async function decodeArray( codecs: CodecChainSpec, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const bytesToBytes = codecs[CodecKind.bytesToBytes]; for (let i = bytesToBytes.length; i--; ) { @@ -105,11 +104,7 @@ export async function decodeArray( if (impl === undefined) { throw new Error(`Unsupported codec: ${JSON.stringify(codec.name)}`); } - encoded = await impl.decode( - codec.configuration, - encoded, - cancellationToken, - ); + encoded = await impl.decode(codec.configuration, encoded, abortSignal); } let decoded: ArrayBufferView; @@ -123,7 +118,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[codecs.arrayInfo.length - 1], encoded, - cancellationToken, + abortSignal, ); } @@ -138,7 +133,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[i], decoded, - cancellationToken, + abortSignal, ); } diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 288688adb4..93ca0bc6fb 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -17,7 +17,6 @@ import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { Configuration } from "#src/datasource/zarr/codec/gzip/resolve.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { decodeGzip } from "#src/util/gzip.js"; for (const [name, compressionFormat] of [ @@ -30,11 +29,12 @@ for (const [name, compressionFormat] of [ async decode( configuration: Configuration, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { configuration; - cancellationToken; - return new Uint8Array(await decodeGzip(encoded, compressionFormat)); + return new Uint8Array( + await decodeGzip(encoded, compressionFormat, abortSignal), + ); }, }); } diff --git a/src/datasource/zarr/codec/sharding_indexed/decode.ts b/src/datasource/zarr/codec/sharding_indexed/decode.ts index 1c7a97ba0b..68ad0adf39 100644 --- a/src/datasource/zarr/codec/sharding_indexed/decode.ts +++ b/src/datasource/zarr/codec/sharding_indexed/decode.ts @@ -30,8 +30,6 @@ import type { ReadResponse, } from "#src/kvstore/index.js"; import { composeByteRangeRequest } from "#src/kvstore/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -53,7 +51,7 @@ class ShardedKvStore super(); this.indexCache = this.registerDisposer( new SimpleAsyncCache(chunkManager.addRef(), { - get: async (key: BaseKey, cancellationToken: CancellationToken) => { + get: async (key: BaseKey, abortSignal: AbortSignal) => { const { indexCodecs } = configuration; const encodedSize = indexCodecs.encodedSize[indexCodecs.encodedSize.length - 1]; @@ -67,7 +65,7 @@ class ShardedKvStore break; } const response = await base.read(key, { - cancellationToken, + abortSignal, byteRange, }); if (response === undefined) { @@ -76,7 +74,7 @@ class ShardedKvStore const index = await decodeArray( configuration.indexCodecs, response.data, - cancellationToken, + abortSignal, ); return { size: index.byteLength, @@ -111,10 +109,7 @@ class ShardedKvStore key: { base: BaseKey; subChunk: number[] }, options: ReadOptions, ): Promise { - const shardIndex = await this.indexCache.get( - key.base, - options.cancellationToken ?? uncancelableToken, - ); + const shardIndex = await this.indexCache.get(key.base, options.abortSignal); if (shardIndex === undefined) { // Shard not present. return undefined; @@ -147,7 +142,7 @@ class ShardedKvStore }; } const response = await this.base.read(key.base, { - cancellationToken: options.cancellationToken, + abortSignal: options.abortSignal, byteRange: outerByteRange, }); if (response === undefined) { diff --git a/src/datasource/zarr/codec/transpose/decode.ts b/src/datasource/zarr/codec/transpose/decode.ts index a08d4a36e8..287bc05cb1 100644 --- a/src/datasource/zarr/codec/transpose/decode.ts +++ b/src/datasource/zarr/codec/transpose/decode.ts @@ -18,7 +18,6 @@ import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { Configuration } from "#src/datasource/zarr/codec/transpose/resolve.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "transpose", @@ -27,10 +26,10 @@ registerCodec({ configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: ArrayBufferView, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { decodedArrayInfo; - cancellationToken; + abortSignal; configuration; return encoded; }, diff --git a/src/datasource/zarr/codec/zstd/decode.ts b/src/datasource/zarr/codec/zstd/decode.ts index f29aef6dbd..744a0ec196 100644 --- a/src/datasource/zarr/codec/zstd/decode.ts +++ b/src/datasource/zarr/codec/zstd/decode.ts @@ -19,7 +19,6 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { Configuration } from "#src/datasource/zarr/codec/zstd/resolve.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "zstd", @@ -27,12 +26,12 @@ registerCodec({ decode( configuration: Configuration, encoded: Uint8Array, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { configuration; return requestAsyncComputation( decodeZstd, - cancellationToken, + abortSignal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/frontend.ts b/src/datasource/zarr/frontend.ts index a56a4eeff7..8cb1ee27e3 100644 --- a/src/datasource/zarr/frontend.ts +++ b/src/datasource/zarr/frontend.ts @@ -71,7 +71,7 @@ import { } from "#src/util/completion.js"; import type { Borrowed } from "#src/util/disposable.js"; import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError, responseJson } from "#src/util/http_request.js"; +import { isNotFoundError } from "#src/util/http_request.js"; import { parseQueryStringParameters, verifyObject, @@ -84,7 +84,7 @@ import type { SpecialProtocolCredentialsProvider, } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; @@ -189,11 +189,8 @@ function getJsonResource( }, async () => { try { - return await cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseJson, + return await fetchSpecialOk(credentialsProvider, url, {}).then( + (response) => response.json(), ); } catch (e) { if (isNotFoundError(e)) return undefined; @@ -566,7 +563,7 @@ export class ZarrDataSource extends DataSourceProvider { return await completeHttpPath( options.credentialsManager, options.providerUrl, - options.cancellationToken, + options.abortSignal, ); } } diff --git a/src/kvstore/index.ts b/src/kvstore/index.ts index 68a3c663b5..fb72305114 100644 --- a/src/kvstore/index.ts +++ b/src/kvstore/index.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; - export interface ByteRange { offset: number; length: number; @@ -62,12 +60,12 @@ export interface ReadResponse { export interface ReadOptions { byteRange?: ByteRangeRequest; - cancellationToken?: CancellationToken; + abortSignal?: AbortSignal; } export interface ListOptions { prefix: string; - cancellationToken?: CancellationToken; + abortSignal?: AbortSignal; } export interface ListEntry { diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts index ac9ee232aa..f8f6e3a503 100644 --- a/src/kvstore/special/index.ts +++ b/src/kvstore/special/index.ts @@ -22,10 +22,9 @@ import type { ReadResponse, } from "#src/kvstore/index.js"; import { composeByteRangeRequest } from "#src/kvstore/index.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import { isNotFoundError } from "#src/util/http_request.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; function getRangeHeader( request: ByteRangeRequest | undefined, @@ -54,14 +53,10 @@ class SpecialProtocolKvStore implements ReadableKvStore { async getObjectLength(url: string, options: ReadOptions) { // Use a HEAD request to get the length of an object - const { cancellationToken = uncancelableToken } = options; - const headResponse = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - { method: "HEAD" }, - async (response) => response, - cancellationToken, - ); + const headResponse = await fetchSpecialOk(this.credentialsProvider, url, { + method: "HEAD", + signal: options.abortSignal, + }); if (headResponse.status !== 200) { throw new Error( @@ -82,7 +77,6 @@ class SpecialProtocolKvStore implements ReadableKvStore { key: string, options: ReadOptions, ): Promise { - const { cancellationToken = uncancelableToken } = options; let { byteRange: byteRangeRequest } = options; const url = this.baseUrl + key; @@ -109,22 +103,18 @@ class SpecialProtocolKvStore implements ReadableKvStore { byteRangeRequest, ).outer; } - const requestInit: RequestInit = {}; + const requestInit: RequestInit = { signal: options.abortSignal }; const rangeHeader = getRangeHeader(byteRangeRequest); if (rangeHeader !== undefined) { requestInit.headers = { range: rangeHeader }; requestInit.cache = byteRangeCacheMode; } - const { response, data } = await cancellableFetchSpecialOk( + const response = await fetchSpecialOk( this.credentialsProvider, url, requestInit, - async (response) => ({ - response, - data: await response.arrayBuffer(), - }), - cancellationToken, ); + const data = await response.arrayBuffer(); let byteRange: ByteRange | undefined; if (response.status === 206) { const contentRange = response.headers.get("content-range"); diff --git a/src/layer/layer_data_source.ts b/src/layer/layer_data_source.ts index 41cbacdd5d..ccc93bcd61 100644 --- a/src/layer/layer_data_source.ts +++ b/src/layer/layer_data_source.ts @@ -37,7 +37,6 @@ import { getWatchableRenderLayerTransform } from "#src/render_coordinate_transfo import type { RenderLayer } from "#src/renderlayer.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; import { arraysEqual } from "#src/util/array.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { disposableOnce, RefCounted } from "#src/util/disposable.js"; import { @@ -399,7 +398,7 @@ export class LayerDataSource extends RefCounted { this.spec_ = spec; const chunkManager = layer.manager.chunkManager; const registry = layer.manager.dataSourceProviderRegistry; - const cancellationToken = new CancellationTokenSource(); + const abortController = new AbortController(); this.messages.addMessage({ severity: MessageSeverity.info, message: "Loading data source", @@ -408,7 +407,7 @@ export class LayerDataSource extends RefCounted { .get({ chunkManager, url: spec.url, - cancellationToken, + abortSignal: abortController.signal, globalCoordinateSpace: layer.manager.root.coordinateSpace, transform: spec.transform, state: spec.state, @@ -451,7 +450,7 @@ export class LayerDataSource extends RefCounted { this.changed.dispatch(); }); refCounted.registerDisposer(() => { - cancellationToken.cancel(); + abortController.abort(); }); this.changed.dispatch(); } diff --git a/src/main.bundle.js b/src/main.bundle.js index 617f992b08..511bdfb00c 100644 --- a/src/main.bundle.js +++ b/src/main.bundle.js @@ -1,3 +1,4 @@ +import "#src/util/polyfills.js"; import "#src/layer/enabled_frontend_modules.js"; import "#src/datasource/enabled_frontend_modules.js"; import "#main"; diff --git a/src/mesh/backend.ts b/src/mesh/backend.ts index ca5f313915..ce44423e07 100644 --- a/src/mesh/backend.ts +++ b/src/mesh/backend.ts @@ -45,7 +45,6 @@ import { getObjectKey, forEachVisibleSegment, } from "#src/segmentation_display_state/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Endianness } from "#src/util/endian.js"; import { convertEndian32 } from "#src/util/endian.js"; import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; @@ -372,7 +371,7 @@ export interface MeshSource { // TypeScript supports mixins with abstract classes. downloadFragment( chunk: FragmentChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } @@ -424,8 +423,8 @@ export class MeshSource extends ChunkSource { @registerSharedObject(FRAGMENT_SOURCE_RPC_ID) export class FragmentSource extends ChunkSource { meshSource: MeshSource | null = null; - download(chunk: FragmentChunk, cancellationToken: CancellationToken) { - return this.meshSource!.downloadFragment(chunk, cancellationToken); + download(chunk: FragmentChunk, abortSignal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, abortSignal); } } @@ -570,7 +569,7 @@ export interface MultiscaleMeshSource { // TypeScript supports mixins with abstract classes. downloadFragment( chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise; } @@ -622,11 +621,8 @@ export class MultiscaleMeshSource extends ChunkSource { @registerSharedObject(MULTISCALE_FRAGMENT_SOURCE_RPC_ID) export class MultiscaleFragmentSource extends ChunkSource { meshSource: MultiscaleMeshSource | null = null; - download( - chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, - ) { - return this.meshSource!.downloadFragment(chunk, cancellationToken); + download(chunk: MultiscaleFragmentChunk, abortSignal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, abortSignal); } } diff --git a/src/python_integration/volume.ts b/src/python_integration/volume.ts index 8820099eda..a3a9f7fbd0 100644 --- a/src/python_integration/volume.ts +++ b/src/python_integration/volume.ts @@ -33,8 +33,6 @@ import type { VolumeChunkSource } from "#src/sliceview/volume/frontend.js"; import { SliceViewVolumeRenderLayer } from "#src/sliceview/volume/renderlayer.js"; import { TrackableValue } from "#src/trackable_value.js"; import { arraysEqual } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; import { RefCounted } from "#src/util/disposable.js"; import { valueOrThrow } from "#src/util/error.js"; @@ -374,7 +372,7 @@ export class VolumeRequestHandler extends RefCounted { (requestId: string, response: unknown) => void >(); - private alreadyHandledRequests = new Map(); + private alreadyHandledRequests = new Map(); private debouncedMaybeHandleRequests = this.registerCancellable( debounce(() => this.maybeHandleRequests(), 0), ); @@ -397,9 +395,9 @@ export class VolumeRequestHandler extends RefCounted { const { id } = request; seenRequests.add(id); if (alreadyHandledRequests.has(id)) continue; - const source = new CancellationTokenSource(); + const abortController = new AbortController(); try { - if (!this.maybeHandleRequest(request, source)) { + if (!this.maybeHandleRequest(request, abortController.signal)) { continue; } } catch (e) { @@ -409,12 +407,12 @@ export class VolumeRequestHandler extends RefCounted { }); } } - alreadyHandledRequests.set(id, source); + alreadyHandledRequests.set(id, abortController); } - for (const [requestId, cancellationSource] of alreadyHandledRequests) { + for (const [requestId, abortController] of alreadyHandledRequests) { if (!seenRequests.has(requestId)) { - cancellationSource.cancel(); + abortController.abort(); alreadyHandledRequests.delete(requestId); } } @@ -422,7 +420,7 @@ export class VolumeRequestHandler extends RefCounted { private maybeHandleRequest( request: VolumeRequest, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): boolean { const layer = this.viewer.layerManager.getLayerByName(request.layer); if (layer === undefined) { @@ -588,7 +586,7 @@ export class VolumeRequestHandler extends RefCounted { order: info.order, }; }, - cancellationToken, + abortSignal, ); } catch (e) { response = { error: e.message }; diff --git a/src/single_mesh/backend.ts b/src/single_mesh/backend.ts index 0ad2650529..ba1c8f0f62 100644 --- a/src/single_mesh/backend.ts +++ b/src/single_mesh/backend.ts @@ -39,7 +39,6 @@ import { SingleMeshSourceParametersWithInfo, } from "#src/single_mesh/base.js"; import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { stableStringify } from "#src/util/json.js"; import type { SpecialProtocolCredentials, @@ -117,7 +116,7 @@ interface SingleMeshFactory { credentialsProvider: SpecialProtocolCredentialsProvider, url: string, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise; } @@ -154,7 +153,7 @@ export function getMesh( credentialsProvider: SpecialProtocolCredentialsProvider, url: string, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { const [factory, path] = getDataSource(singleMeshFactories, url); return factory.getMesh( @@ -162,7 +161,7 @@ export function getMesh( credentialsProvider, path, getPriority, - cancellationToken, + abortSignal, ); } @@ -181,14 +180,14 @@ export function getCombinedMesh( credentialsProvider: SpecialProtocolCredentialsProvider, parameters: SingleMeshSourceParameters, getPriority: PriorityGetter, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { return getMesh( chunkManager, credentialsProvider, parameters.meshSourceUrl, getPriority, - cancellationToken, + abortSignal, ); } @@ -210,7 +209,7 @@ export class SingleMeshSource extends WithParameters( return chunk; } - download(chunk: SingleMeshChunk, cancellationToken: CancellationToken) { + download(chunk: SingleMeshChunk, abortSignal: AbortSignal) { const getPriority = () => ({ priorityTier: chunk.priorityTier, priority: chunk.priority, @@ -220,7 +219,7 @@ export class SingleMeshSource extends WithParameters( this.credentialsProvider, this.parameters, getPriority, - cancellationToken, + abortSignal, ).then((data) => { if ( stableStringify(data.info) !== stableStringify(this.parameters.info) @@ -278,7 +277,7 @@ const INFO_PRIORITY = 1000; registerPromiseRPC( GET_SINGLE_MESH_INFO_RPC_ID, - async function (x, cancellationToken): RPCPromise { + async function (x, abortSignal): RPCPromise { const chunkManager = this.getRef(x.chunkManager); const credentialsProvider = this.getOptionalRef< SharedCredentialsProviderCounterpart< @@ -295,7 +294,7 @@ registerPromiseRPC( priorityTier: ChunkPriorityTier.VISIBLE, priority: INFO_PRIORITY, }), - cancellationToken, + abortSignal, ); return { value: mesh.info }; } finally { diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index f95e2062b7..0002dc2f00 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -48,8 +48,7 @@ import { } from "#src/sliceview/base.js"; import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { erf } from "#src/util/erf.js"; import { vec3, vec3Key } from "#src/util/geom.js"; import { VelocityEstimator } from "#src/util/velocity_estimation.js"; @@ -536,7 +535,7 @@ registerPromiseRPC( SLICEVIEW_REQUEST_CHUNK_RPC_ID, async function ( x: { this: RPC; source: number; chunkGridPosition: Float32Array }, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): RPCPromise { const source = this.get(x.source) as SliceViewChunkSourceBackend; const { chunkManager } = source; @@ -568,13 +567,8 @@ registerPromiseRPC( }; }); source.registerChunkListener(key, listener!); - const cancelPromise = new Promise((_resolve, reject) => { - cancellationToken.add(() => { - reject(CANCELED); - }); - }); try { - await Promise.race([promise, cancelPromise]); + await raceWithAbort(promise, abortSignal); return { value: undefined }; } finally { source.unregisterChunkListener(key, listener!); diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index 76075224a7..105dea4e34 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -25,14 +25,13 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { vec3Key } from "#src/util/geom.js"; import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeBossNpzChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const parseResult = parseNpy( @@ -62,5 +61,5 @@ export async function decodeBossNpzChunk( } does not match expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, cancellationToken, parseResult.data); + await postProcessRawData(chunk, abortSignal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts index e9e387456e..534bb78c86 100644 --- a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts +++ b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts @@ -15,13 +15,12 @@ */ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressedSegmentationChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { - cancellationToken; + abortSignal; chunk.data = new Uint32Array(response); } diff --git a/src/sliceview/backend_chunk_decoders/compresso.ts b/src/sliceview/backend_chunk_decoders/compresso.ts index b35548a3a6..511746b5ed 100644 --- a/src/sliceview/backend_chunk_decoders/compresso.ts +++ b/src/sliceview/backend_chunk_decoders/compresso.ts @@ -19,19 +19,18 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressoChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const image: TypedArray = await requestAsyncComputation( decodeCompresso, - cancellationToken, + abortSignal, [response], new Uint8Array(response), ); - await decodeRawChunk(chunk, cancellationToken, image.buffer); + await decodeRawChunk(chunk, abortSignal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/index.ts b/src/sliceview/backend_chunk_decoders/index.ts index 04e3d8dd31..169af5c267 100644 --- a/src/sliceview/backend_chunk_decoders/index.ts +++ b/src/sliceview/backend_chunk_decoders/index.ts @@ -20,9 +20,8 @@ */ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export type ChunkDecoder = ( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) => Promise; diff --git a/src/sliceview/backend_chunk_decoders/jpeg.ts b/src/sliceview/backend_chunk_decoders/jpeg.ts index 854b84f667..34bdc8138f 100644 --- a/src/sliceview/backend_chunk_decoders/jpeg.ts +++ b/src/sliceview/backend_chunk_decoders/jpeg.ts @@ -18,17 +18,16 @@ import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeJpegChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - cancellationToken, + abortSignal, [response], new Uint8Array(response), undefined, @@ -37,5 +36,5 @@ export async function decodeJpegChunk( chunkDataSize[3] || 1, false, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, abortSignal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/jxl.ts b/src/sliceview/backend_chunk_decoders/jxl.ts index 914367a715..38e529d508 100644 --- a/src/sliceview/backend_chunk_decoders/jxl.ts +++ b/src/sliceview/backend_chunk_decoders/jxl.ts @@ -18,22 +18,21 @@ import { decodeJxl } from "#src/async_computation/decode_jxl_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeJxlChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJxl, - cancellationToken, + abortSignal, [response], new Uint8Array(response), chunkDataSize[0] * chunkDataSize[1] * chunkDataSize[2], chunkDataSize[3] || 1, 1, // bytesPerPixel ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, abortSignal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index 5bf2f83a36..44d554d83c 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -26,13 +26,12 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postpr import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { arraysEqual } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeNdstoreNpzChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const parseResult = parseNpy( @@ -56,5 +55,5 @@ export async function decodeNdstoreNpzChunk( `expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, cancellationToken, parseResult.data); + await postProcessRawData(chunk, abortSignal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/png.ts b/src/sliceview/backend_chunk_decoders/png.ts index f5d34b5e50..7f6404e161 100644 --- a/src/sliceview/backend_chunk_decoders/png.ts +++ b/src/sliceview/backend_chunk_decoders/png.ts @@ -18,19 +18,18 @@ import { decodePng } from "#src/async_computation/decode_png_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; export async function decodePngChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const dataType = chunk.source!.spec.dataType; const { uint8Array: image } = await requestAsyncComputation( decodePng, - cancellationToken, + abortSignal, [response], /*buffer=*/ new Uint8Array(response), /*width=*/ undefined, @@ -41,5 +40,5 @@ export async function decodePngChunk( /*convertToGrayscale=*/ false, ); - await decodeRawChunk(chunk, cancellationToken, image.buffer); + await decodeRawChunk(chunk, abortSignal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/postprocess.ts b/src/sliceview/backend_chunk_decoders/postprocess.ts index 69efafaca2..de445db5d1 100644 --- a/src/sliceview/backend_chunk_decoders/postprocess.ts +++ b/src/sliceview/backend_chunk_decoders/postprocess.ts @@ -25,14 +25,12 @@ import { import { requestAsyncComputation } from "#src/async_computation/request.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function postProcessRawData( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, data: ArrayBufferView, ) { - cancellationToken; const { spec } = chunk.source!; if (spec.compressedSegmentationBlockSize !== undefined) { const { dataType } = spec; @@ -47,7 +45,7 @@ export async function postProcessRawData( case DataType.UINT32: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint32, - cancellationToken, + abortSignal, [data.buffer], data as Uint32Array, shape, @@ -57,7 +55,7 @@ export async function postProcessRawData( case DataType.UINT64: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint64, - cancellationToken, + abortSignal, [data.buffer], data as Uint32Array, shape, diff --git a/src/sliceview/backend_chunk_decoders/raw.ts b/src/sliceview/backend_chunk_decoders/raw.ts index 96426f6b98..b7bc763f24 100644 --- a/src/sliceview/backend_chunk_decoders/raw.ts +++ b/src/sliceview/backend_chunk_decoders/raw.ts @@ -16,7 +16,6 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; import type { Endianness } from "#src/util/endian.js"; import { convertEndian, ENDIANNESS } from "#src/util/endian.js"; @@ -24,13 +23,13 @@ import * as vector from "#src/util/vector.js"; export async function decodeRawChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, response: ArrayBuffer, endianness: Endianness = ENDIANNESS, byteOffset = 0, byteLength: number = response.byteLength, ) { - cancellationToken; + abortSignal; const { spec } = chunk.source!; const { dataType } = spec; const numElements = vector.prod(chunk.chunkDataSize!); @@ -49,5 +48,5 @@ export async function decodeRawChunk( byteLength, ); convertEndian(data, endianness, bytesPerElement); - await postProcessRawData(chunk, cancellationToken, data); + await postProcessRawData(chunk, abortSignal, data); } diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index dd20d2a6b7..ce18e9efd3 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -62,8 +62,6 @@ import { import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; import { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import type { Borrowed, Disposer, Owned } from "#src/util/disposable.js"; import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; import type { vec4 } from "#src/util/geom.js"; @@ -646,7 +644,7 @@ export abstract class SliceViewChunkSource< async fetchChunk( chunkGridPosition: Float32Array, transform: (chunk: Chunk) => T, - cancellationToken: CancellationToken = uncancelableToken, + abortSignal?: AbortSignal, ): Promise { const key = chunkGridPosition.join(); const existingChunk = this.chunks.get(key); @@ -675,7 +673,7 @@ export abstract class SliceViewChunkSource< await this.rpc!.promiseInvoke( SLICEVIEW_REQUEST_CHUNK_RPC_ID, { source: this.rpcId, chunkGridPosition }, - cancellationToken, + abortSignal, ); return await promise; } finally { diff --git a/src/status.ts b/src/status.ts index 519df57449..860165b915 100644 --- a/src/status.ts +++ b/src/status.ts @@ -83,6 +83,11 @@ export class StatusMessage { statusContainer.appendChild(element); } } + + [Symbol.dispose]() { + this.dispose(); + } + dispose() { if (this.modalElementWrapper) { modalStatusContainer!.removeChild(this.modalElementWrapper); diff --git a/src/ui/layer_data_sources_tab.ts b/src/ui/layer_data_sources_tab.ts index 5174f9209b..154f4299fe 100644 --- a/src/ui/layer_data_sources_tab.ts +++ b/src/ui/layer_data_sources_tab.ts @@ -40,7 +40,6 @@ import type { WatchableValueInterface } from "#src/trackable_value.js"; import { WatchableValue } from "#src/trackable_value.js"; import type { DebouncedFunction } from "#src/util/animation_frame_debounce.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; import type { Borrowed } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -64,15 +63,12 @@ class SourceUrlAutocomplete extends AutocompleteTextInput { dirty: WatchableValueInterface; constructor(dataSourceView: DataSourceView) { const { manager } = dataSourceView.source.layer; - const sourceCompleter = ( - value: string, - cancellationToken: CancellationToken, - ) => + const sourceCompleter = (value: string, abortSignal: AbortSignal) => manager.dataSourceProviderRegistry .completeUrl({ url: value, chunkManager: manager.chunkManager, - cancellationToken, + abortSignal, }) .then((originalResult) => ({ completions: originalResult.completions, diff --git a/src/ui/url_hash_binding.ts b/src/ui/url_hash_binding.ts index 5c338cb5e7..cca2bdc77d 100644 --- a/src/ui/url_hash_binding.ts +++ b/src/ui/url_hash_binding.ts @@ -19,10 +19,9 @@ import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { StatusMessage } from "#src/status.js"; import { WatchableValue } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; -import { responseJson } from "#src/util/http_request.js"; import { urlSafeParse, verifyObject } from "#src/util/json.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; @@ -127,16 +126,13 @@ export class UrlHashBinding extends RefCounted { this.credentialsManager, ); StatusMessage.forPromise( - cancellableFetchSpecialOk( - credentialsProvider, - parsedUrl, - {}, - responseJson, - ).then((json) => { - verifyObject(json); - this.root.reset(); - this.root.restoreState(json); - }), + fetchSpecialOk(credentialsProvider, parsedUrl, {}) + .then((response) => response.json()) + .then((json) => { + verifyObject(json); + this.root.reset(); + this.root.restoreState(json); + }), { initialMessage: `Loading state from ${url}`, errorPrefix: "Error loading state:", diff --git a/src/util/abort.spec.ts b/src/util/abort.spec.ts new file mode 100644 index 0000000000..06ca844922 --- /dev/null +++ b/src/util/abort.spec.ts @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, test } from "vitest"; +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; + +describe("SharedAbortController", () => { + test("supports abort from two consumers", async () => { + const sharedController = new SharedAbortController(); + const controller1 = new AbortController(); + sharedController.addConsumer(controller1.signal); + const controller2 = new AbortController(); + sharedController.addConsumer(controller2.signal); + controller1.abort(); + expect(sharedController.signal.aborted).toBe(false); + expect(sharedController.signal.aborted).toBe(false); + controller2.abort(); + expect(sharedController.signal.aborted).toBe(true); + }); + + test("supports undefined AbortSignal", async () => { + const sharedController = new SharedAbortController(); + const controller1 = new AbortController(); + sharedController.addConsumer(controller1.signal); + sharedController.addConsumer(undefined); + controller1.abort(); + await Promise.resolve(); + expect(sharedController.signal.aborted).toBe(false); + }); + + test("supports dispose", async () => { + const controller1 = new AbortController(); + let called = false; + { + using sharedController = new SharedAbortController(); + sharedController.addConsumer(controller1.signal); + sharedController.signal.addEventListener("abort", () => { + called = true; + }); + } + expect(called).toBe(false); + controller1.abort(); + expect(called).toBe(false); + }); +}); + +describe("raceWithAbort", () => { + test("undefined signal", () => { + const promise = Promise.resolve(5); + expect(raceWithAbort(promise, undefined)).toBe(promise); + }); + + test("already aborted signal", async () => { + const controller = new AbortController(); + controller.abort(); + const promise = new Promise((_resolve, _reject) => {}); + await expect(() => + raceWithAbort(promise, controller.signal), + ).rejects.toThrowError(/aborted/); + }); + + test("not abort signal", async () => { + const controller = new AbortController(); + controller.abort(); + const promise = new Promise((_resolve, _reject) => {}); + await expect(() => + raceWithAbort(promise, controller.signal), + ).rejects.toThrowError(/aborted/); + }); + + test("aborted later signal", async () => { + const controller = new AbortController(); + const promise = new Promise((_resolve, _reject) => {}); + const wrappedPromise = raceWithAbort(promise, controller.signal); + controller.abort(); + await expect(() => wrappedPromise).rejects.toThrowError(/aborted/); + }); +}); diff --git a/src/util/abort.ts b/src/util/abort.ts new file mode 100644 index 0000000000..7b45a2a0e0 --- /dev/null +++ b/src/util/abort.ts @@ -0,0 +1,137 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function scopedAbortCallback( + signal: AbortSignal | undefined, + callback: (reason: any) => void, +): Disposable | undefined { + if (signal === undefined) return undefined; + if (signal.aborted) { + callback(signal.reason); + return undefined; + } + function wrappedCallback(this: AbortSignal) { + callback(this.reason); + } + signal.addEventListener("abort", wrappedCallback, { once: true }); + return { + [Symbol.dispose]() { + signal.removeEventListener("abort", wrappedCallback); + }, + }; +} + +// Abort controller that aborts when *all* consumers have aborted. +export class SharedAbortController { + private consumers = new Map<(this: AbortSignal) => void, AbortSignal>(); + private controller = new AbortController(); + private retainCount = 0; + + get signal(): AbortSignal { + return this.controller.signal; + } + + addConsumer(abortSignal: AbortSignal | undefined): void { + if (this.controller.signal.aborted) return undefined; + if (abortSignal !== undefined) { + if (abortSignal.aborted) return; + const self = this; + function wrappedCallback(this: AbortSignal) { + self.consumers.delete(wrappedCallback); + if (--self.retainCount === 0) { + self.controller.abort(); + self[Symbol.dispose](); + } + } + abortSignal.addEventListener("abort", wrappedCallback, { once: true }); + } + ++this.retainCount; + } + + [Symbol.dispose](): void { + for (const [wrappedCallback, abortSignal] of this.consumers) { + abortSignal.removeEventListener("abort", wrappedCallback); + } + this.consumers.clear(); + this.retainCount = 0; + } + + // Marks this controller as started. Aborts if there are no consumers. + start(): void { + if (this.retainCount === 0) { + this.controller.abort(); + } + } +} + +export function promiseWithResolversAndAbortCallback( + abortSignal: AbortSignal, + abortCallback: (reason: any) => void, +): { + promise: Promise; + resolve: (value: T) => void; + reject: (reason: any) => void; +} { + const { promise, resolve, reject } = Promise.withResolvers(); + const cleanup = scopedAbortCallback(abortSignal, abortCallback); + return { + promise, + resolve: (value: T) => { + cleanup?.[Symbol.dispose](); + resolve(value); + }, + reject: (reason: any) => { + cleanup?.[Symbol.dispose](); + reject(reason); + }, + }; +} + +export function raceWithAbort( + promise: Promise, + abortSignal: AbortSignal | undefined, +): Promise { + if (abortSignal === undefined) return promise; + if (abortSignal.aborted) return Promise.reject(abortSignal.reason); + + return new Promise((resolve, reject) => { + const cleanup = scopedAbortCallback(abortSignal, (reason) => { + reject(reason); + }); + promise.then( + (value) => { + cleanup?.[Symbol.dispose](); + resolve(value); + }, + (reason) => { + cleanup?.[Symbol.dispose](); + reject(reason); + }, + ); + }); +} + +export function abortPromise(abortSignal: AbortSignal) { + return new Promise((_resolve, reject) => { + abortSignal.addEventListener( + "abort", + () => { + reject(abortSignal.reason); + }, + { once: true }, + ); + }); +} diff --git a/src/util/byte_range_http_requests.ts b/src/util/byte_range_http_requests.ts index 440d9d0efc..4e4f505d39 100644 --- a/src/util/byte_range_http_requests.ts +++ b/src/util/byte_range_http_requests.ts @@ -14,13 +14,9 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - getByteRangeHeader, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { getByteRangeHeader } from "#src/util/http_request.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import type { Uint64 } from "#src/util/uint64.js"; /** @@ -37,16 +33,11 @@ export function fetchSpecialHttpByteRange( url: string, startOffset: Uint64 | number, endOffset: Uint64 | number, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { - return cancellableFetchSpecialOk( - credentialsProvider, - url, - { - headers: getByteRangeHeader(startOffset, endOffset), - cache: cacheMode, - }, - responseArrayBuffer, - cancellationToken, - ); + return fetchSpecialOk(credentialsProvider, url, { + headers: getByteRangeHeader(startOffset, endOffset), + cache: cacheMode, + signal: abortSignal, + }).then((response) => response.arrayBuffer()); } diff --git a/src/util/cancellation.spec.ts b/src/util/cancellation.spec.ts deleted file mode 100644 index f1f9cfad50..0000000000 --- a/src/util/cancellation.spec.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { describe, expect, it } from "vitest"; - -import { - CANCELED, - CancellationTokenSource, - makeCancelablePromise, - MultipleConsumerCancellationTokenSource, - throwIfCanceled, - uncancelableToken, -} from "#src/util/cancellation.js"; - -describe("cancellation", () => { - describe("CancellationTokenSource", () => { - it("supports cancel", () => { - const source = new CancellationTokenSource(); - expect(source.isCanceled).toBe(false); - source.cancel(); - expect(source.isCanceled).toBe(true); - source.cancel(); - expect(source.isCanceled).toBe(true); - }); - - it("supports add", () => { - const source = new CancellationTokenSource(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - source.cancel(); - expect(log).toEqual([1]); - source.cancel(); - expect(log).toEqual([1]); - }); - - it("supports add after cancel", () => { - const source = new CancellationTokenSource(); - source.cancel(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - expect(log).toEqual([1]); - }); - - it("supports remove", () => { - const source = new CancellationTokenSource(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - source.remove(handler); - source.cancel(); - expect(log).toEqual([]); - }); - - it("supports throwIfCanceled", () => { - const source = new CancellationTokenSource(); - expect(() => throwIfCanceled(source)).not.toThrow(); - source.cancel(); - expect(() => throwIfCanceled(source)).toThrow(CANCELED); - }); - }); - - describe("uncancelableToken", () => { - it("supports isCanceled", () => { - expect(uncancelableToken.isCanceled).toBe(false); - }); - - it("supports add", () => { - uncancelableToken.add(() => {}); - }); - - it("supports remove", () => { - const handler = () => {}; - uncancelableToken.add(handler); - uncancelableToken.remove(handler); - }); - }); - - describe("MultipleConsumerCancellationTokenSource", () => { - it("supports cancellation from two consumers", () => { - const multiToken = new MultipleConsumerCancellationTokenSource(); - const token1 = new CancellationTokenSource(); - multiToken.addConsumer(token1); - const token2 = new CancellationTokenSource(); - multiToken.addConsumer(token2); - token1.cancel(); - expect(multiToken.isCanceled).toBe(false); - token2.cancel(); - expect(multiToken.isCanceled).toBe(true); - }); - - it("supports cancellation from three consumers", () => { - const multiToken = new MultipleConsumerCancellationTokenSource(); - const token1 = new CancellationTokenSource(); - multiToken.addConsumer(token1); - const token2 = new CancellationTokenSource(); - multiToken.addConsumer(token2); - token1.cancel(); - expect(multiToken.isCanceled).toBe(false); - const token3 = new CancellationTokenSource(); - multiToken.addConsumer(token3); - token2.cancel(); - expect(multiToken.isCanceled).toBe(false); - token3.cancel(); - expect(multiToken.isCanceled).toBe(true); - }); - }); - - describe("makeCancellablePromise", () => { - it("supports basic resolve behavior", async () => { - const promise = makeCancelablePromise( - uncancelableToken, - (resolve, _reject, _token) => { - resolve(3); - }, - ); - expect(await promise).toBe(3); - }); - it("supports basic reject behavior", async () => { - const promise = makeCancelablePromise( - uncancelableToken, - (_resolve, reject, _token) => { - reject(new Error("abc")); - }, - ); - expect(promise).rejects.toThrow("abc"); - }); - - it("unregisters the cancellation handler when the promise is fulfilled", () => { - const source = new CancellationTokenSource(); - const log: string[] = []; - makeCancelablePromise(source, (resolve, _reject, token) => { - token.add(() => { - log.push("cancel called"); - }); - resolve(1); - source.cancel(); - expect(log).toEqual([]); - }); - }); - - it("unregisters the cancellation handler when the promise is rejected", () => { - const source = new CancellationTokenSource(); - const log: string[] = []; - makeCancelablePromise(source, (_resolve, reject, token) => { - token.add(() => { - log.push("cancel called"); - }); - reject(1); - source.cancel(); - expect(log).toEqual([]); - }).catch(() => null); - }); - }); -}); diff --git a/src/util/cancellation.ts b/src/util/cancellation.ts deleted file mode 100644 index e4e031b660..0000000000 --- a/src/util/cancellation.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file - * Cancellation token system with similarity to the cancellation_token in Microsoft's PPL. - */ - -/** - * Interface used by cancelable operations to monitor whether cancellation has occurred. - * - * Note that this interface does not provide any way to trigger cancellation; for that, - * CancellationTokenSource is used. - */ -export interface CancellationToken { - /** - * Indicates whether cancellation has occurred. - */ - readonly isCanceled: boolean; - - /** - * Add a cancellation handler function. The handler will be invoked synchronously if - * this.isCanceled === true. Otherwise, it will be invoked synchronously upon cancellation, - * unless it is removed prior to cancellation. - * - * The handler function must not throw any exceptions when called. - * - * @precondition The handler function must not already be registered. - * - * @param handler The handler function to add. - * - * @return A function that unregisters the handler. - */ - add(handler: () => void): () => void; - - /** - * Unregister a cancellation handler function. If this.isCanceled, or the specified handler - * function has not been registered, then this function has no effect. - */ - remove(handler: () => void): void; -} - -export class CancellationError extends Error { - name = "CancellationError"; - message = "CANCELED"; - toString() { - return "CANCELED"; - } -} - -/** - * Singleton instance of CancellationError thrown to indicate cancellation. - */ -export const CANCELED = new CancellationError(); - -/** - * Throws CANCELED if token.isCanceled === true. - */ -export function throwIfCanceled(token: CancellationToken) { - if (token.isCanceled === true) { - throw CANCELED; - } -} - -const noopFunction = () => {}; - -/** - * CancellationToken that cannot be canceled. This can be passed to operations that require a - * CancellationToken but will not need to be canceled. - */ -export const uncancelableToken: CancellationToken = { - isCanceled: false, - add: () => noopFunction, - remove: noopFunction, -}; - -/** - * Class that can be used to trigger cancellation. - */ -export class CancellationTokenSource implements CancellationToken { - /** - * Trigger cancellation. - * - * If this.isCanceled === false, then each registered cancellation handler is invoked - * synchronously. - */ - cancel() { - const { handlers } = this; - if (handlers !== null) { - this.handlers = null; - if (handlers !== undefined) { - for (const handler of handlers) { - handler(); - } - } - } - } - - get isCanceled() { - return this.handlers === null; - } - - private handlers: Set<() => void> | undefined | null; - - add(handler: () => void) { - let { handlers } = this; - if (handlers === null) { - handler(); - return noopFunction; - } - if (handlers === undefined) { - handlers = this.handlers = new Set<() => void>(); - } - handlers.add(handler); - return () => { - this.remove(handler); - }; - } - - remove(handler: () => void) { - const { handlers } = this; - if (handlers != null) { - handlers.delete(handler); - } - } -} - -/** - * Creates a CancellationToken corresponding to an asynchronous process with multiple consumers. It - * is cancelled only when the cancellation tokens corresponding to all of the consumers have been - * cancelled. - */ -export class MultipleConsumerCancellationTokenSource extends CancellationTokenSource { - private consumers = new Set(); - - addConsumer(cancellationToken: CancellationToken = uncancelableToken) { - const { consumers } = this; - if (consumers.has(cancellationToken) || cancellationToken.isCanceled) { - return; - } - consumers.add(cancellationToken); - cancellationToken.add(() => { - consumers.delete(cancellationToken); - if (consumers.size === 0) { - this.cancel(); - } - }); - } -} - -/** - * Creates a promise and a dependent cancellation token. - * - * The dependent cancellation token will be canceled if the specified `cancellationToken` is - * canceled while the promise is pending. - * - * @param cancellationToken The token that provides notification of cancellation. - * @param executor The executor passed the resolve and reject functions for the promise, as well as - * the dependent cancellation token. If cancellation occurs after either resolve or reject is - * called, then the dependent token is not cancelled. - * - * @returns A new Promise. - */ -export function makeCancelablePromise( - cancellationToken: CancellationToken, - executor: ( - resolve: (value: T | Promise) => void, - reject: (error: any) => void, - token: CancellationToken, - ) => void, -) { - return new Promise((resolve, reject) => { - if (cancellationToken === uncancelableToken) { - executor(resolve, reject, uncancelableToken); - return; - } - const scopedToken = new CancellationTokenSource(); - const unregister = cancellationToken.add(() => { - scopedToken.cancel(); - }); - executor( - (value) => { - unregister(); - resolve(value); - }, - (error) => { - unregister(); - reject(error); - }, - scopedToken, - ); - }); -} diff --git a/src/util/disposable.ts b/src/util/disposable.ts index dbcb95eea8..2ccedb327a 100644 --- a/src/util/disposable.ts +++ b/src/util/disposable.ts @@ -64,6 +64,9 @@ export class RefCounted implements Disposable { } this.refCountReachedZero(); } + [Symbol.dispose]() { + this.dispose(); + } protected refCountReachedZero() { this.disposed(); diff --git a/src/util/gcs_bucket_listing.ts b/src/util/gcs_bucket_listing.ts index 54de284571..ec77de5910 100644 --- a/src/util/gcs_bucket_listing.ts +++ b/src/util/gcs_bucket_listing.ts @@ -15,9 +15,7 @@ */ import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { BasicCompletionResult } from "#src/util/completion.js"; -import { responseJson } from "#src/util/http_request.js"; import { parseArray, verifyObject, @@ -33,7 +31,7 @@ export async function getGcsBucketListing( bucket: string, prefix: string, delimiter: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { // Include origin as `neuroglancerOrigin` query string parameter. See comment in // `special_protocol_request.ts` for details. @@ -44,10 +42,8 @@ export async function getGcsBucketListing( prefix, )}&` + `neuroglancerOrigin=${encodeURIComponent(location.origin)}`, - {}, - responseJson, - cancellationToken, - ); + { signal: abortSignal }, + ).then((response) => response.json()); verifyObject(response); const prefixes = verifyOptionalObjectProperty( response, @@ -73,7 +69,7 @@ export async function getGcsPathCompletions( enteredBucketUrl: string, bucket: string, path: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const prefix = path; if (!prefix.startsWith("/")) throw null; @@ -82,7 +78,7 @@ export async function getGcsPathCompletions( bucket, path.substring(1), "/", - cancellationToken, + abortSignal, ); const offset = path.lastIndexOf("/"); return { diff --git a/src/util/google_oauth2.ts b/src/util/google_oauth2.ts index 8aee6576d8..baa8a312a9 100644 --- a/src/util/google_oauth2.ts +++ b/src/util/google_oauth2.ts @@ -18,14 +18,11 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; -import { StatusMessage } from "#src/status.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { RefCounted } from "#src/util/disposable.js"; + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { removeFromParent } from "#src/util/dom.js"; import { verifyObject, @@ -63,62 +60,57 @@ function extractEmailFromIdToken(idToken: string): string { } } -async function waitForAuthResponseMessage( +// Note: `abortSignal` is guaranteed to be aborted once the operation completes. +function waitForAuthResponseMessage( source: Window, state: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { - const context = new RefCounted(); - try { - return await new Promise((resolve, reject) => { - context.registerDisposer(cancellationToken.add(() => reject(CANCELED))); - context.registerEventListener( - window, - "message", - (event: MessageEvent) => { - if (event.origin !== location.origin) { - return; - } + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.origin !== location.origin) { + return; + } - if (event.source !== source) return; + if (event.source !== source) return; - try { - const obj = verifyObject(event.data); - const receivedState = verifyObjectProperty( + try { + const obj = verifyObject(event.data); + const receivedState = verifyObjectProperty( + obj, + "state", + verifyString, + ); + if (receivedState !== state) { + throw new Error("invalid state"); + } + const idToken = verifyObjectProperty(obj, "id_token", verifyString); + const token: OAuth2Token = { + accessToken: verifyObjectProperty( obj, - "state", + "access_token", verifyString, - ); - if (receivedState !== state) { - throw new Error("invalid state"); - } - const idToken = verifyObjectProperty(obj, "id_token", verifyString); - const token: OAuth2Token = { - accessToken: verifyObjectProperty( - obj, - "access_token", - verifyString, - ), - tokenType: verifyObjectProperty(obj, "token_type", verifyString), - expiresIn: verifyObjectProperty(obj, "expires_in", verifyString), - scope: verifyObjectProperty(obj, "scope", verifyString), - email: extractEmailFromIdToken(idToken), - }; - resolve(token); - } catch (parseError) { - reject( - new Error( - `Received unexpected authentication response: ${parseError.message}`, - ), - ); - console.error("Response received: ", event.data); - } - }, - ); - }); - } finally { - context.dispose(); - } + ), + tokenType: verifyObjectProperty(obj, "token_type", verifyString), + expiresIn: verifyObjectProperty(obj, "expires_in", verifyString), + scope: verifyObjectProperty(obj, "scope", verifyString), + email: extractEmailFromIdToken(idToken), + }; + resolve(token); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); + } + }, + { signal: abortSignal }, + ); + }); } function makeAuthRequestUrl(options: { @@ -129,6 +121,7 @@ function makeAuthRequestUrl(options: { state?: string; loginHint?: string; authUser?: number; + includeGrantedScopes?: boolean; immediate?: boolean; }) { let url = `${AUTH_SERVER}?client_id=${encodeURIComponent(options.clientId)}`; @@ -141,7 +134,9 @@ function makeAuthRequestUrl(options: { responseType = "token%20id_token"; } url += `&response_type=${responseType}`; - url += "&include_granted_scopes=true"; + if (options.includeGrantedScopes === true) { + url += "&include_granted_scopes=true"; + } url += `&scope=${encodeURIComponent(scopes.join(" "))}`; if (options.state) { url += `&state=${options.state}`; @@ -161,6 +156,30 @@ function makeAuthRequestUrl(options: { return url; } +function createAuthIframe( + url: string, + abortController: AbortController, +): Window { + const iframe = document.createElement("iframe"); + iframe.src = url; + iframe.style.display = "none"; + iframe.addEventListener( + "load", + () => { + if (iframe.contentDocument == null) { + // Error received + abortController.abort(new Error("Immediate authentication failed")); + } + }, + { signal: abortController.signal }, + ); + document.body.appendChild(iframe); + abortController.signal.addEventListener("abort", () => { + removeFromParent(iframe); + }); + return iframe.contentWindow!; +} + /** * Obtain a Google OAuth2 authentication token. * @return A Promise that resolves to an authentication token. @@ -174,7 +193,7 @@ export async function authenticateGoogleOAuth2( immediate?: boolean; authUser?: number; }, - cancellationToken = uncancelableToken, + abortSignal: AbortSignal, ) { const state = getRandomHexString(); const nonce = getRandomHexString(); @@ -188,52 +207,26 @@ export async function authenticateGoogleOAuth2( immediate: options.immediate, authUser: options.authUser, }); - let source: Window; - let cleanup: (() => void) | undefined; - const extraPromises: Array> = []; - if (options.immediate) { - // For immediate mode auth, we can wait until the relay is ready, since we aren't opening a new - // window. - const iframe = document.createElement("iframe"); - iframe.src = url; - iframe.style.display = "none"; - extraPromises.push( - new Promise((_resolve, reject) => { - iframe.addEventListener("load", () => { - console.log("iframe loaded", iframe.contentDocument); - if (iframe.contentDocument == null) { - // Error received - reject(new Error("Immediate authentication failed")); - } - }); - }), - ); - document.body.appendChild(iframe); - source = iframe.contentWindow!; - cleanup = () => { - removeFromParent(iframe); - }; - } else { - const newWindow = open(url); - source = newWindow!; - if (newWindow !== null) { - cleanup = () => { - try { - newWindow.close(); - } catch { - // Ignore error closing window. - } - }; - } - } - + const abortController = new AbortController(); + abortSignal = AbortSignal.any([abortController.signal, abortSignal]); try { - return await Promise.race([ - ...extraPromises, - waitForAuthResponseMessage(source, state, cancellationToken), - ]); + let source: Window; + if (options.immediate) { + source = createAuthIframe(url, abortController); + } else { + const newWindow = open(url); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + source = newWindow!; + } + return await raceWithAbort( + waitForAuthResponseMessage(source, state, abortController.signal), + abortSignal, + ); } finally { - cleanup?.(); + abortController.abort(); } } @@ -244,76 +237,23 @@ export class GoogleOAuth2CredentialsProvider extends CredentialsProvider { - const { options } = this; - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeLoginStatus( - msg = `${options.description} authorization required.`, - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - login(/*immediate=*/ false); - }); - status.setVisible(true); - } - function login(immediate: boolean) { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeLoginStatus( - `Waiting for ${options.description} authorization...`, - "Retry", - ); - authenticateGoogleOAuth2( - { - clientId: options.clientId, - scopes: options.scopes, - immediate: immediate, - authUser: 0, - }, - cancellationSource, - ).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - if (immediate) { - writeLoginStatus(); - } else { - writeLoginStatus( - `${options.description} authorization failed: ${reason}.`, - "Retry", - ); - } - } - }, - ); - } - login(/*immediate=*/ true); - }); - }); + get = makeCredentialsGetter((abortSignal) => + getCredentialsWithStatus( + { + description: this.options.description, + supportsImmediate: true, + get: (abortSignal, immediate) => + authenticateGoogleOAuth2( + { + clientId: this.options.clientId, + scopes: this.options.scopes, + immediate: immediate, + authUser: 0, + }, + abortSignal, + ), + }, + abortSignal, + ), + ); } diff --git a/src/util/gzip.ts b/src/util/gzip.ts index 8e04f08560..9477d42aab 100644 --- a/src/util/gzip.ts +++ b/src/util/gzip.ts @@ -25,11 +25,18 @@ export function isGzipFormat(data: ArrayBufferView) { export async function decodeGzip( data: ArrayBuffer | ArrayBufferView, format: CompressionFormat, + abortSignal?: AbortSignal, ) { - const decompressedStream = new Response(data).body!.pipeThrough( - new DecompressionStream(format), - ); - return await new Response(decompressedStream).arrayBuffer(); + try { + const decompressedStream = new Response(data).body!.pipeThrough( + new DecompressionStream(format), + { signal: abortSignal }, + ); + return await new Response(decompressedStream).arrayBuffer(); + } catch { + abortSignal?.throwIfAborted(); + throw new Error(`Failed to decode ${format}`); + } } /** diff --git a/src/util/http_path_completion.ts b/src/util/http_path_completion.ts index 93743b7597..1aadcb2138 100644 --- a/src/util/http_path_completion.ts +++ b/src/util/http_path_completion.ts @@ -15,7 +15,6 @@ */ import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { BasicCompletionResult, Completion, @@ -28,7 +27,7 @@ import { getS3PathCompletions } from "#src/util/s3.js"; import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; import { - cancellableFetchSpecialOk, + fetchSpecialOk, parseSpecialUrl, } from "#src/util/special_protocol_request.js"; @@ -37,22 +36,19 @@ import { */ export async function getHtmlDirectoryListing( url: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, credentialsProvider?: SpecialProtocolCredentialsProvider, ): Promise { - const { text, contentType } = await cancellableFetchSpecialOk( + const response = await fetchSpecialOk( credentialsProvider, url, - /*init=*/ { headers: { accept: "text/html" } }, - async (x) => ({ - text: await x.text(), - contentType: x.headers.get("content-type"), - }), - cancellationToken, + /*init=*/ { headers: { accept: "text/html" }, signal: abortSignal }, ); + const contentType = response.headers.get("content-type"); if (contentType === null || /\btext\/html\b/i.exec(contentType) === null) { return []; } + const text = await response.text(); const doc = new DOMParser().parseFromString(text, "text/html"); const nodes = doc.evaluate( "//a/@href", @@ -74,7 +70,7 @@ export async function getHtmlDirectoryListing( export async function getHtmlPathCompletions( url: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, credentialsProvider?: SpecialProtocolCredentialsProvider, ): Promise { console.log("getHtmlPathCompletions"); @@ -82,7 +78,7 @@ export async function getHtmlPathCompletions( if (m === null) throw null; const entries = await getHtmlDirectoryListing( m[1], - cancellationToken, + abortSignal, credentialsProvider, ); const offset = m[1].length; @@ -124,7 +120,7 @@ const specialProtocolEmptyCompletions: CompletionWithDescription[] = [ export async function completeHttpPath( credentialsManager: CredentialsManager, url: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise> { if (!url.includes("://")) { return { @@ -156,7 +152,7 @@ export async function completeHttpPath( `${protocol}://${host}`, `https://storage.googleapis.com/${host}`, path, - cancellationToken, + abortSignal, ); } if (protocol === "gs" && path.length > 0) { @@ -165,11 +161,11 @@ export async function completeHttpPath( `${protocol}://${host}`, host, path, - cancellationToken, + abortSignal, ); } if (protocol === "s3" && path.length > 0) { - return await getS3PathCompletions(host, path, cancellationToken); + return await getS3PathCompletions(host, path, abortSignal); } const s3Match = parsedUrl.match( /^((?:http|https):\/\/(?:storage\.googleapis\.com\/[^/]+|[^/]+\.storage\.googleapis\.com|[^/]+\.s3(?:[^./]+)?\.amazonaws.com))(\/.*)$/, @@ -180,13 +176,13 @@ export async function completeHttpPath( s3Match[1], s3Match[1], s3Match[2], - cancellationToken, + abortSignal, ); } if ((protocol === "http" || protocol === "https") && path.length > 0) { return await getHtmlPathCompletions( parsedUrl, - cancellationToken, + abortSignal, credentialsProvider, ); } diff --git a/src/util/http_request.ts b/src/util/http_request.ts index dbfef9c38c..330757fbe0 100644 --- a/src/util/http_request.ts +++ b/src/util/http_request.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED, uncancelableToken } from "#src/util/cancellation.js"; import { Uint64 } from "#src/util/uint64.js"; export class HttpError extends Error { @@ -102,9 +100,7 @@ export async function fetchOk( init?: RequestInit, ): Promise { for (let requestAttempt = 0; ; ) { - if (init?.signal?.aborted) { - throw CANCELED; - } + init?.signal?.throwIfAborted(); let response: Response; try { response = await fetch(input, init); @@ -130,50 +126,6 @@ export async function fetchOk( } } -export function responseArrayBuffer(response: Response): Promise { - return response.arrayBuffer(); -} - -export function responseJson(response: Response): Promise { - return response.json(); -} - -export type ResponseTransform = (response: Response) => Promise; - -/** - * Issues a `fetch` request in the same way as `fetchOk`, and returns the result of the promise - * returned by `transformResponse`. - * - * Additionally, the request may be cancelled through `cancellationToken`. - * - * The `transformResponse` function should not do anything with the `Response` object after its - * result becomes ready; otherwise, cancellation may not work as expected. - */ -export async function cancellableFetchOk( - input: RequestInfo, - init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - if (cancellationToken === uncancelableToken) { - const response = await fetchOk(input, init); - return await transformResponse(response); - } - const abortController = new AbortController(); - const unregisterCancellation = cancellationToken.add(() => - abortController.abort(), - ); - try { - const response = await fetchOk(input, { - ...init, - signal: abortController.signal, - }); - return await transformResponse(response); - } finally { - unregisterCancellation(); - } -} - const tempUint64 = new Uint64(); export function getByteRangeHeader( diff --git a/src/util/polyfills.ts b/src/util/polyfills.ts new file mode 100644 index 0000000000..3a6325369b --- /dev/null +++ b/src/util/polyfills.ts @@ -0,0 +1,2 @@ +import "core-js/actual/symbol/dispose.js"; +import "core-js/actual/symbol/async-dispose.js"; diff --git a/src/util/s3.ts b/src/util/s3.ts index e7be327c0e..4088f280a9 100644 --- a/src/util/s3.ts +++ b/src/util/s3.ts @@ -14,39 +14,29 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; // Support for s3:// special protocol. -export async function cancellableFetchS3Ok( +export function fetchS3Ok( bucket: string, path: string, requestInit: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, ) { - return await cancellableFetchOk( - `https://${bucket}.s3.amazonaws.com${path}`, - requestInit, - transformResponse, - cancellationToken, - ); + return fetchOk(`https://${bucket}.s3.amazonaws.com${path}`, requestInit); } export async function getS3PathCompletions( bucket: string, path: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) { return await getS3CompatiblePathCompletions( undefined, `s3://${bucket}`, `https://${bucket}.s3.amazonaws.com`, path, - cancellationToken, + abortSignal, ); } diff --git a/src/util/s3_bucket_listing.ts b/src/util/s3_bucket_listing.ts index 39540266d7..a93ed197ef 100644 --- a/src/util/s3_bucket_listing.ts +++ b/src/util/s3_bucket_listing.ts @@ -20,7 +20,6 @@ */ import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { BasicCompletionResult } from "#src/util/completion.js"; import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; @@ -29,17 +28,18 @@ export async function getS3BucketListing( bucketUrl: string, prefix: string, delimiter: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const response = await fetchWithOAuth2Credentials( credentialsProvider, `${bucketUrl}?prefix=${encodeURIComponent(prefix)}` + `&delimiter=${encodeURIComponent(delimiter)}`, - /*init=*/ {}, - (x) => x.text(), - cancellationToken, + /*init=*/ { signal: abortSignal }, + ); + const doc = new DOMParser().parseFromString( + await response.text(), + "application/xml", ); - const doc = new DOMParser().parseFromString(response, "application/xml"); const commonPrefixNodes = doc.evaluate( '//*[name()="CommonPrefixes"]/*[name()="Prefix"]', doc, @@ -69,7 +69,7 @@ export async function getS3CompatiblePathCompletions( enteredBucketUrl: string, bucketUrl: string, path: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ): Promise { const prefix = path; if (!prefix.startsWith("/")) throw null; @@ -78,7 +78,7 @@ export async function getS3CompatiblePathCompletions( bucketUrl, path.substring(1), "/", - cancellationToken, + abortSignal, ); const offset = path.lastIndexOf("/"); return { diff --git a/src/util/special_protocol_request.ts b/src/util/special_protocol_request.ts index f79590b789..da6297d2ed 100644 --- a/src/util/special_protocol_request.ts +++ b/src/util/special_protocol_request.ts @@ -20,12 +20,9 @@ import type { MaybeOptionalCredentialsProvider, } from "#src/credentials_provider/index.js"; import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; import { parseUrl } from "#src/util/http_request.js"; import { getRandomHexString } from "#src/util/random.js"; -import { cancellableFetchS3Ok } from "#src/util/s3.js"; +import { fetchS3Ok } from "#src/util/s3.js"; export type SpecialProtocolCredentials = any; export type SpecialProtocolCredentialsProvider = @@ -131,13 +128,11 @@ export function parseSpecialUrl( } } -export async function cancellableFetchSpecialOk( +export async function fetchSpecialOk( credentialsProvider: SpecialProtocolCredentialsProvider, url: string, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { const u = parseUrl(url); switch (u.protocol) { case "gs": @@ -165,8 +160,6 @@ export async function cancellableFetchSpecialOk( `${encodeURIComponent(u.path.substring(1))}?alt=media` + `&neuroglancer=${getRandomHexString()}`, init, - transformResponse, - cancellationToken, ); case "gs+xml": return fetchWithOAuth2Credentials( @@ -174,24 +167,10 @@ export async function cancellableFetchSpecialOk( `https://storage.googleapis.com/${u.host}${u.path}` + `?neuroglancer=${getRandomHexString()}`, init, - transformResponse, - cancellationToken, ); case "s3": - return cancellableFetchS3Ok( - u.host, - u.path, - init, - transformResponse, - cancellationToken, - ); + return fetchS3Ok(u.host, u.path, init); default: - return fetchWithOAuth2Credentials( - credentialsProvider, - url, - init, - transformResponse, - cancellationToken, - ); + return fetchWithOAuth2Credentials(credentialsProvider, url, init); } } diff --git a/src/widget/multiline_autocomplete.ts b/src/widget/multiline_autocomplete.ts index 4a3f8c5a60..5917b3cf82 100644 --- a/src/widget/multiline_autocomplete.ts +++ b/src/widget/multiline_autocomplete.ts @@ -17,8 +17,6 @@ import "#src/widget/multiline_autocomplete.css"; import { debounce } from "lodash-es"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { BasicCompletionResult, Completion, @@ -98,7 +96,7 @@ const keyMap = EventActionMap.fromObject({ export type Completer = ( value: string, - cancellationToken: CancellationToken, + abortSignal: AbortSignal, ) => Promise | null; const DEFAULT_COMPLETION_DELAY = 200; // milliseconds @@ -113,9 +111,8 @@ export class AutocompleteTextInput extends RefCounted { private prevInputValue: string | undefined = ""; private completionsVisible = false; private activeCompletionPromise: Promise | null = null; - private activeCompletionCancellationToken: - | CancellationTokenSource - | undefined = undefined; + private activeCompletionAbortController: AbortController | undefined = + undefined; private hasFocus = false; private completionResult: CompletionResult | null = null; private dropdownContentsStale = true; @@ -228,10 +225,10 @@ export class AutocompleteTextInput extends RefCounted { const debouncedCompleter = (this.scheduleUpdateCompletions = debounce( () => { - const cancellationToken = (this.activeCompletionCancellationToken = - new CancellationTokenSource()); + const abortController = (this.activeCompletionAbortController = + new AbortController()); const activeCompletionPromise = (this.activeCompletionPromise = - this.completer(this.value, cancellationToken)); + this.completer(this.value, abortController.signal)); if (activeCompletionPromise !== null) { activeCompletionPromise.then((completionResult) => { if (this.activeCompletionPromise === activeCompletionPromise) { @@ -764,11 +761,8 @@ export class AutocompleteTextInput extends RefCounted { private cancelActiveCompletion() { this.prevInputValue = undefined; - const token = this.activeCompletionCancellationToken; - if (token !== undefined) { - token.cancel(); - } - this.activeCompletionCancellationToken = undefined; + this.activeCompletionAbortController?.abort(); + this.activeCompletionAbortController = undefined; this.activeCompletionPromise = null; } diff --git a/src/worker_rpc.ts b/src/worker_rpc.ts index 3ea514efda..281fdb46c0 100644 --- a/src/worker_rpc.ts +++ b/src/worker_rpc.ts @@ -14,13 +14,7 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - CANCELED, - CancellationTokenSource, - makeCancelablePromise, - uncancelableToken, -} from "#src/util/cancellation.js"; +import { promiseWithResolversAndAbortCallback } from "#src/util/abort.js"; import { RefCounted } from "#src/util/disposable.js"; export type RPCHandler = (this: RPC, x: any) => void; @@ -56,17 +50,17 @@ export class RPCError extends Error { export function registerPromiseRPC( key: string, - handler: ( - this: RPC, - x: any, - cancellationToken: CancellationToken, - ) => RPCPromise, + handler: (this: RPC, x: any, abortSignal: AbortSignal) => RPCPromise, ) { registerRPC(key, function (this: RPC, x: any) { const id = x.id; - const cancellationToken = new CancellationTokenSource(); - const promise = handler.call(this, x, cancellationToken) as RPCPromise; - this.set(id, { promise, cancellationToken }); + const abortController = new AbortController(); + const promise = handler.call( + this, + x, + abortController.signal, + ) as RPCPromise; + this.set(id, { promise, abortController }); promise.then( ({ value, transfers }) => { this.delete(id); @@ -88,8 +82,8 @@ registerRPC(PROMISE_CANCEL_ID, function (this: RPC, x: any) { const id = x.id; const request = this.get(id); if (request !== undefined) { - const { cancellationToken } = request; - cancellationToken.cancel(); + const { abortController } = request; + abortController.abort(); } }); @@ -100,12 +94,7 @@ registerRPC(PROMISE_RESPONSE_ID, function (this: RPC, x: any) { if (Object.prototype.hasOwnProperty.call(x, "value")) { resolve(x.value); } else { - const errorName = x.errorName; - if (errorName === CANCELED.name) { - reject(CANCELED); - } else { - reject(new RPCError(x.errorName, x.error)); - } + reject(new RPCError(x.errorName, x.error)); } }); @@ -204,21 +193,24 @@ export class RPC { promiseInvoke( name: string, x: any, - cancellationToken = uncancelableToken, + abortSignal?: AbortSignal | undefined, transfers?: any[], ): Promise { - return makeCancelablePromise( - cancellationToken, - (resolve, reject, token) => { - const id = (x.id = this.newId()); - this.set(id, { resolve, reject }); - this.invoke(name, x, transfers); - token.add(() => { - this.invoke(PROMISE_CANCEL_ID, { id: id }); - }); - }, - ); + if (abortSignal?.aborted) { + return Promise.reject(abortSignal.reason); + } + const id = (x.id = this.newId()); + this.invoke(name, x, transfers); + const { promise, resolve, reject } = + abortSignal === undefined + ? Promise.withResolvers() + : promiseWithResolversAndAbortCallback(abortSignal, () => { + this.invoke(PROMISE_CANCEL_ID, { id: id }); + }); + this.set(id, { resolve, reject }); + return promise; } + newId() { return IS_WORKER ? this.nextId-- : this.nextId++; } diff --git a/tsconfig.json b/tsconfig.json index 7afac1fe53..9e092a9f7f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,7 @@ "target": "ES2017", "newLine": "LF", "baseUrl": ".", - "lib": ["dom", "webworker", "es2020", "dom.iterable"], + "lib": ["dom", "webworker", "esnext", "dom.iterable"], "typeRoots": [], "module": "ESNext", }, From 04ed8f975d6cb5fe5a290015978ab1ec4e2e744d Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 10 Dec 2024 10:25:17 -0800 Subject: [PATCH 12/41] chore(tsconfig): migrate to useDefineForClassFields=true This aligns with native JavaScript class properties and improves compatibility with other transpilers/bundlers, like swc and rspack, like that can have varying behavior when `useDefineForClassFields=false`. --- src/annotation/backend.ts | 6 +- src/annotation/frontend_source.ts | 17 +- src/annotation/renderlayer.ts | 55 ++--- src/chunk_manager/frontend.ts | 4 +- src/chunk_manager/generic_file_source.ts | 4 +- src/coordinate_transform.ts | 3 +- .../chunk_source_frontend.ts | 2 +- src/datasource/brainmaps/frontend.ts | 4 +- src/datasource/graphene/backend.ts | 2 +- src/datasource/graphene/frontend.ts | 4 +- src/datasource/nggraph/frontend.ts | 2 +- src/datasource/precomputed/backend.ts | 2 +- src/datasource/precomputed/frontend.ts | 4 +- src/datasource/python/frontend.ts | 4 +- src/gpu_hash/hash_table.ts | 2 +- src/gpu_hash/shader.ts | 25 +- src/layer/annotation/index.ts | 6 +- src/layer/image/index.ts | 8 +- src/layer/index.ts | 20 +- src/layer/segmentation/index.ts | 151 ++++++------ src/layer/single_mesh/index.ts | 21 +- src/layer_groups_layout.ts | 11 +- src/mesh/frontend.ts | 47 ++-- src/navigation_state.ts | 32 +-- src/perspective_view/panel.ts | 2 +- src/renderlayer.ts | 45 ++-- src/segment_color.ts | 6 +- .../property_map.ts | 2 +- src/single_mesh/frontend.ts | 76 +++--- src/skeleton/backend.ts | 2 +- src/skeleton/frontend.ts | 219 ++++++++++-------- src/sliceview/backend.ts | 4 +- .../compressed_segmentation/chunk_format.ts | 2 +- src/sliceview/frontend.ts | 42 ++-- src/sliceview/panel.ts | 2 +- src/sliceview/renderlayer.ts | 6 +- src/sliceview/single_texture_chunk_format.ts | 2 +- src/sliceview/uncompressed_chunk_format.ts | 10 +- src/sliceview/volume/backend.ts | 2 +- src/sliceview/volume/frontend.ts | 4 +- src/sliceview/volume/renderlayer.ts | 2 +- .../volume/segmentation_renderlayer.ts | 60 +++-- src/trackable_boolean.ts | 3 +- src/ui/annotations.ts | 58 ++--- src/ui/layer_bar.ts | 23 +- src/ui/layer_side_panel_state.ts | 3 +- src/ui/segment_list.ts | 8 +- src/ui/segmentation_display_options_tab.ts | 5 +- src/ui/tool.ts | 3 +- src/webgl/empirical_cdf.ts | 67 +++--- src/webgl/offscreen.ts | 11 +- src/webgl/shader.ts | 4 +- src/webgl/shader_testing.ts | 10 +- src/webgl/texture_access.ts | 12 +- src/widget/channel_dimensions_widget.ts | 4 +- src/widget/invlerp.ts | 31 +-- src/widget/position_plot.ts | 10 +- src/widget/scale_bar.ts | 8 +- src/widget/transfer_function.ts | 103 ++++---- src/worker_rpc.ts | 2 +- tsconfig.json | 3 +- 61 files changed, 710 insertions(+), 582 deletions(-) diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index 599a9667c2..0c2b10b29c 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -148,11 +148,11 @@ function GeometryChunkMixin( export class AnnotationGeometryChunk extends GeometryChunkMixin( SliceViewChunk, ) { - source: AnnotationGeometryChunkSourceBackend; + declare source: AnnotationGeometryChunkSourceBackend; } export class AnnotationSubsetGeometryChunk extends GeometryChunkMixin(Chunk) { - source: AnnotationSubsetGeometryChunkSource; + declare source: AnnotationSubsetGeometryChunkSource; objectId: Uint64; } @@ -191,7 +191,7 @@ AnnotationGeometryChunkSourceBackend.prototype.chunkConstructor = @registerSharedObject(ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID) class AnnotationSubsetGeometryChunkSource extends ChunkSource { parent: Borrowed | undefined = undefined; - chunks: Map; + declare chunks: Map; relationshipIndex: number; getChunk(objectId: Uint64) { const key = getObjectKey(objectId); diff --git a/src/annotation/frontend_source.ts b/src/annotation/frontend_source.ts index 1d6bc9423b..e957c6bae3 100644 --- a/src/annotation/frontend_source.ts +++ b/src/annotation/frontend_source.ts @@ -115,7 +115,7 @@ export class AnnotationGeometryData { } export class AnnotationSubsetGeometryChunk extends Chunk { - source: AnnotationSubsetGeometryChunkSource; + declare source: AnnotationSubsetGeometryChunkSource; // undefined indicates chunk not found data: AnnotationGeometryData | undefined; constructor(source: AnnotationSubsetGeometryChunkSource, x: any) { @@ -139,7 +139,7 @@ export class AnnotationSubsetGeometryChunk extends Chunk { } export class AnnotationGeometryChunk extends SliceViewChunk { - source: AnnotationGeometryChunkSource; + declare source: AnnotationGeometryChunkSource; // undefined indicates chunk not found data: AnnotationGeometryData | undefined; @@ -168,7 +168,7 @@ export class AnnotationGeometryChunkSource extends SliceViewChunkSource< AnnotationGeometryChunkSpecification, AnnotationGeometryChunk > { - OPTIONS: AnnotationGeometryChunkSourceOptions; + declare OPTIONS: AnnotationGeometryChunkSourceOptions; parent: Borrowed; immediateChunkUpdates = true; @@ -226,7 +226,7 @@ export class AnnotationGeometryChunkSource extends SliceViewChunkSource< @registerSharedObjectOwner(ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID) export class AnnotationSubsetGeometryChunkSource extends ChunkSource { immediateChunkUpdates = true; - chunks: Map; + declare chunks: Map; constructor( chunkManager: Borrowed, @@ -256,7 +256,7 @@ export class AnnotationMetadataChunk extends Chunk { @registerSharedObjectOwner(ANNOTATION_METADATA_CHUNK_SOURCE_RPC_ID) export class AnnotationMetadataChunkSource extends ChunkSource { - chunks: Map; + declare chunks: Map; constructor( chunkManager: Borrowed, public parent: Borrowed, @@ -510,9 +510,7 @@ export class MultiscaleAnnotationSource { OPTIONS: object; key: any; - metadataChunkSource = this.registerDisposer( - new AnnotationMetadataChunkSource(this.chunkManager, this), - ); + metadataChunkSource: AnnotationMetadataChunkSource; segmentFilteredSources: Owned[]; spatiallyIndexedSources = new Set>(); rank: number; @@ -528,6 +526,9 @@ export class MultiscaleAnnotationSource }, ) { super(); + this.metadataChunkSource = this.registerDisposer( + new AnnotationMetadataChunkSource(this.chunkManager, this), + ); this.rank = options.rank; this.properties = options.properties; this.annotationPropertySerializers = makeAnnotationPropertySerializers( diff --git a/src/annotation/renderlayer.ts b/src/annotation/renderlayer.ts index 836fa8dd13..90c7d120ca 100644 --- a/src/annotation/renderlayer.ts +++ b/src/annotation/renderlayer.ts @@ -265,32 +265,9 @@ export class AnnotationLayer extends RefCounted { return sharedObject.visibility; } - segmentationStates = this.registerDisposer( - makeCachedDerivedWatchableValue( - (_relationshipStates, _ignoreNullSegmentFilter) => { - const { displayState, source } = this.state; - const { relationshipStates } = displayState; - return displayState.displayUnfiltered.value - ? undefined - : source.relationships.map((relationship) => { - const state = relationshipStates.get(relationship); - return state.showMatches.value - ? state.segmentationState.value - : undefined; - }); - }, - [ - this.state.displayState.relationshipStates, - this.state.displayState.ignoreNullSegmentFilter, - ], - (a, b) => { - if (a === undefined || b === undefined) { - return a === b; - } - return arraysEqual(a, b); - }, - ), - ); + segmentationStates: WatchableValueInterface< + OptionalSegmentationDisplayState[] | undefined + >; constructor( public chunkManager: ChunkManager, @@ -298,6 +275,32 @@ export class AnnotationLayer extends RefCounted { ) { super(); this.registerDisposer(state); + this.segmentationStates = this.registerDisposer( + makeCachedDerivedWatchableValue( + (_relationshipStates, _ignoreNullSegmentFilter) => { + const { displayState, source } = this.state; + const { relationshipStates } = displayState; + return displayState.displayUnfiltered.value + ? undefined + : source.relationships.map((relationship) => { + const state = relationshipStates.get(relationship); + return state.showMatches.value + ? state.segmentationState.value + : undefined; + }); + }, + [ + this.state.displayState.relationshipStates, + this.state.displayState.ignoreNullSegmentFilter, + ], + (a, b) => { + if (a === undefined || b === undefined) { + return a === b; + } + return arraysEqual(a, b); + }, + ), + ); this.registerDisposer( this.source.changed.add(this.handleChangeAffectingBuffer), ); diff --git a/src/chunk_manager/frontend.ts b/src/chunk_manager/frontend.ts index 54621ba2e5..8d552cbefc 100644 --- a/src/chunk_manager/frontend.ts +++ b/src/chunk_manager/frontend.ts @@ -430,7 +430,7 @@ export interface ChunkRequesterState { // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class ChunkSource extends SharedObject { - OPTIONS: object; + declare OPTIONS: object; chunks = new Map(); chunkRequesters: Map | undefined; @@ -506,7 +506,7 @@ export function WithParameters< }; @registerSharedObjectOwner(parametersConstructor.RPC_ID) class C extends Base { - OPTIONS: WithParametersOptions; + declare OPTIONS: WithParametersOptions; parameters: Parameters; constructor(...args: any[]) { super(...args); diff --git a/src/chunk_manager/generic_file_source.ts b/src/chunk_manager/generic_file_source.ts index 42605866d8..6029a19814 100644 --- a/src/chunk_manager/generic_file_source.ts +++ b/src/chunk_manager/generic_file_source.ts @@ -84,7 +84,7 @@ export interface GenericSharedDataSourceOptions { } export class GenericSharedDataSource extends ChunkSourceBase { - chunks: Map>; + declare chunks: Map>; private encodeKeyFunction: (key: Key) => string; @@ -270,7 +270,7 @@ export interface SimpleAsyncCacheOptions { } export class SimpleAsyncCache extends ChunkSourceBase { - chunks: Map>; + declare chunks: Map>; constructor( chunkManager: Owned, diff --git a/src/coordinate_transform.ts b/src/coordinate_transform.ts index 99a9fdc07c..2b2a2fd09f 100644 --- a/src/coordinate_transform.ts +++ b/src/coordinate_transform.ts @@ -1414,7 +1414,7 @@ export class CoordinateSpaceCombiner { private retainCount = 0; - private prevCombined: CoordinateSpace | undefined = this.combined.value; + private prevCombined: CoordinateSpace | undefined; dimensionRefCounts = new Map(); @@ -1454,6 +1454,7 @@ export class CoordinateSpaceCombiner { includeDimensionPredicate: (name: string) => boolean, ) { this.includeDimensionPredicate_ = includeDimensionPredicate; + this.prevCombined = this.combined.value; } private update() { diff --git a/src/credentials_provider/chunk_source_frontend.ts b/src/credentials_provider/chunk_source_frontend.ts index e0dfb35a36..5f7a07cce0 100644 --- a/src/credentials_provider/chunk_source_frontend.ts +++ b/src/credentials_provider/chunk_source_frontend.ts @@ -69,7 +69,7 @@ export function WithCredentialsProvider() { }; class C extends Base { credentialsProvider: MaybeOptionalCredentialsProvider; - OPTIONS: WithCredentialsOptions; + declare OPTIONS: WithCredentialsOptions; constructor(...args: any[]) { super(...args); const options: WithCredentialsOptions = args[1]; diff --git a/src/datasource/brainmaps/frontend.ts b/src/datasource/brainmaps/frontend.ts index f066531b87..6bd0cfc1ba 100644 --- a/src/datasource/brainmaps/frontend.ts +++ b/src/datasource/brainmaps/frontend.ts @@ -691,8 +691,8 @@ const MultiscaleAnnotationSourceBase = WithParameters( ); export class BrainmapsAnnotationSource extends MultiscaleAnnotationSourceBase { - key: any; - parameters: AnnotationSourceParameters; + declare key: any; + declare parameters: AnnotationSourceParameters; credentialsProvider: Owned>; constructor( chunkManager: ChunkManager, diff --git a/src/datasource/graphene/backend.ts b/src/datasource/graphene/backend.ts index edd4a1bd6c..174fd2d0b6 100644 --- a/src/datasource/graphene/backend.ts +++ b/src/datasource/graphene/backend.ts @@ -256,7 +256,7 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( ChunkedGraphSourceParameters, ) { spec: ChunkedGraphChunkSpecification; - chunks: Map; + declare chunks: Map; tempChunkDataSize: Uint32Array; tempChunkPosition: Float32Array; diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 81e64d154a..6cd7dc6692 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -1822,8 +1822,8 @@ class ChunkedGraphChunkSource extends SliceViewChunkSource implements ChunkedGraphChunkSourceInterface { - spec: ChunkedGraphChunkSpecification; - OPTIONS: { spec: ChunkedGraphChunkSpecification }; + declare spec: ChunkedGraphChunkSpecification; + declare OPTIONS: { spec: ChunkedGraphChunkSpecification }; } class GrapheneChunkedGraphChunkSource extends WithParameters( diff --git a/src/datasource/nggraph/frontend.ts b/src/datasource/nggraph/frontend.ts index 973e633a20..bd3e53c461 100644 --- a/src/datasource/nggraph/frontend.ts +++ b/src/datasource/nggraph/frontend.ts @@ -114,7 +114,7 @@ type GraphSegmentUpdate = GraphSegmentInfo | "invalid" | "error"; let updateGeneration = 0; class GraphConnection extends SegmentationGraphSourceConnection { - graph: NggraphSegmentationGraphSource; + declare graph: NggraphSegmentationGraphSource; constructor( graph: NggraphSegmentationGraphSource, segmentsState: VisibleSegmentsState, diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 0d885563b8..23b3e2c82e 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -1032,7 +1032,7 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete this.credentialsProvider, this.parameters, ); - parent: PrecomputedAnnotationSourceBackend; + declare parent: PrecomputedAnnotationSourceBackend; async download(chunk: AnnotationGeometryChunk, abortSignal: AbortSignal) { const { parameters } = this; diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index 6cec9c310e..52d29ecba4 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -420,10 +420,10 @@ interface PrecomputedAnnotationSourceOptions { } export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase { - key: any; + declare key: any; metadata: AnnotationMetadata; credentialsProvider: SpecialProtocolCredentialsProvider; - OPTIONS: PrecomputedAnnotationSourceOptions; + declare OPTIONS: PrecomputedAnnotationSourceOptions; constructor( chunkManager: ChunkManager, options: PrecomputedAnnotationSourceOptions, diff --git a/src/datasource/python/frontend.ts b/src/datasource/python/frontend.ts index 73e6b4943b..dbd188502b 100644 --- a/src/datasource/python/frontend.ts +++ b/src/datasource/python/frontend.ts @@ -98,10 +98,10 @@ function WithPythonDataSource< generation: number; }; class C extends Base { - OPTIONS: Options; + declare OPTIONS: Options; dataSource: Owned; generation: number; - parameters: PythonSourceParameters; + declare parameters: PythonSourceParameters; constructor(...args: any[]) { super(...args); const options: Options = args[1]; diff --git a/src/gpu_hash/hash_table.ts b/src/gpu_hash/hash_table.ts index e80c41f536..122de83e86 100644 --- a/src/gpu_hash/hash_table.ts +++ b/src/gpu_hash/hash_table.ts @@ -47,7 +47,7 @@ export abstract class HashTableBase { /** * Number of uint32 elements per entry in hash table. */ - entryStride: number; + declare entryStride: number; generation = 0; diff --git a/src/gpu_hash/shader.ts b/src/gpu_hash/shader.ts index 39dbd75681..af44a0b97b 100644 --- a/src/gpu_hash/shader.ts +++ b/src/gpu_hash/shader.ts @@ -98,19 +98,26 @@ export class GPUHashTable extends RefCounted { } export class HashSetShaderManager { - textureUnitSymbol = Symbol.for(`gpuhashtable:${this.prefix}`); - private accessHelper = new OneDimensionalTextureAccessHelper( - `gpuhashtable_${this.prefix}`, - ); - samplerName = this.prefix + "_sampler"; - hashSeedsName = this.prefix + "_seeds"; - hashKeyMask = this.prefix + "_keyMask"; - readTable = this.prefix + "_readTable"; + textureUnitSymbol: symbol; + private accessHelper: OneDimensionalTextureAccessHelper; + samplerName: string; + hashSeedsName: string; + hashKeyMask: string; + readTable: string; constructor( public prefix: string, public numAlternatives = NUM_ALTERNATIVES, - ) {} + ) { + this.textureUnitSymbol = Symbol.for(`gpuhashtable:${this.prefix}`); + this.accessHelper = new OneDimensionalTextureAccessHelper( + `gpuhashtable_${this.prefix}`, + ); + this.samplerName = prefix + "_sampler"; + this.hashSeedsName = prefix + "_seeds"; + this.hashKeyMask = prefix + "_keyMask"; + this.readTable = prefix + "_readTable"; + } defineShader(builder: ShaderBuilder) { const { hashSeedsName, samplerName, numAlternatives, hashKeyMask } = this; diff --git a/src/layer/annotation/index.ts b/src/layer/annotation/index.ts index 35c1a4e430..1d20308cf3 100644 --- a/src/layer/annotation/index.ts +++ b/src/layer/annotation/index.ts @@ -726,19 +726,21 @@ function makeShaderCodeWidget(layer: AnnotationUserLayer) { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: AnnotationUserLayer) { super(); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); this.content.appendChild(this.codeWidget.element); this.codeWidget.textEditor.refresh(); } } class RenderingOptionsTab extends Tab { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: AnnotationUserLayer) { super(); const { element } = this; + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); element.classList.add("neuroglancer-annotation-rendering-tab"); element.appendChild( this.registerDisposer( diff --git a/src/layer/image/index.ts b/src/layer/image/index.ts index 256050060c..2d2830f6c3 100644 --- a/src/layer/image/index.ts +++ b/src/layer/image/index.ts @@ -196,7 +196,7 @@ export class ImageUserLayer extends Base { }; } - selectionState: ImageLayerSelectionState; + declare selectionState: ImageLayerSelectionState; constructor(managedLayer: Borrowed) { super(managedLayer); @@ -521,10 +521,11 @@ for (const control of LAYER_CONTROLS) { } class RenderingOptionsTab extends Tab { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: ImageUserLayer) { super(); const { element } = this; + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); element.classList.add("neuroglancer-image-dropdown"); for (const control of LAYER_CONTROLS) { @@ -579,9 +580,10 @@ class RenderingOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: ImageUserLayer) { super(); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); this.content.classList.add("neuroglancer-image-layer-shader-overlay"); this.content.appendChild(this.codeWidget.element); this.codeWidget.textEditor.refresh(); diff --git a/src/layer/index.ts b/src/layer/index.ts index 9a8e6d8dbe..c5e2f7e6fd 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -349,9 +349,7 @@ export class UserLayer extends RefCounted { tabs = this.registerDisposer(new TabSpecification()); panels = new UserLayerSidePanelsState(this); tool = this.registerDisposer(new SelectedLegacyTool(this)); - toolBinder = this.registerDisposer( - new LocalToolBinder(this, this.manager.root.toolBinder), - ); + toolBinder: LocalToolBinder; dataSourcesChanged = new NullarySignal(); dataSources: LayerDataSource[] = []; @@ -362,6 +360,9 @@ export class UserLayer extends RefCounted { constructor(public managedLayer: Borrowed) { super(); + this.toolBinder = this.registerDisposer( + new LocalToolBinder(this, this.manager.root.toolBinder), + ); this.localCoordinateSpaceCombiner.includeDimensionPredicate = isLocalOrChannelDimension; this.tabs.changed.add(this.specificationChanged.dispatch); @@ -2104,13 +2105,9 @@ export class TopLevelLayerListSpecification extends LayerListSpecification { return this; } - coordinateSpaceCombiner = new CoordinateSpaceCombiner( - this.coordinateSpace, - isGlobalDimension, - ); + coordinateSpaceCombiner: CoordinateSpaceCombiner; subsets = new Set(); - - layerSelectedValues = this.selectionState.layerSelectedValues; + layerSelectedValues: LayerSelectedValues; constructor( public display: DisplayContext, @@ -2124,6 +2121,11 @@ export class TopLevelLayerListSpecification extends LayerListSpecification { public toolBinder: Borrowed, ) { super(); + this.coordinateSpaceCombiner = new CoordinateSpaceCombiner( + coordinateSpace, + isGlobalDimension, + ); + this.layerSelectedValues = selectionState.layerSelectedValues; this.registerDisposer( layerManager.layersChanged.add(this.changed.dispatch), ); diff --git a/src/layer/segmentation/index.ts b/src/layer/segmentation/index.ts index 8a5981d87c..5efdc0ca8f 100644 --- a/src/layer/segmentation/index.ts +++ b/src/layer/segmentation/index.ts @@ -142,7 +142,40 @@ export class SegmentationUserLayerGroupState this.hideSegmentZero.changed.add(specificationChanged.dispatch); this.segmentQuery.changed.add(specificationChanged.dispatch); - const { visibleSegments, selectedSegments } = this; + const { selectedSegments } = this; + const visibleSegments = (this.visibleSegments = this.registerDisposer( + Uint64Set.makeWithCounterpart(layer.manager.rpc), + )); + this.segmentEquivalences = this.registerDisposer( + SharedDisjointUint64Sets.makeWithCounterpart( + layer.manager.rpc, + layer.registerDisposer( + makeCachedDerivedWatchableValue( + (x) => + x?.visibleSegmentEquivalencePolicy || + VisibleSegmentEquivalencePolicy.MIN_REPRESENTATIVE, + [this.graph], + ), + ), + ), + ); + + this.temporaryVisibleSegments = layer.registerDisposer( + Uint64Set.makeWithCounterpart(layer.manager.rpc), + ); + this.temporarySegmentEquivalences = layer.registerDisposer( + SharedDisjointUint64Sets.makeWithCounterpart( + layer.manager.rpc, + this.segmentEquivalences.disjointSets.visibleSegmentEquivalencePolicy, + ), + ); + this.useTemporaryVisibleSegments = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + this.useTemporarySegmentEquivalences = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + visibleSegments.changed.add(specificationChanged.dispatch); selectedSegments.changed.add(specificationChanged.dispatch); selectedSegments.changed.add((x, add) => { @@ -235,48 +268,23 @@ export class SegmentationUserLayerGroupState } localGraph = new LocalSegmentationGraphSource(); - visibleSegments = this.registerDisposer( - Uint64Set.makeWithCounterpart(this.layer.manager.rpc), - ); + visibleSegments: Uint64Set; selectedSegments = this.registerDisposer(new Uint64OrderedSet()); segmentPropertyMap = new WatchableValue< PreprocessedSegmentPropertyMap | undefined >(undefined); graph = new WatchableValue(undefined); - segmentEquivalences = this.registerDisposer( - SharedDisjointUint64Sets.makeWithCounterpart( - this.layer.manager.rpc, - this.layer.registerDisposer( - makeCachedDerivedWatchableValue( - (x) => - x?.visibleSegmentEquivalencePolicy || - VisibleSegmentEquivalencePolicy.MIN_REPRESENTATIVE, - [this.graph], - ), - ), - ), - ); + segmentEquivalences: SharedDisjointUint64Sets; localSegmentEquivalences = false; maxIdLength = new WatchableValue(1); hideSegmentZero = new TrackableBoolean(true, true); segmentQuery = new TrackableValue("", verifyString); - temporaryVisibleSegments = this.layer.registerDisposer( - Uint64Set.makeWithCounterpart(this.layer.manager.rpc), - ); - temporarySegmentEquivalences = this.layer.registerDisposer( - SharedDisjointUint64Sets.makeWithCounterpart( - this.layer.manager.rpc, - this.segmentEquivalences.disjointSets.visibleSegmentEquivalencePolicy, - ), - ); - useTemporaryVisibleSegments = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); - useTemporarySegmentEquivalences = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); + temporaryVisibleSegments: Uint64Set; + temporarySegmentEquivalences: SharedDisjointUint64Sets; + useTemporaryVisibleSegments: SharedWatchableValue; + useTemporarySegmentEquivalences: SharedWatchableValue; } export class SegmentationUserLayerColorGroupState @@ -403,6 +411,41 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { // Even though `SegmentationUserLayer` assigns this to its `displayState` property, redundantly // assign it here first in order to allow it to be accessed by `segmentationGroupState`. layer.displayState = this; + + this.linkedSegmentationGroup = layer.registerDisposer( + new LinkedLayerGroup( + layer.manager.rootLayers, + layer, + (userLayer) => userLayer instanceof SegmentationUserLayer, + (userLayer: SegmentationUserLayer) => + userLayer.displayState.linkedSegmentationGroup, + ), + ); + + this.linkedSegmentationColorGroup = this.layer.registerDisposer( + new LinkedLayerGroup( + layer.manager.rootLayers, + layer, + (userLayer) => userLayer instanceof SegmentationUserLayer, + (userLayer: SegmentationUserLayer) => + userLayer.displayState.linkedSegmentationColorGroup, + ), + ); + + this.originalSegmentationGroupState = layer.registerDisposer( + new SegmentationUserLayerGroupState(layer), + ); + + this.originalSegmentationColorGroupState = layer.registerDisposer( + new SegmentationUserLayerColorGroupState(layer), + ); + + this.transparentPickEnabled = layer.pick; + + this.useTempSegmentStatedColors2d = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + this.segmentationGroupState = this.layer.registerDisposer( new LinkedSegmentationGroupState( this.linkedSegmentationGroup, @@ -416,6 +459,9 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { ), ); + this.selectSegment = layer.selectSegment; + this.filterBySegmentLabel = layer.filterBySegmentLabel; + this.hideSegmentZero = this.layer.registerDisposer( new IndirectWatchableValue( this.segmentationGroupState, @@ -488,47 +534,22 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { shaderError = makeWatchableShaderError(); renderScaleHistogram = new RenderScaleHistogram(); renderScaleTarget = trackableRenderScaleTarget(1); - selectSegment = this.layer.selectSegment; - transparentPickEnabled = this.layer.pick; + selectSegment: (id: Uint64, pin: boolean | "toggle") => void; + transparentPickEnabled: TrackableBoolean; baseSegmentColoring = new TrackableBoolean(false, false); baseSegmentHighlighting = new TrackableBoolean(false, false); - useTempSegmentStatedColors2d = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); + useTempSegmentStatedColors2d: SharedWatchableValue; - filterBySegmentLabel = this.layer.filterBySegmentLabel; + filterBySegmentLabel: (id: Uint64) => void; moveToSegment = (id: Uint64) => { this.layer.moveToSegment(id); }; - linkedSegmentationGroup: LinkedLayerGroup = this.layer.registerDisposer( - new LinkedLayerGroup( - this.layer.manager.rootLayers, - this.layer, - (userLayer) => userLayer instanceof SegmentationUserLayer, - (userLayer: SegmentationUserLayer) => - userLayer.displayState.linkedSegmentationGroup, - ), - ); - - linkedSegmentationColorGroup: LinkedLayerGroup = this.layer.registerDisposer( - new LinkedLayerGroup( - this.layer.manager.rootLayers, - this.layer, - (userLayer) => userLayer instanceof SegmentationUserLayer, - (userLayer: SegmentationUserLayer) => - userLayer.displayState.linkedSegmentationColorGroup, - ), - ); - - originalSegmentationGroupState = this.layer.registerDisposer( - new SegmentationUserLayerGroupState(this.layer), - ); - - originalSegmentationColorGroupState = this.layer.registerDisposer( - new SegmentationUserLayerColorGroupState(this.layer), - ); + linkedSegmentationGroup: LinkedLayerGroup; + linkedSegmentationColorGroup: LinkedLayerGroup; + originalSegmentationGroupState: SegmentationUserLayerGroupState; + originalSegmentationColorGroupState: SegmentationUserLayerColorGroupState; segmentationGroupState: WatchableValueInterface; segmentationColorGroupState: WatchableValueInterface; diff --git a/src/layer/single_mesh/index.ts b/src/layer/single_mesh/index.ts index 6e2b686943..d0be944802 100644 --- a/src/layer/single_mesh/index.ts +++ b/src/layer/single_mesh/index.ts @@ -193,13 +193,16 @@ function makeVertexAttributeWidget(layer: SingleMeshUserLayer) { } class DisplayOptionsTab extends Tab { - attributeWidget = this.registerDisposer( - makeVertexAttributeWidget(this.layer), - ); - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + attributeWidget: VertexAttributeWidget; + codeWidget: ShaderCodeWidget; + constructor(public layer: SingleMeshUserLayer) { super(); const { element } = this; + this.attributeWidget = this.registerDisposer( + makeVertexAttributeWidget(layer), + ); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(layer)); element.classList.add("neuroglancer-single-mesh-dropdown"); const topRow = document.createElement("div"); topRow.className = "neuroglancer-single-mesh-dropdown-top-row"; @@ -239,12 +242,14 @@ class DisplayOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - attributeWidget = this.registerDisposer( - makeVertexAttributeWidget(this.layer), - ); - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + attributeWidget: VertexAttributeWidget; + codeWidget: ShaderCodeWidget; constructor(public layer: SingleMeshUserLayer) { super(); + this.attributeWidget = this.registerDisposer( + makeVertexAttributeWidget(layer), + ); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(layer)); this.content.classList.add("neuroglancer-single-mesh-layer-shader-overlay"); this.content.appendChild(this.attributeWidget.element); this.content.appendChild(this.codeWidget.element); diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index 851b3ff275..fb9bd92114 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -781,13 +781,7 @@ function makeComponent(container: LayoutComponentContainer, spec: any) { } export class RootLayoutContainer extends RefCounted implements Trackable { - container = this.registerDisposer( - new LayoutComponentContainer( - this.viewer, - this.defaultSpecification, - undefined, - ), - ); + container: LayoutComponentContainer; get changed() { return this.container.changed; @@ -802,6 +796,9 @@ export class RootLayoutContainer extends RefCounted implements Trackable { public defaultSpecification: any, ) { super(); + this.container = this.registerDisposer( + new LayoutComponentContainer(viewer, defaultSpecification, undefined), + ); } reset() { diff --git a/src/mesh/frontend.ts b/src/mesh/frontend.ts index 042ae4553e..8260fc06aa 100644 --- a/src/mesh/frontend.ts +++ b/src/mesh/frontend.ts @@ -240,12 +240,13 @@ highp vec3 getVertexPosition() { export class MeshShaderManager { private tempLightVec = new Float32Array(4); - private vertexPositionHandler = - vertexPositionHandlers[this.vertexPositionFormat]; + private vertexPositionHandler: VertexPositionFormatHandler; constructor( public fragmentRelativeVertices: boolean, public vertexPositionFormat: VertexPositionFormat, - ) {} + ) { + this.vertexPositionHandler = vertexPositionHandlers[vertexPositionFormat]; + } beginLayer( gl: GL, @@ -412,11 +413,8 @@ export interface MeshDisplayState extends SegmentationDisplayState3D { } export class MeshLayer extends PerspectiveViewRenderLayer { - protected meshShaderManager = new MeshShaderManager( - /*fragmentRelativeVertices=*/ false, - VertexPositionFormat.float32, - ); - private getShader = this.meshShaderManager.makeGetter(this); + protected meshShaderManager; + private getShader; backend: SegmentationLayerSharedObject; constructor( @@ -425,6 +423,11 @@ export class MeshLayer extends PerspectiveViewRenderLayer; + declare chunks: Map; initializeCounterpart(rpc: RPC, options: any) { this.fragmentSource.initializeCounterpart(this.chunkManager.rpc!, {}); @@ -721,7 +724,7 @@ export class MeshSource extends ChunkSource { @registerSharedObjectOwner(FRAGMENT_SOURCE_RPC_ID) export class FragmentSource extends ChunkSource { - chunks: Map; + declare chunks: Map; get key() { return this.meshSource.key; } @@ -751,11 +754,8 @@ function hasFragmentChunk( } export class MultiscaleMeshLayer extends PerspectiveViewRenderLayer { - protected meshShaderManager = new MeshShaderManager( - /*fragmentRelativeVertices=*/ this.source.format.fragmentRelativeVertices, - this.source.format.vertexPositionFormat, - ); - private getShader = this.meshShaderManager.makeGetter(this); + protected meshShaderManager: MeshShaderManager; + private getShader; backend: SegmentationLayerSharedObject; constructor( @@ -764,6 +764,11 @@ export class MultiscaleMeshLayer extends PerspectiveViewRenderLayer; + declare chunks: Map; format: MultiscaleFragmentFormat; constructor( chunkManager: Borrowed, @@ -1150,7 +1155,7 @@ export class MultiscaleMeshSource extends ChunkSource { @registerSharedObjectOwner(MULTISCALE_FRAGMENT_SOURCE_RPC_ID) export class MultiscaleFragmentSource extends ChunkSource { - chunks: Map; + declare chunks: Map; get key() { return this.meshSource.key; } diff --git a/src/navigation_state.ts b/src/navigation_state.ts index 2f12c550fc..4ccfd47095 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -674,15 +674,17 @@ export class CoordinateSpacePlaybackVelocity extends RefCounted { export class LinkedCoordinateSpacePlaybackVelocity extends RefCounted { changed = new NullarySignal(); - velocity = this.registerDisposer( - new CoordinateSpacePlaybackVelocity(this.peer.coordinateSpace), - ); + velocity: CoordinateSpacePlaybackVelocity; constructor( public peer: Owned, public positionLink: TrackableLinkInterface, ) { super(); + this.velocity = this.registerDisposer( + new CoordinateSpacePlaybackVelocity(peer.coordinateSpace), + ); + this.registerDisposer(peer); this.velocity.changed.add(() => { if (this.positionLink.value === NavigationLinkType.UNLINKED) { @@ -1447,17 +1449,10 @@ export function validateDisplayDimensionRenderInfoProperty( export class WatchableDisplayDimensionRenderInfo extends RefCounted { changed = new NullarySignal(); - private curRelativeDisplayScales: RelativeDisplayScales = - this.relativeDisplayScales.value; - private curDisplayDimensions: DisplayDimensions = - this.displayDimensions.value; - private curCoordinateSpace: CoordinateSpace = - this.relativeDisplayScales.coordinateSpace.value; - private value_: DisplayDimensionRenderInfo = getDisplayDimensionRenderInfo( - this.curCoordinateSpace, - this.curDisplayDimensions, - this.curRelativeDisplayScales, - ); + private curRelativeDisplayScales: RelativeDisplayScales; + private curDisplayDimensions: DisplayDimensions; + private curCoordinateSpace: CoordinateSpace; + private value_: DisplayDimensionRenderInfo; get value() { const { relativeDisplayScales: { @@ -1495,6 +1490,15 @@ export class WatchableDisplayDimensionRenderInfo extends RefCounted { public displayDimensions: Owned, ) { super(); + this.curRelativeDisplayScales = this.relativeDisplayScales.value; + this.curDisplayDimensions = this.displayDimensions.value; + this.curCoordinateSpace = this.relativeDisplayScales.coordinateSpace.value; + this.value_ = getDisplayDimensionRenderInfo( + this.curCoordinateSpace, + this.curDisplayDimensions, + this.curRelativeDisplayScales, + ); + this.registerDisposer(relativeDisplayScales); this.registerDisposer(displayDimensions); const maybeUpdateValue = () => { diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index 2f0bceb0fc..646519d907 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -269,7 +269,7 @@ class PerspectiveViewState extends PerspectiveViewStateBase { } export class PerspectivePanel extends RenderedDataPanel { - viewer: PerspectiveViewerState; + declare viewer: PerspectiveViewerState; projectionParameters: Owned; diff --git a/src/renderlayer.ts b/src/renderlayer.ts index c874fac970..2fbea24894 100644 --- a/src/renderlayer.ts +++ b/src/renderlayer.ts @@ -257,6 +257,28 @@ export class SharedProjectionParameters< public updateInterval = 10, ) { super(); + this.update = this.registerCancellable( + debounce((_oldValue: T, newValue: T) => { + // Note: Because we are using debouce, we cannot rely on `_oldValue`, since + // `DerivedProjectionParameters` reuses the objects. + let valueUpdate: any; + if ( + newValue.displayDimensionRenderInfo !== + this.prevDisplayDimensionRenderInfo + ) { + valueUpdate = newValue; + this.prevDisplayDimensionRenderInfo = + newValue.displayDimensionRenderInfo; + } else { + const { displayDimensionRenderInfo, ...remainder } = newValue; + valueUpdate = remainder; + } + this.rpc!.invoke(PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, { + id: this.rpcId, + value: valueUpdate, + }); + }, this.updateInterval), + ); this.initializeCounterpart(rpc, { value: base.value }); this.registerDisposer(base.changed.add(this.update)); } @@ -265,26 +287,5 @@ export class SharedProjectionParameters< this.update.flush(); } - private update = this.registerCancellable( - debounce((_oldValue: T, newValue: T) => { - // Note: Because we are using debouce, we cannot rely on `_oldValue`, since - // `DerivedProjectionParameters` reuses the objects. - let valueUpdate: any; - if ( - newValue.displayDimensionRenderInfo !== - this.prevDisplayDimensionRenderInfo - ) { - valueUpdate = newValue; - this.prevDisplayDimensionRenderInfo = - newValue.displayDimensionRenderInfo; - } else { - const { displayDimensionRenderInfo, ...remainder } = newValue; - valueUpdate = remainder; - } - this.rpc!.invoke(PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, { - id: this.rpcId, - value: valueUpdate, - }); - }, this.updateInterval), - ); + private update; } diff --git a/src/segment_color.ts b/src/segment_color.ts index d7d5db0ba5..db966a9f4a 100644 --- a/src/segment_color.ts +++ b/src/segment_color.ts @@ -33,9 +33,11 @@ import { glsl_hsvToRgb, glsl_uint64 } from "#src/webgl/shader_lib.js"; const NUM_COMPONENTS = 2; export class SegmentColorShaderManager { - seedName = this.prefix + "_seed"; + seedName: string; - constructor(public prefix: string) {} + constructor(public prefix: string) { + this.seedName = prefix + "_seed"; + } defineShader(builder: ShaderBuilder) { const { seedName } = this; diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index 943bee7110..d3cf816a47 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -83,7 +83,7 @@ export interface IndexedSegmentPropertyMapOptions { } export class IndexedSegmentPropertySource extends ChunkSource { - OPTIONS: IndexedSegmentPropertyMapOptions; + declare OPTIONS: IndexedSegmentPropertyMapOptions; properties: readonly Readonly[]; constructor( diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index 233f1f69d1..8aa26f86b8 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -400,7 +400,7 @@ export class VertexChunkData { } export class SingleMeshChunk extends Chunk { - source: SingleMeshSource; + declare source: SingleMeshSource; indexBuffer: Buffer; numIndices: number; indices: Uint32Array; @@ -459,51 +459,55 @@ const SharedObjectWithSharedVisibility = withSharedVisibility(SharedObject); class SingleMeshLayerSharedObject extends SharedObjectWithSharedVisibility {} export class SingleMeshLayer extends PerspectiveViewRenderLayer { - private shaderManager = new SingleMeshShaderManager( - pickAttributeNames(this.source.info.vertexAttributes.map((a) => a.name)), - this.source.info.vertexAttributes, - ); + private shaderManager: SingleMeshShaderManager; private shaders = new Map(); private sharedObject = this.registerDisposer( new SingleMeshLayerSharedObject(), ); - private shaderGetter = parameterizedEmitterDependentShaderGetter( - this, - this.gl, - { - memoizeKey: { - t: "single_mesh/RenderLayer", - attributes: this.source.info.vertexAttributes, - }, - fallbackParameters: new WatchableValue( - getFallbackBuilderState(parseShaderUiControls(DEFAULT_FRAGMENT_MAIN)), - ), - parameters: this.displayState.shaderControlState.builderState, - encodeParameters: (p) => p.key, - shaderError: this.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - addControlsToBuilder(shaderBuilderState, builder); - this.shaderManager.defineShader(builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }, - ); - - protected countingBuffer = this.registerDisposer(getCountingBuffer(this.gl)); + private shaderGetter; + protected countingBuffer; constructor( public source: SingleMeshSource, public displayState: SingleMeshDisplayState, public transform: WatchableRenderLayerTransform, ) { super(); + this.shaderManager = new SingleMeshShaderManager( + pickAttributeNames(source.info.vertexAttributes.map((a) => a.name)), + source.info.vertexAttributes, + ); + this.shaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + t: "single_mesh/RenderLayer", + attributes: this.source.info.vertexAttributes, + }, + fallbackParameters: new WatchableValue( + getFallbackBuilderState(parseShaderUiControls(DEFAULT_FRAGMENT_MAIN)), + ), + parameters: this.displayState.shaderControlState.builderState, + encodeParameters: (p) => p.key, + shaderError: this.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + addControlsToBuilder(shaderBuilderState, builder); + this.shaderManager.defineShader(builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); + + this.countingBuffer = this.registerDisposer(getCountingBuffer(this.gl)); + this.registerDisposer( displayState.shaderControlState.parseResult.changed.add( this.redrawNeeded.dispatch, diff --git a/src/skeleton/backend.ts b/src/skeleton/backend.ts index cae8989b4d..f47c1a190e 100644 --- a/src/skeleton/backend.ts +++ b/src/skeleton/backend.ts @@ -120,7 +120,7 @@ export class SkeletonChunk extends Chunk { } export class SkeletonSource extends ChunkSource { - chunks: Map; + declare chunks: Map; getChunk(objectId: Uint64) { const key = getObjectKey(objectId); let chunk = this.chunks.get(key); diff --git a/src/skeleton/frontend.ts b/src/skeleton/frontend.ts index dc84c40b73..2d6dfb4dd3 100644 --- a/src/skeleton/frontend.ts +++ b/src/skeleton/frontend.ts @@ -117,7 +117,7 @@ class RenderHelper extends RefCounted { private textureAccessHelper = new OneDimensionalTextureAccessHelper( "vertexData", ); - private vertexIdHelper = this.registerDisposer(VertexIdHelper.get(this.gl)); + private vertexIdHelper; get vertexAttributes(): VertexAttributeRenderInfo[] { return this.base.vertexAttributes; } @@ -129,29 +129,45 @@ class RenderHelper extends RefCounted { builder.addUniform("highp uint", "uPickID"); } - edgeShaderGetter = parameterizedEmitterDependentShaderGetter(this, this.gl, { - memoizeKey: { - type: "skeleton/SkeletonShaderManager/edge", - vertexAttributes: this.vertexAttributes, - }, - fallbackParameters: this.base.fallbackShaderParameters, - parameters: - this.base.displayState.skeletonRenderingOptions.shaderControlState - .builderState, - shaderError: this.base.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - this.defineCommonShader(builder); - this.defineAttributeAccess(builder); - defineLineShader(builder); - builder.addAttribute("highp uvec2", "aVertexIndex"); - builder.addUniform("highp float", "uLineWidth"); - let vertexMain = ` + edgeShaderGetter; + nodeShaderGetter; + + get gl(): GL { + return this.base.gl; + } + + constructor( + public base: SkeletonLayer, + public targetIsSliceView: boolean, + ) { + super(); + this.vertexIdHelper = this.registerDisposer(VertexIdHelper.get(this.gl)); + this.edgeShaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + type: "skeleton/SkeletonShaderManager/edge", + vertexAttributes: this.vertexAttributes, + }, + fallbackParameters: this.base.fallbackShaderParameters, + parameters: + this.base.displayState.skeletonRenderingOptions.shaderControlState + .builderState, + shaderError: this.base.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + this.defineCommonShader(builder); + this.defineAttributeAccess(builder); + defineLineShader(builder); + builder.addAttribute("highp uvec2", "aVertexIndex"); + builder.addUniform("highp float", "uLineWidth"); + let vertexMain = ` highp vec3 vertexA = readAttribute0(aVertexIndex.x); highp vec3 vertexB = readAttribute0(aVertexIndex.y); emitLine(uProjection, vertexA, vertexB, uLineWidth); @@ -159,7 +175,7 @@ highp uint lineEndpointIndex = getLineEndpointIndex(); highp uint vertexIndex = aVertexIndex.x * lineEndpointIndex + aVertexIndex.y * (1u - lineEndpointIndex); `; - builder.addFragmentCode(` + builder.addFragmentCode(` vec4 segmentColor() { return uColor; } @@ -170,51 +186,58 @@ void emitDefault() { emit(vec4(uColor.rgb, uColor.a * getLineAlpha() * ${this.getCrossSectionFadeFactor()}), uPickID); } `); - builder.addFragmentCode(glsl_COLORMAPS); - const { vertexAttributes } = this; - const numAttributes = vertexAttributes.length; - for (let i = 1; i < numAttributes; ++i) { - const info = vertexAttributes[i]; - builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); - vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; - builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); - } - builder.setVertexMain(vertexMain); - addControlsToBuilder(shaderBuilderState, builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }); - - nodeShaderGetter = parameterizedEmitterDependentShaderGetter(this, this.gl, { - memoizeKey: { - type: "skeleton/SkeletonShaderManager/node", - vertexAttributes: this.vertexAttributes, - }, - fallbackParameters: this.base.fallbackShaderParameters, - parameters: - this.base.displayState.skeletonRenderingOptions.shaderControlState - .builderState, - shaderError: this.base.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - this.defineCommonShader(builder); - this.defineAttributeAccess(builder); - defineCircleShader(builder, /*crossSectionFade=*/ this.targetIsSliceView); - builder.addUniform("highp float", "uNodeDiameter"); - let vertexMain = ` + builder.addFragmentCode(glsl_COLORMAPS); + const { vertexAttributes } = this; + const numAttributes = vertexAttributes.length; + for (let i = 1; i < numAttributes; ++i) { + const info = vertexAttributes[i]; + builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); + vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; + builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); + } + builder.setVertexMain(vertexMain); + addControlsToBuilder(shaderBuilderState, builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); + + this.nodeShaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + type: "skeleton/SkeletonShaderManager/node", + vertexAttributes: this.vertexAttributes, + }, + fallbackParameters: this.base.fallbackShaderParameters, + parameters: + this.base.displayState.skeletonRenderingOptions.shaderControlState + .builderState, + shaderError: this.base.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + this.defineCommonShader(builder); + this.defineAttributeAccess(builder); + defineCircleShader( + builder, + /*crossSectionFade=*/ this.targetIsSliceView, + ); + builder.addUniform("highp float", "uNodeDiameter"); + let vertexMain = ` highp uint vertexIndex = uint(gl_InstanceID); highp vec3 vertexPosition = readAttribute0(vertexIndex); emitCircle(uProjection * vec4(vertexPosition, 1.0), uNodeDiameter, 0.0); `; - builder.addFragmentCode(` + builder.addFragmentCode(` vec4 segmentColor() { return uColor; } @@ -229,32 +252,23 @@ void emitDefault() { emitRGBA(uColor); } `); - builder.addFragmentCode(glsl_COLORMAPS); - const { vertexAttributes } = this; - const numAttributes = vertexAttributes.length; - for (let i = 1; i < numAttributes; ++i) { - const info = vertexAttributes[i]; - builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); - vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; - builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); - } - builder.setVertexMain(vertexMain); - addControlsToBuilder(shaderBuilderState, builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }); - - get gl(): GL { - return this.base.gl; - } - - constructor( - public base: SkeletonLayer, - public targetIsSliceView: boolean, - ) { - super(); + builder.addFragmentCode(glsl_COLORMAPS); + const { vertexAttributes } = this; + const numAttributes = vertexAttributes.length; + for (let i = 1; i < numAttributes; ++i) { + const info = vertexAttributes[i]; + builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); + vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; + builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); + } + builder.setVertexMain(vertexMain); + addControlsToBuilder(shaderBuilderState, builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); } defineAttributeAccess(builder: ShaderBuilder) { @@ -648,13 +662,13 @@ export class SkeletonLayer extends RefCounted { } export class PerspectiveViewSkeletonLayer extends PerspectiveViewRenderLayer { - private renderHelper = this.registerDisposer( - new RenderHelper(this.base, false), - ); - private renderOptions = - this.base.displayState.skeletonRenderingOptions.params3d; + private renderHelper: RenderHelper; + private renderOptions: ViewSpecificSkeletonRenderingOptions; constructor(public base: SkeletonLayer) { super(); + this.renderHelper = this.registerDisposer(new RenderHelper(base, false)); + this.renderOptions = base.displayState.skeletonRenderingOptions.params3d; + this.layerChunkProgressInfo = base.layerChunkProgressInfo; this.registerDisposer(base); this.registerDisposer(base.redrawNeeded.add(this.redrawNeeded.dispatch)); @@ -701,13 +715,12 @@ export class PerspectiveViewSkeletonLayer extends PerspectiveViewRenderLayer { } export class SliceViewPanelSkeletonLayer extends SliceViewPanelRenderLayer { - private renderHelper = this.registerDisposer( - new RenderHelper(this.base, true), - ); - private renderOptions = - this.base.displayState.skeletonRenderingOptions.params2d; + private renderHelper: RenderHelper; + private renderOptions: ViewSpecificSkeletonRenderingOptions; constructor(public base: SkeletonLayer) { super(); + this.renderHelper = this.registerDisposer(new RenderHelper(base, true)); + this.renderOptions = base.displayState.skeletonRenderingOptions.params2d; this.layerChunkProgressInfo = base.layerChunkProgressInfo; this.registerDisposer(base); const { renderOptions } = this; @@ -765,7 +778,7 @@ const vertexPositionAttribute: VertexAttributeRenderInfo = { }; export class SkeletonChunk extends Chunk { - source: SkeletonSource; + declare source: SkeletonSource; vertexAttributes: Uint8Array; indices: Uint32Array; indexBuffer: Buffer; @@ -862,7 +875,7 @@ export class SkeletonSource extends ChunkSource { return attributeTextureFormats; } - chunks: Map; + declare chunks: Map; getChunk(x: any) { return new SkeletonChunk(this, x); } diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index 0002dc2f00..d85be5105c 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -388,7 +388,7 @@ export class SliceViewChunkSourceBackend< implements SliceViewChunkSourceInterface { spec: Spec; - chunks: Map; + declare chunks: Map; constructor(rpc: RPC, options: any) { super(rpc, options); this.spec = options.spec; @@ -411,7 +411,7 @@ export class SliceViewRenderLayerBackend extends SharedObjectCounterpart implements SliceViewRenderLayerInterface, ChunkRenderLayerBackend { - rpcId: number; + declare rpcId: number; renderScaleTarget: SharedWatchableValue; localPosition: WatchableValueInterface; diff --git a/src/sliceview/compressed_segmentation/chunk_format.ts b/src/sliceview/compressed_segmentation/chunk_format.ts index d8e86f39ba..74ea6e518d 100644 --- a/src/sliceview/compressed_segmentation/chunk_format.ts +++ b/src/sliceview/compressed_segmentation/chunk_format.ts @@ -300,7 +300,7 @@ export class CompressedSegmentationVolumeChunk extends SingleTextureVolumeChunk< Uint32Array, TextureLayout > { - CHUNK_FORMAT_TYPE: ChunkFormat; + declare CHUNK_FORMAT_TYPE: ChunkFormat; setTextureData(gl: GL) { const { data } = this; diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index ce18e9efd3..e61dd0ab01 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -157,10 +157,10 @@ function disposeTransformedSources( @registerSharedObjectOwner(SLICEVIEW_RPC_ID) export class SliceView extends Base { - gl = this.chunkManager.gl; + gl: GL; viewChanged = new NullarySignal(); - rpc: RPC; - rpcId: number; + declare rpc: RPC; + declare rpcId: number; renderingStale = true; @@ -168,22 +168,17 @@ export class SliceView extends Base { visibleLayerList = new Array(); - visibleLayers: Map; + declare visibleLayers: Map; - offscreenFramebuffer = this.registerDisposer( - new FramebufferConfiguration(this.gl, { - colorBuffers: makeTextureBuffers(this.gl, 1), - depthBuffer: new DepthTextureBuffer(this.gl), - }), - ); + offscreenFramebuffer; histogramInputTextures: TextureBuffer[] = []; - offscreenFramebuffersWithHistograms = [this.offscreenFramebuffer]; + offscreenFramebuffersWithHistograms; get displayDimensionRenderInfo() { return this.navigationState.displayDimensionRenderInfo; } - private histogramGenerator = TextureHistogramGenerator.get(this.gl); + private histogramGenerator: TextureHistogramGenerator; computeHistograms( count: number, @@ -198,7 +193,7 @@ export class SliceView extends Base { ); } - projectionParameters: Owned< + declare projectionParameters: Owned< DerivedProjectionParameters >; @@ -274,6 +269,17 @@ export class SliceView extends Base { }, }), ); + this.gl = chunkManager.gl; + + this.offscreenFramebuffer = this.registerDisposer( + new FramebufferConfiguration(this.gl, { + colorBuffers: makeTextureBuffers(this.gl, 1), + depthBuffer: new DepthTextureBuffer(this.gl), + }), + ); + this.offscreenFramebuffersWithHistograms = [this.offscreenFramebuffer]; + this.histogramGenerator = TextureHistogramGenerator.get(this.gl); + this.registerDisposer(navigationState); this.registerDisposer(this.projectionParameters); this.registerDisposer( @@ -603,9 +609,9 @@ export abstract class SliceViewChunkSource< extends ChunkSource implements SliceViewChunkSourceInterface { - chunks: Map; + declare chunks: Map; - OPTIONS: SliceViewChunkSourceOptions; + declare OPTIONS: SliceViewChunkSourceOptions; spec: Spec; @@ -699,7 +705,7 @@ export interface SliceViewChunkSource { export class SliceViewChunk extends Chunk { chunkGridPosition: vec3; - source: SliceViewChunkSource; + declare source: SliceViewChunkSource; constructor(source: SliceViewChunkSource, x: any) { super(source); @@ -712,7 +718,7 @@ export class SliceViewChunk extends Chunk { * Helper for rendering a SliceView that has been pre-rendered to a texture. */ export class SliceViewRenderHelper extends RefCounted { - private copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); + private copyVertexPositionsBuffer; private shader: ShaderProgram; private textureCoordinateAdjustment = new Float32Array(4); @@ -722,6 +728,8 @@ export class SliceViewRenderHelper extends RefCounted { emitter: ShaderModule, ) { super(); + this.copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); + const builder = new ShaderBuilder(gl); builder.addVarying("vec2", "vTexCoord"); builder.addUniform("sampler2D", "uSampler"); diff --git a/src/sliceview/panel.ts b/src/sliceview/panel.ts index 172ee6f253..d92c94df94 100644 --- a/src/sliceview/panel.ts +++ b/src/sliceview/panel.ts @@ -100,7 +100,7 @@ const tempVec3b = vec3.create(); const tempVec4 = vec4.create(); export class SliceViewPanel extends RenderedDataPanel { - viewer: SliceViewerState; + declare viewer: SliceViewerState; private axesLineHelper = this.registerDisposer(AxesLineHelper.get(this.gl)); private sliceViewRenderHelper = this.registerDisposer( diff --git a/src/sliceview/renderlayer.ts b/src/sliceview/renderlayer.ts index ad52ba48c1..61c4b2aa57 100644 --- a/src/sliceview/renderlayer.ts +++ b/src/sliceview/renderlayer.ts @@ -52,7 +52,7 @@ import { constantWatchableValue } from "#src/trackable_value.js"; import type { Borrowed } from "#src/util/disposable.js"; import { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import type { ShaderModule } from "#src/webgl/shader.js"; -import type { RpcId, SharedObject } from "#src/worker_rpc.js"; +import type { RpcId } from "#src/worker_rpc.js"; export interface SliceViewRenderLayerOptions { /** @@ -202,7 +202,7 @@ export abstract class SliceViewRenderLayer< ); } - RPC_TYPE_ID: string; + declare RPC_TYPE_ID: string; initializeCounterpart() { const sharedObject = this.registerDisposer( @@ -292,6 +292,4 @@ export class SliceViewPanelRenderLayer< attachment; return true; } - - backend: SharedObject | undefined; } diff --git a/src/sliceview/single_texture_chunk_format.ts b/src/sliceview/single_texture_chunk_format.ts index 4fe03f2737..53468aedfd 100644 --- a/src/sliceview/single_texture_chunk_format.ts +++ b/src/sliceview/single_texture_chunk_format.ts @@ -126,7 +126,7 @@ export abstract class SingleTextureVolumeChunk< texture: WebGLTexture | null = null; data: Data | null; textureLayout: TextureLayout | null; - CHUNK_FORMAT_TYPE: SingleTextureChunkFormat; + declare CHUNK_FORMAT_TYPE: SingleTextureChunkFormat; constructor(source: VolumeChunkSource, x: any) { super(source, x); diff --git a/src/sliceview/uncompressed_chunk_format.ts b/src/sliceview/uncompressed_chunk_format.ts index 440e6c28df..910269198e 100644 --- a/src/sliceview/uncompressed_chunk_format.ts +++ b/src/sliceview/uncompressed_chunk_format.ts @@ -51,7 +51,7 @@ import { class TextureLayout extends RefCounted { strides: Uint32Array; - textureShape = new Uint32Array(this.textureDims); + textureShape: Uint32Array; constructor( gl: GL, public chunkDataSize: Uint32Array, @@ -68,7 +68,9 @@ class TextureLayout extends RefCounted { textureDims === 3 ? gl.max3dTextureSize : gl.maxTextureSize; let textureDim = 0; let textureDimSize = 1; - const { textureShape } = this; + const textureShape = (this.textureShape = new Uint32Array( + this.textureDims, + )); textureShape.fill(1); for (let chunkDim = 0; chunkDim < rank; ++chunkDim) { const size = chunkDataSize[chunkDim]; @@ -284,8 +286,8 @@ export class UncompressedVolumeChunk extends SingleTextureVolumeChunk< Uint8Array, TextureLayout > { - CHUNK_FORMAT_TYPE: ChunkFormat; - source: Source; + declare CHUNK_FORMAT_TYPE: ChunkFormat; + declare source: Source; setTextureData(gl: GL) { const { source } = this; diff --git a/src/sliceview/volume/backend.ts b/src/sliceview/volume/backend.ts index 5fe4b79d01..4c7c39b8de 100644 --- a/src/sliceview/volume/backend.ts +++ b/src/sliceview/volume/backend.ts @@ -142,7 +142,7 @@ export class VolumeChunkSource extends SliceViewChunkSourceBackend implements VolumeChunkSourceInterface { - spec: VolumeChunkSpecification; + declare spec: VolumeChunkSpecification; tempChunkDataSize: Uint32Array; tempChunkPosition: Float32Array; constructor(rpc: RPC, options: any) { diff --git a/src/sliceview/volume/frontend.ts b/src/sliceview/volume/frontend.ts index dea825db88..a373b5644a 100644 --- a/src/sliceview/volume/frontend.ts +++ b/src/sliceview/volume/frontend.ts @@ -268,9 +268,9 @@ export class VolumeChunkSource } export abstract class VolumeChunk extends SliceViewChunk { - source: VolumeChunkSource; + declare source: VolumeChunkSource; chunkDataSize: Uint32Array; - CHUNK_FORMAT_TYPE: ChunkFormat; + declare CHUNK_FORMAT_TYPE: ChunkFormat; get chunkFormat(): this["CHUNK_FORMAT_TYPE"] { return this.source.chunkFormat; diff --git a/src/sliceview/volume/renderlayer.ts b/src/sliceview/volume/renderlayer.ts index a01325eb1a..178719f264 100644 --- a/src/sliceview/volume/renderlayer.ts +++ b/src/sliceview/volume/renderlayer.ts @@ -333,7 +333,7 @@ interface ShaderContext { export abstract class SliceViewVolumeRenderLayer< ShaderParameters = any, > extends SliceViewRenderLayer { - multiscaleSource: MultiscaleVolumeChunkSource; + declare multiscaleSource: MultiscaleVolumeChunkSource; protected shaderGetter: ParameterizedContextDependentShaderGetter< { chunkFormat: ChunkFormat | null; dataHistogramsEnabled: boolean }, ShaderParameters, diff --git a/src/sliceview/volume/segmentation_renderlayer.ts b/src/sliceview/volume/segmentation_renderlayer.ts index df09948c83..d2da8376fe 100644 --- a/src/sliceview/volume/segmentation_renderlayer.ts +++ b/src/sliceview/volume/segmentation_renderlayer.ts @@ -25,7 +25,10 @@ import { SegmentStatedColorShaderManager, } from "#src/segment_color.js"; import { getVisibleSegments } from "#src/segmentation_display_state/base.js"; -import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; +import type { + SegmentationDisplayState, + SegmentationGroupState, +} from "#src/segmentation_display_state/frontend.js"; import { registerRedrawWhenSegmentationDisplayStateChanged } from "#src/segmentation_display_state/frontend.js"; import type { SliceViewSourceOptions } from "#src/sliceview/base.js"; import type { @@ -88,8 +91,7 @@ const HAS_SELECTED_SEGMENT_FLAG = 1; const SHOW_ALL_SEGMENTS_FLAG = 2; export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer { - public readonly segmentationGroupState = - this.displayState.segmentationGroupState.value; + public readonly segmentationGroupState: SegmentationGroupState; protected segmentColorShaderManager = new SegmentColorShaderManager( "segmentColorHash", ); @@ -99,29 +101,13 @@ export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer | undefined; private hashTableManager = new HashSetShaderManager("visibleSegments"); - private gpuHashTable = this.registerDisposer( - GPUHashTable.get( - this.gl, - this.segmentationGroupState.visibleSegments.hashTable, - ), - ); - private gpuTemporaryHashTable = GPUHashTable.get( - this.gl, - this.segmentationGroupState.temporaryVisibleSegments.hashTable, - ); + private gpuHashTable; + private gpuTemporaryHashTable; private equivalencesShaderManager = new HashMapShaderManager("equivalences"); - private equivalencesHashMap = new EquivalencesHashMap( - this.segmentationGroupState.segmentEquivalences.disjointSets, - ); - private temporaryEquivalencesHashMap = new EquivalencesHashMap( - this.segmentationGroupState.temporarySegmentEquivalences.disjointSets, - ); - private gpuEquivalencesHashTable = this.registerDisposer( - GPUHashTable.get(this.gl, this.equivalencesHashMap.hashMap), - ); - private gpuTemporaryEquivalencesHashTable = this.registerDisposer( - GPUHashTable.get(this.gl, this.temporaryEquivalencesHashMap.hashMap), - ); + private equivalencesHashMap; + private temporaryEquivalencesHashMap; + private gpuEquivalencesHashTable; + private gpuTemporaryEquivalencesHashTable; constructor( multiscaleSource: MultiscaleVolumeChunkSource, @@ -183,6 +169,30 @@ export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer, ); diff --git a/src/trackable_boolean.ts b/src/trackable_boolean.ts index 2fd2653b49..c6bd7aefa2 100644 --- a/src/trackable_boolean.ts +++ b/src/trackable_boolean.ts @@ -109,12 +109,13 @@ export class TrackableBooleanCheckbox extends RefCounted { } export class ElementVisibilityFromTrackableBoolean extends RefCounted { - private initialDisplay = this.element.style.display; + private initialDisplay: string; constructor( public model: WatchableValueInterface, public element: HTMLElement, ) { super(); + this.initialDisplay = this.element.style.display; this.updateVisibility(); this.registerDisposer( model.changed.add( diff --git a/src/ui/annotations.ts b/src/ui/annotations.ts index c799c90be6..051b9a4e12 100644 --- a/src/ui/annotations.ts +++ b/src/ui/annotations.ts @@ -382,6 +382,29 @@ export class AnnotationLayerView extends Tab { ) { super(); this.element.classList.add("neuroglancer-annotation-layer-view"); + this.selectedAnnotationState = makeCachedLazyDerivedWatchableValue( + (selectionState, pin) => { + if (selectionState === undefined) return undefined; + const { layer } = this; + const layerSelectionState = selectionState.layers.find( + (s) => s.layer === layer, + )?.state; + if (layerSelectionState === undefined) return undefined; + const { annotationId } = layerSelectionState; + if (annotationId === undefined) return undefined; + const annotationLayerState = this.annotationStates.states.find( + (x) => + x.sourceIndex === layerSelectionState.annotationSourceIndex && + (layerSelectionState.annotationSubsource === undefined || + x.subsourceId === layerSelectionState.annotationSubsource), + ); + if (annotationLayerState === undefined) return undefined; + return { annotationId, annotationLayerState, pin }; + }, + layer.manager.root.selectionState, + layer.manager.root.selectionState.pin, + ); + this.registerDisposer(this.visibility.changed.add(() => this.updateView())); this.registerDisposer( this.annotationStates.changed.add(() => @@ -530,28 +553,7 @@ export class AnnotationLayerView extends Tab { } } - private selectedAnnotationState = makeCachedLazyDerivedWatchableValue( - (selectionState, pin) => { - if (selectionState === undefined) return undefined; - const { layer } = this; - const layerSelectionState = selectionState.layers.find( - (s) => s.layer === layer, - )?.state; - if (layerSelectionState === undefined) return undefined; - const { annotationId } = layerSelectionState; - if (annotationId === undefined) return undefined; - const annotationLayerState = this.annotationStates.states.find( - (x) => - x.sourceIndex === layerSelectionState.annotationSourceIndex && - (layerSelectionState.annotationSubsource === undefined || - x.subsourceId === layerSelectionState.annotationSubsource), - ); - if (annotationLayerState === undefined) return undefined; - return { annotationId, annotationLayerState, pin }; - }, - this.layer.manager.root.selectionState, - this.layer.manager.root.selectionState.pin, - ); + private selectedAnnotationState; private updateSelectionView() { const selectionState = this.selectedAnnotationState.value; @@ -967,11 +969,13 @@ export class AnnotationLayerView extends Tab { } export class AnnotationTab extends Tab { - private layerView = this.registerDisposer( - new AnnotationLayerView(this.layer, this.layer.annotationDisplayState), - ); + private layerView: AnnotationLayerView; constructor(public layer: Borrowed) { super(); + this.layerView = this.registerDisposer( + new AnnotationLayerView(layer, layer.annotationDisplayState), + ); + const { element } = this; element.classList.add("neuroglancer-annotations-tab"); element.appendChild(this.layerView.element); @@ -1008,7 +1012,7 @@ function getSelectedAssociatedSegments( } abstract class PlaceAnnotationTool extends LegacyTool { - layer: UserLayerWithAnnotations; + declare layer: UserLayerWithAnnotations; constructor(layer: UserLayerWithAnnotations, options: any) { super(layer); options; @@ -1180,7 +1184,7 @@ abstract class TwoStepAnnotationTool extends PlaceAnnotationTool { } abstract class PlaceTwoCornerAnnotationTool extends TwoStepAnnotationTool { - annotationType: + declare annotationType: | AnnotationType.LINE | AnnotationType.AXIS_ALIGNED_BOUNDING_BOX; diff --git a/src/ui/layer_bar.ts b/src/ui/layer_bar.ts index cb6eadeea7..711a77e400 100644 --- a/src/ui/layer_bar.ts +++ b/src/ui/layer_bar.ts @@ -183,16 +183,8 @@ export class LayerBar extends RefCounted { private valueUpdateNeeded = false; dropZone: HTMLDivElement; private layerWidgetInsertionPoint = document.createElement("div"); - private positionWidget = this.registerDisposer( - new PositionWidget( - this.viewerNavigationState.position.value, - this.manager.root.coordinateSpaceCombiner, - { - velocity: this.viewerNavigationState.velocity.velocity, - getToolBinder: () => this.layerGroupViewer.toolBinder, - }, - ), - ); + private positionWidget: PositionWidget; + /** * For use within this module only. */ @@ -226,6 +218,17 @@ export class LayerBar extends RefCounted { public showLayerHoverValues: WatchableValueInterface, ) { super(); + this.positionWidget = this.registerDisposer( + new PositionWidget( + this.viewerNavigationState.position.value, + this.manager.root.coordinateSpaceCombiner, + { + velocity: this.viewerNavigationState.velocity.velocity, + getToolBinder: () => this.layerGroupViewer.toolBinder, + }, + ), + ); + const { element, manager, selectedLayer } = this; element.className = "neuroglancer-layer-panel"; this.registerDisposer( diff --git a/src/ui/layer_side_panel_state.ts b/src/ui/layer_side_panel_state.ts index 1f60e08ae9..79b8c591c3 100644 --- a/src/ui/layer_side_panel_state.ts +++ b/src/ui/layer_side_panel_state.ts @@ -47,10 +47,11 @@ export const LAYER_SIDE_PANEL_DEFAULT_LOCATION = { }; export class UserLayerSidePanelState extends RefCounted { - layer = this.panels.layer; + layer: UserLayer; location = new TrackableSidePanelLocation(LAYER_SIDE_PANEL_DEFAULT_LOCATION); constructor(public panels: UserLayerSidePanelsState) { super(); + this.layer = this.panels.layer; } initialize() { diff --git a/src/ui/segment_list.ts b/src/ui/segment_list.ts index ccadae84a4..6ae8db3592 100644 --- a/src/ui/segment_list.ts +++ b/src/ui/segment_list.ts @@ -107,7 +107,6 @@ abstract class SegmentListSource // explicit uint64 ids, and the `matches`, list, specifying the indices into the // `segmentPropertyMap` of the matching segments. explicitSegments: Uint64[] | undefined; - explicitSegmentsVisible = false; debouncedUpdate = debounce(() => this.update(), 0); @@ -136,8 +135,6 @@ abstract class SegmentListSource } class StarredSegmentsListSource extends SegmentListSource { - explicitSegmentsVisible: true; - constructor( public segmentationDisplayState: SegmentationDisplayState, public parentElement: HTMLElement, @@ -194,7 +191,6 @@ class SegmentQueryListSource extends SegmentListSource { matchStatusTextPrefix = ""; selectedSegmentsGeneration = -1; visibleSegmentsGeneration = -1; - explicitSegmentsVisible = false; get numMatches() { return this.queryResult.value?.count ?? 0; @@ -218,7 +214,7 @@ class SegmentQueryListSource extends SegmentListSource { let matchStatusTextPrefix = ""; const unconstrained = isQueryUnconstrained(queryResult.query); if (!unconstrained) { - if (this.explicitSegments !== undefined && this.explicitSegmentsVisible) { + if (this.explicitSegments !== undefined) { splices.push({ deleteCount: this.explicitSegments.length, retainCount: 0, @@ -232,7 +228,7 @@ class SegmentQueryListSource extends SegmentListSource { const { explicitIds } = queryResult; if (explicitIds !== undefined) { this.explicitSegments = explicitIds; - } else if (!this.explicitSegmentsVisible) { + } else { this.explicitSegments = undefined; } diff --git a/src/ui/segmentation_display_options_tab.ts b/src/ui/segmentation_display_options_tab.ts index a37b4339a7..b145d4a398 100644 --- a/src/ui/segmentation_display_options_tab.ts +++ b/src/ui/segmentation_display_options_tab.ts @@ -123,9 +123,12 @@ export class DisplayOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeSkeletonShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: SegmentationUserLayer) { super(); + this.codeWidget = this.registerDisposer( + makeSkeletonShaderCodeWidget(layer), + ); this.content.classList.add( "neuroglancer-segmentation-layer-skeleton-shader-overlay", ); diff --git a/src/ui/tool.ts b/src/ui/tool.ts index c422e430ff..9f34b700f1 100644 --- a/src/ui/tool.ts +++ b/src/ui/tool.ts @@ -493,12 +493,13 @@ export class LocalToolBinder< export class ToolBindingWidget extends RefCounted { element = document.createElement("div"); - private toolJsonString = JSON.stringify(this.toolJson); + private toolJsonString: string; constructor( public localBinder: LocalToolBinder, public toolJson: any, ) { super(); + this.toolJsonString = JSON.stringify(toolJson); const { element } = this; element.classList.add("neuroglancer-tool-key-binding"); this.registerDisposer( diff --git a/src/webgl/empirical_cdf.ts b/src/webgl/empirical_cdf.ts index 71c35148ed..ebd5ffac08 100644 --- a/src/webgl/empirical_cdf.ts +++ b/src/webgl/empirical_cdf.ts @@ -105,24 +105,30 @@ const histogramSamples = 2 ** 14; * Generates a histogram from a single-channel uint8 texture. */ export class TextureHistogramGenerator extends RefCounted { - private shader = this.registerDisposer( - (() => { - const builder = new ShaderBuilder(this.gl); - builder.addOutputBuffer("vec4", "outputValue", 0); - builder.addAttribute("float", "aInput1"); - builder.addTextureSampler( - "sampler2D", - "uDataSampler", - histogramDataSamplerTextureUnit, - ); - builder.addTextureSampler( - "sampler2D", - "uDepthSampler", - histogramDepthTextureUnit, - ); - // builder.addUniform('float', 'uRandomSeed'); - builder.addVertexCode(glsl_simpleFloatHash); - builder.setVertexMain(` + private shader; + private inputIndexBuffer; + + constructor(public gl: GL) { + super(); + + this.shader = this.registerDisposer( + (() => { + const builder = new ShaderBuilder(this.gl); + builder.addOutputBuffer("vec4", "outputValue", 0); + builder.addAttribute("float", "aInput1"); + builder.addTextureSampler( + "sampler2D", + "uDataSampler", + histogramDataSamplerTextureUnit, + ); + builder.addTextureSampler( + "sampler2D", + "uDepthSampler", + histogramDepthTextureUnit, + ); + // builder.addUniform('float', 'uRandomSeed'); + builder.addVertexCode(glsl_simpleFloatHash); + builder.setVertexMain(` float uRandomSeed = 0.0; vec2 p = vec2(simpleFloatHash(vec2(aInput1 + float(gl_VertexID), uRandomSeed + float(gl_InstanceID))), simpleFloatHash(vec2(aInput1 + float(gl_VertexID) + 10.0, 5.0 + uRandomSeed + float(gl_InstanceID)))); @@ -135,23 +141,20 @@ if (stencilValue == 1.0) { } gl_PointSize = 1.0; `); - builder.setFragmentMain(` + builder.setFragmentMain(` outputValue = vec4(1.0, 1.0, 1.0, 1.0); `); - return builder.build(); - })(), - ); - - private inputIndexBuffer = this.registerDisposer( - getMemoizedBuffer( - this.gl, - WebGL2RenderingContext.ARRAY_BUFFER, - () => new Uint8Array(histogramSamplesPerInstance), - ), - ); + return builder.build(); + })(), + ); - constructor(public gl: GL) { - super(); + this.inputIndexBuffer = this.registerDisposer( + getMemoizedBuffer( + this.gl, + WebGL2RenderingContext.ARRAY_BUFFER, + () => new Uint8Array(histogramSamplesPerInstance), + ), + ); } static get(gl: GL) { diff --git a/src/webgl/offscreen.ts b/src/webgl/offscreen.ts index 12754a55c2..0a9e3f2bd1 100644 --- a/src/webgl/offscreen.ts +++ b/src/webgl/offscreen.ts @@ -110,9 +110,10 @@ export class DepthStencilRenderbuffer extends DepthRenderbuffer { export const StencilRenderbuffer = DepthStencilRenderbuffer; export class Framebuffer extends RefCounted { - framebuffer = this.gl.createFramebuffer(); + framebuffer; constructor(public gl: GL) { super(); + this.framebuffer = gl.createFramebuffer(); } disposed() { const { gl } = this; @@ -219,7 +220,7 @@ export class FramebufferConfiguration< depthBuffer: DepthBuffer | undefined; fullAttachmentList = new Array(); private attachmentVerified = false; - singleAttachmentList = [this.gl.COLOR_ATTACHMENT0]; + singleAttachmentList = [WebGL2RenderingContext.COLOR_ATTACHMENT0]; constructor( public gl: GL, @@ -352,9 +353,11 @@ export class OffscreenCopyHelper extends RefCounted { ) { super(); this.registerDisposer(shader); + this.copyVertexPositionsBuffer = getSquareCornersBuffer(gl); + this.copyTexCoordsBuffer = getSquareCornersBuffer(gl, 0, 0, 1, 1); } - private copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); - private copyTexCoordsBuffer = getSquareCornersBuffer(this.gl, 0, 0, 1, 1); + private copyVertexPositionsBuffer; + private copyTexCoordsBuffer; draw(...textures: (WebGLTexture | null)[]) { const { gl, shader } = this; diff --git a/src/webgl/shader.ts b/src/webgl/shader.ts index f87187c46b..ed2f4220db 100644 --- a/src/webgl/shader.ts +++ b/src/webgl/shader.ts @@ -186,12 +186,12 @@ export class ShaderProgram extends RefCounted { const vertexShader = (this.vertexShader = getShader( gl, vertexSource, - gl.VERTEX_SHADER, + WebGL2RenderingContext.VERTEX_SHADER, )); const fragmentShader = (this.fragmentShader = getShader( gl, fragmentSource, - gl.FRAGMENT_SHADER, + WebGL2RenderingContext.FRAGMENT_SHADER, )); const shaderProgram = gl.createProgram()!; diff --git a/src/webgl/shader_testing.ts b/src/webgl/shader_testing.ts index b65104a0cb..407f3b8cd7 100644 --- a/src/webgl/shader_testing.ts +++ b/src/webgl/shader_testing.ts @@ -117,10 +117,10 @@ export class FragmentShaderTester< Inputs extends FragmentShaderTestOutputs, Outputs extends FragmentShaderTestOutputs, > extends RefCounted { - builder = new ShaderBuilder(this.gl); + builder: ShaderBuilder; private shader_: ShaderProgram; offscreenFramebuffer: FramebufferConfiguration; - private vertexPositionsBuffer = getSquareCornersBuffer(this.gl, -1, -1, 1, 1); + private vertexPositionsBuffer; constructor( public gl: GL, @@ -128,8 +128,10 @@ export class FragmentShaderTester< public outputs: Outputs, ) { super(); - const { builder } = this; - this.offscreenFramebuffer = new FramebufferConfiguration(this.gl, { + const builder = (this.builder = new ShaderBuilder(gl)); + this.vertexPositionsBuffer = getSquareCornersBuffer(gl, -1, -1, 1, 1); + + this.offscreenFramebuffer = new FramebufferConfiguration(gl, { colorBuffers: makeTextureBuffersForOutputs(gl, outputs), }); builder.addAttribute("vec4", "shader_testing_aVertexPosition"); diff --git a/src/webgl/texture_access.ts b/src/webgl/texture_access.ts index 82e225e999..a06061ef3f 100644 --- a/src/webgl/texture_access.ts +++ b/src/webgl/texture_access.ts @@ -495,8 +495,10 @@ ${shaderType} ${functionName}(${indexType} index) { } export class OneDimensionalTextureAccessHelper { - readTextureValue = `readTextureValue_${this.key}`; - constructor(public key: string) {} + readTextureValue: string; + constructor(public key: string) { + this.readTextureValue = `readTextureValue_${key}`; + } defineShader(builder: ShaderBuilder) { builder; } @@ -549,11 +551,13 @@ void ${this.readTextureValue}(highp ${samplerPrefix}sampler2D sampler, highp uin } export class TextureAccessHelper { - readTextureValue = `readTextureValue_${this.key}`; + readTextureValue: string; constructor( public key: string, public textureDims: number, - ) {} + ) { + this.readTextureValue = `readTextureValue_${key}`; + } getReadTextureValueCode( texelsPerElement: number, samplerPrefix: ShaderSamplerPrefix, diff --git a/src/widget/channel_dimensions_widget.ts b/src/widget/channel_dimensions_widget.ts index 701f0b6a98..55ec155634 100644 --- a/src/widget/channel_dimensions_widget.ts +++ b/src/widget/channel_dimensions_widget.ts @@ -25,6 +25,7 @@ import { getDisplayLowerUpperBounds, insertDimensionAt, } from "#src/coordinate_transform.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import { arraysEqual } from "#src/util/array.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -97,10 +98,11 @@ export class ChannelDimensionsWidget extends RefCounted { ); } - coordinateSpace = this.combiner.combined; + coordinateSpace: WatchableValueInterface; constructor(public combiner: CoordinateSpaceCombiner) { super(); + this.coordinateSpace = combiner.combined; const { element } = this; element.classList.add("neuroglancer-channel-dimensions-widget"); const debouncedUpdateView = this.registerCancellable( diff --git a/src/widget/invlerp.ts b/src/widget/invlerp.ts index 2543f49cfa..b56381eddc 100644 --- a/src/widget/invlerp.ts +++ b/src/widget/invlerp.ts @@ -347,20 +347,21 @@ class CdfPanel extends IndirectRenderedPanel { get drawOrder() { return 100; } - controller = this.registerDisposer( - new CdfController( - this.element, - this.parent.dataType, - () => this.parent.trackable.value, - (value: InvlerpParameters) => { - this.parent.trackable.value = value; - }, - ), - ); + controller; constructor(public parent: InvlerpWidget) { super(parent.display, document.createElement("div"), parent.visibility); const { element } = this; element.classList.add("neuroglancer-invlerp-cdfpanel"); + this.controller = this.registerDisposer( + new CdfController( + element, + parent.dataType, + () => parent.trackable.value, + (value: InvlerpParameters) => { + parent.trackable.value = value; + }, + ), + ); } private dataValuesBuffer = this.registerDisposer( @@ -730,10 +731,7 @@ export function adjustInvlerpBrightnessContrast( export class InvlerpWidget extends Tab { cdfPanel = this.registerDisposer(new CdfPanel(this)); - boundElements = { - range: createRangeBoundInputs("range", this.dataType, this.trackable), - window: createRangeBoundInputs("window", this.dataType, this.trackable), - }; + boundElements; invertArrows: HTMLElement[]; autoRangeFinder: AutoRangeFinder; get texture() { @@ -754,6 +752,11 @@ export class InvlerpWidget extends Tab { public legendShaderOptions: LegendShaderOptions | undefined, ) { super(visibility); + this.boundElements = { + range: createRangeBoundInputs("range", dataType, trackable), + window: createRangeBoundInputs("window", dataType, trackable), + }; + this.registerDisposer( histogramSpecifications.visibility.add(this.visibility), ); diff --git a/src/widget/position_plot.ts b/src/widget/position_plot.ts index 0138de285f..95e339d87d 100644 --- a/src/widget/position_plot.ts +++ b/src/widget/position_plot.ts @@ -98,9 +98,9 @@ export class PositionPlot extends RefCounted { visible = true; dragging = new WatchableValue(false); - tickWidth: number = this.orientation === "column" ? 10 : 5; - barWidth: number = this.orientation === "column" ? 15 : 10; - barRightMargin: number = this.orientation === "column" ? 10 : 2; + tickWidth: number; + barWidth: number; + barRightMargin: number; canvasWidth: number; constructor( @@ -109,6 +109,10 @@ export class PositionPlot extends RefCounted { public orientation: "row" | "column" = "column", ) { super(); + this.tickWidth = orientation === "column" ? 10 : 5; + this.barWidth = orientation === "column" ? 15 : 10; + this.barRightMargin = orientation === "column" ? 10 : 2; + this.canvasWidth = this.tickWidth + this.barWidth + this.barRightMargin; const plotElement = this.element; plotElement.classList.add("neuroglancer-position-dimension-plot"); diff --git a/src/widget/scale_bar.ts b/src/widget/scale_bar.ts index 4d6c8198e7..099014bf7c 100644 --- a/src/widget/scale_bar.ts +++ b/src/widget/scale_bar.ts @@ -273,13 +273,15 @@ export class ScaleBarTexture extends RefCounted { } export class MultipleScaleBarTextures extends RefCounted { - private scaleBarCopyHelper = this.registerDisposer( - OffscreenCopyHelper.get(this.gl), - ); + private scaleBarCopyHelper: OffscreenCopyHelper; private scaleBars: ScaleBarTexture[] = []; constructor(public gl: GL) { super(); + this.scaleBarCopyHelper = this.registerDisposer( + OffscreenCopyHelper.get(this.gl), + ); + for (let i = 0; i < 3; ++i) { this.scaleBars.push(this.registerDisposer(new ScaleBarTexture(gl))); } diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index cfb53e3bd9..8d016f5d05 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -51,8 +51,7 @@ import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Uint64 } from "#src/util/uint64.js"; import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import type { Buffer } from "#src/webgl/buffer.js"; -import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import { Buffer , getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { @@ -594,7 +593,7 @@ abstract class BaseLookupTexture extends RefCounted { */ class DirectLookupTableTexture extends BaseLookupTexture { texture: WebGLTexture | null = null; - protected priorOptions: LookupTableTextureOptions | undefined = undefined; + protected declare priorOptions: LookupTableTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); @@ -623,7 +622,7 @@ class DirectLookupTableTexture extends BaseLookupTexture { } export class ControlPointTexture extends BaseLookupTexture { - protected priorOptions: ControlPointTextureOptions | undefined; + protected declare priorOptions: ControlPointTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); } @@ -666,6 +665,20 @@ export class ControlPointTexture extends BaseLookupTexture { } } +function getDataValuesArray() { + const array = new Uint8Array(NUM_CDF_LINES * VERTICES_PER_LINE); + for (let i = 0; i < NUM_CDF_LINES; ++i) { + for (let j = 0; j < VERTICES_PER_LINE; ++j) { + array[i * VERTICES_PER_LINE + j] = i; + } + } + return array; +} + +function getTextureVertexBufferArray() { + return createGriddedRectangleArray(TRANSFER_FUNCTION_PANEL_SIZE); +} + /** * Display the UI canvas for the transfer function widget and * handle shader updates for elements of the canvas @@ -673,7 +686,6 @@ export class ControlPointTexture extends BaseLookupTexture { class TransferFunctionPanel extends IndirectRenderedPanel { texture: DirectLookupTableTexture; private textureVertexBuffer: Buffer; - private textureVertexBufferArray: Float32Array; private controlPointsVertexBuffer: Buffer; private controlPointsPositionArray = new Float32Array(); private controlPointsColorBuffer: Buffer; @@ -683,63 +695,58 @@ class TransferFunctionPanel extends IndirectRenderedPanel { get drawOrder() { return 1; } - transferFunction = this.registerDisposer( - new TransferFunction( - this.parent.dataType, - this.parent.trackable, - TRANSFER_FUNCTION_PANEL_SIZE, - ), - ); - controller = this.registerDisposer( - new TransferFunctionController( - this.element, - this.parent.dataType, - this.transferFunction, - () => this.parent.trackable.value, - (value: TransferFunctionParameters) => { - this.parent.trackable.value = value; - }, - ), - ); - private dataValuesBuffer = this.registerDisposer( - getMemoizedBuffer(this.gl, WebGL2RenderingContext.ARRAY_BUFFER, () => { - const array = new Uint8Array(NUM_CDF_LINES * VERTICES_PER_LINE); - for (let i = 0; i < NUM_CDF_LINES; ++i) { - for (let j = 0; j < VERTICES_PER_LINE; ++j) { - array[i * VERTICES_PER_LINE + j] = i; - } - } - return array; - }), - ).value; + transferFunction: TransferFunction; + controller: TransferFunctionController; + private dataValuesBuffer; constructor(public parent: TransferFunctionWidget) { super(parent.display, document.createElement("div"), parent.visibility); const { element, gl } = this; - element.classList.add("neuroglancer-transfer-function-panel"); - this.textureVertexBufferArray = createGriddedRectangleArray( - TRANSFER_FUNCTION_PANEL_SIZE, + + this.transferFunction = this.registerDisposer( + new TransferFunction( + parent.dataType, + parent.trackable, + TRANSFER_FUNCTION_PANEL_SIZE, + ), ); + this.controller = this.registerDisposer( + new TransferFunctionController( + element, + parent.dataType, + this.transferFunction, + () => parent.trackable.value, + (value: TransferFunctionParameters) => { + parent.trackable.value = value; + }, + ), + ); + this.dataValuesBuffer = this.registerDisposer( + getMemoizedBuffer( + gl, + WebGL2RenderingContext.ARRAY_BUFFER, + getDataValuesArray, + ), + ).value; + + element.classList.add("neuroglancer-transfer-function-panel"); this.texture = this.registerDisposer(new DirectLookupTableTexture(gl)); - function createBuffer(dataArray: Float32Array) { - return getMemoizedBuffer( + this.textureVertexBuffer = this.registerDisposer( + getMemoizedBuffer( gl, WebGL2RenderingContext.ARRAY_BUFFER, - () => dataArray, - ).value; - } - this.textureVertexBuffer = this.registerDisposer( - createBuffer(this.textureVertexBufferArray), - ); + getTextureVertexBufferArray, + ), + ).value; this.controlPointsVertexBuffer = this.registerDisposer( - createBuffer(this.controlPointsPositionArray), + new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.controlPointsColorBuffer = this.registerDisposer( - createBuffer(this.controlPointsColorArray), + new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.linePositionBuffer = this.registerDisposer( - createBuffer(this.linePositionArray), + new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); } diff --git a/src/worker_rpc.ts b/src/worker_rpc.ts index 281fdb46c0..25f5cf3223 100644 --- a/src/worker_rpc.ts +++ b/src/worker_rpc.ts @@ -295,7 +295,7 @@ export class SharedObject extends RefCounted { * Should be set to a constant specifying the SharedObject type identifier on the prototype of * final derived owner classes. It is not used on counterpart (non-owner) classes. */ - RPC_TYPE_ID: string; + declare RPC_TYPE_ID: string; } export function initializeSharedObjectCounterpart( diff --git a/tsconfig.json b/tsconfig.json index 9e092a9f7f..172a9e26e7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,8 @@ "moduleResolution": "bundler", "incremental": true, "resolveJsonModule": true, - "target": "ES2017", + "useDefineForClassFields": true, + "target": "ES2022", "newLine": "LF", "baseUrl": ".", "lib": ["dom", "webworker", "esnext", "dom.iterable"], From 413a0989a46d294c389016c817788515d4a2c61d Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 10 Dec 2024 13:12:55 -0800 Subject: [PATCH 13/41] docs(rsbuild/rspack): add rspack and rsbuild dependent project examples --- build_tools/build-package.ts | 27 +- examples/README.md | 2 + .../rsbuild/rsbuild-project-built/.gitignore | 2 + .../rsbuild/rsbuild-project-built/README.md | 1 + .../rsbuild-project-built/package-lock.json | 306 + .../rsbuild-project-built/package.json | 23 + .../rsbuild-project-built/rsbuild.config.ts | 43 + .../rsbuild-project-built/src/index.js | 3 + .../rsbuild/rsbuild-project-source/.gitignore | 2 + .../rsbuild/rsbuild-project-source/README.md | 1 + .../rsbuild-project-source/package-lock.json | 13143 ++++++++++++ .../rsbuild-project-source/package.json | 23 + .../rsbuild-project-source/rsbuild.config.ts | 58 + .../rsbuild-project-source/src/index.js | 3 + .../rspack/rspack-project-built/.gitignore | 2 + .../rspack/rspack-project-built/README.md | 1 + .../rspack-project-built/package-lock.json | 4418 ++++ .../rspack/rspack-project-built/package.json | 25 + .../rspack-project-built/rspack.config.js | 46 + .../rspack/rspack-project-built/src/index.js | 3 + .../rspack/rspack-project-source/.gitignore | 2 + .../rspack-project-source/package-lock.json | 17100 ++++++++++++++++ .../rspack/rspack-project-source/package.json | 25 + .../rspack-project-source/rspack.config.js | 61 + .../rspack/rspack-project-source/src/index.js | 3 + .../vite-project-source/package-lock.json | 1070 +- .../webpack-project-source/package-lock.json | 1066 +- package-lock.json | 3 +- package.json | 3 +- python/tests/client_test.py | 22 +- 30 files changed, 35400 insertions(+), 2087 deletions(-) create mode 100644 examples/rsbuild/rsbuild-project-built/.gitignore create mode 100644 examples/rsbuild/rsbuild-project-built/README.md create mode 100644 examples/rsbuild/rsbuild-project-built/package-lock.json create mode 100644 examples/rsbuild/rsbuild-project-built/package.json create mode 100644 examples/rsbuild/rsbuild-project-built/rsbuild.config.ts create mode 100644 examples/rsbuild/rsbuild-project-built/src/index.js create mode 100644 examples/rsbuild/rsbuild-project-source/.gitignore create mode 100644 examples/rsbuild/rsbuild-project-source/README.md create mode 100644 examples/rsbuild/rsbuild-project-source/package-lock.json create mode 100644 examples/rsbuild/rsbuild-project-source/package.json create mode 100644 examples/rsbuild/rsbuild-project-source/rsbuild.config.ts create mode 100644 examples/rsbuild/rsbuild-project-source/src/index.js create mode 100644 examples/rspack/rspack-project-built/.gitignore create mode 100644 examples/rspack/rspack-project-built/README.md create mode 100644 examples/rspack/rspack-project-built/package-lock.json create mode 100644 examples/rspack/rspack-project-built/package.json create mode 100644 examples/rspack/rspack-project-built/rspack.config.js create mode 100644 examples/rspack/rspack-project-built/src/index.js create mode 100644 examples/rspack/rspack-project-source/.gitignore create mode 100644 examples/rspack/rspack-project-source/package-lock.json create mode 100644 examples/rspack/rspack-project-source/package.json create mode 100644 examples/rspack/rspack-project-source/rspack.config.js create mode 100644 examples/rspack/rspack-project-source/src/index.js diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts index 32c80a00b5..ef2203902f 100644 --- a/build_tools/build-package.ts +++ b/build_tools/build-package.ts @@ -32,8 +32,11 @@ function buildDeclarationFiles( program.emit(); } -async function buildPackage(options: { inplace?: boolean }) { - const { inplace = false } = options; +async function buildPackage(options: { + inplace?: boolean; + skipDeclarations?: boolean; +}) { + const { inplace = false, skipDeclarations = false } = options; const srcDir = path.resolve(rootDir, "src"); const outDir = inplace ? rootDir : path.resolve(rootDir, "dist", "package"); @@ -80,10 +83,12 @@ async function buildPackage(options: { inplace?: boolean }) { "./", ).options; } - buildDeclarationFiles(entryPoints, { - ...compilerOptionsFromConfigFile, - outDir: libDir, - }); + if (!skipDeclarations) { + buildDeclarationFiles(entryPoints, { + ...compilerOptionsFromConfigFile, + outDir: libDir, + }); + } const otherSources = await glob(["**/*.{css,js,html,wasm}"], { cwd: srcDir, @@ -156,6 +161,11 @@ async function parseArgsAndRunMain() { default: false, description: "Convert package to built format inplace.", }, + ["skip-declarations"]: { + type: "boolean", + default: false, + description: "Skip generating .d.ts files.", + }, ["if-not-toplevel"]: { type: "boolean", default: false, @@ -193,7 +203,10 @@ async function parseArgsAndRunMain() { return; } } - buildPackage({ inplace: argv.inplace }); + buildPackage({ + inplace: argv.inplace, + skipDeclarations: argv.skipDeclarations, + }); } if (process.argv[1] === import.meta.filename) { diff --git a/examples/README.md b/examples/README.md index 41a0df3e65..78ebd5b272 100644 --- a/examples/README.md +++ b/examples/README.md @@ -31,6 +31,8 @@ Neuroglancer can be used as a dependency in two ways: The following bundlers are known to be compatible: - [webpack](./webpack/) (recommended) +- [rspack](./rspack/) +- [rsbuild](./rsbuild/) - [parcel](./parcel/) - [vite](./vite/) diff --git a/examples/rsbuild/rsbuild-project-built/.gitignore b/examples/rsbuild/rsbuild-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rsbuild/rsbuild-project-built/README.md b/examples/rsbuild/rsbuild-project-built/README.md new file mode 100644 index 0000000000..be1275aabe --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses rsbuild for building. diff --git a/examples/rsbuild/rsbuild-project-built/package-lock.json b/examples/rsbuild/rsbuild-project-built/package-lock.json new file mode 100644 index 0000000000..854ddfff09 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/package-lock.json @@ -0,0 +1,306 @@ +{ + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "@rsbuild/core": "^1.1.9" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "core-js": "^3.39.0", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "engines": { + "node": ">=20.11 <21 || >=21.2" + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@rsbuild/core": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.1.9.tgz", + "integrity": "sha512-mHZveEwlTtW9nxWa+T0xUm6ssm+HkDYZ0NENLfWMUmsL0LjMJrpQzRlbD+p5+9Uf+KXUo3Dbtv0ScA+p7cuGTg==", + "dev": true, + "dependencies": { + "@rspack/core": "~1.1.5", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.15", + "core-js": "~3.39.0" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=16.7.0" + } + }, + "node_modules/@rspack/binding": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", + "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.6", + "@rspack/binding-darwin-x64": "1.1.6", + "@rspack/binding-linux-arm64-gnu": "1.1.6", + "@rspack/binding-linux-arm64-musl": "1.1.6", + "@rspack/binding-linux-x64-gnu": "1.1.6", + "@rspack/binding-linux-x64-musl": "1.1.6", + "@rspack/binding-win32-arm64-msvc": "1.1.6", + "@rspack/binding-win32-ia32-msvc": "1.1.6", + "@rspack/binding-win32-x64-msvc": "1.1.6" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", + "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", + "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", + "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", + "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", + "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", + "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", + "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", + "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", + "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", + "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.6", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } +} diff --git a/examples/rsbuild/rsbuild-project-built/package.json b/examples/rsbuild/rsbuild-project-built/package.json new file mode 100644 index 0000000000..f7bedd282c --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/package.json @@ -0,0 +1,23 @@ +{ + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of an rsbuild project that depends on Neuroglancer.", + "scripts": { + "build": "rsbuild build", + "dev-server": "rsbuild dev" + }, + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rsbuild/core": "^1.1.9" + }, + "type": "module" +} diff --git a/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts b/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts new file mode 100644 index 0000000000..0f435fed84 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts @@ -0,0 +1,43 @@ +import { defineConfig } from "@rsbuild/core"; + +export default defineConfig({ + html: { + title: "rsbuild neuroglancer test", + scriptLoading: "module", + mountId: "neuroglancer-container", + }, + output: { + assetPrefix: "./", + distPath: { + js: "", + jsAsync: "", + wasm: "", + css: "", + }, + }, + tools: { + rspack: { + module: { + rules: [ + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + }, + }, + plugins: [], +}); diff --git a/examples/rsbuild/rsbuild-project-built/src/index.js b/examples/rsbuild/rsbuild-project-built/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rsbuild/rsbuild-project-source/.gitignore b/examples/rsbuild/rsbuild-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rsbuild/rsbuild-project-source/README.md b/examples/rsbuild/rsbuild-project-source/README.md new file mode 100644 index 0000000000..be1275aabe --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses rsbuild for building. diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json new file mode 100644 index 0000000000..4084cd4d7b --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -0,0 +1,13143 @@ +{ + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "@rsbuild/core": "^1.1.9" + } + }, + "../../..": { + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "core-js": "^3.39.0", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.10.2", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", + "css-loader": "^7.1.2", + "esbuild": "^0.24.0", + "esbuild-loader": "^4.2.2", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", + "fork-ts-checker-webpack-plugin": "^6.5.3", + "glob": "^11.0.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "nunjucks": "^3.2.4", + "prettier": "3.4.2", + "style-loader": "^4.0.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.2.0", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" + }, + "engines": { + "node": ">=20.11 <21 || >=21.2" + } + }, + "../../../node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/@babel/code-frame": { + "version": "7.12.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "../../../node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../../../node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "../../../node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "../../../node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "../../../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../../../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../../../node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@one-ini/wasm": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/@polka/url": { + "version": "1.0.0-next.24", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@puppeteer/browsers": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@sindresorhus/is": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "../../../node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/codemirror": { + "version": "5.60.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "../../../node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/eslint": { + "version": "8.56.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../../../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../../../node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "../../../node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "../../../node_modules/@types/gl-matrix": { + "version": "2.4.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "../../../node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "../../../node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash-es": { + "version": "4.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "../../../node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../../../node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/qs": { + "version": "6.9.12", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "../../../node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "../../../node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/tern": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "../../../node_modules/@types/which": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "../../../node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "../../../node_modules/@vitest/expect": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/snapshot": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/spy": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/ui": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "../../../node_modules/@vitest/utils": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "../../../node_modules/@wdio/config": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger": { + "version": "8.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@wdio/protocols": { + "version": "8.32.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@wdio/repl": { + "version": "8.24.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/types": { + "version": "8.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/utils": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../../../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../../../node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../../../node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "../../../node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "../../../node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "../../../node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "../../../node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "../../../node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "../../../node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "../../../node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "../../../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/archiver": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/archiver-utils/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "../../../node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "../../../node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array-equal": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "../../../node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/async": { + "version": "3.2.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/async-limiter": { + "version": "1.0.1", + "license": "MIT" + }, + "../../../node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../../../node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/aws4": { + "version": "1.12.0", + "license": "MIT" + }, + "../../../node_modules/b4a": { + "version": "1.6.4", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/bare-events": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "../../../node_modules/bare-fs": { + "version": "2.1.5", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "../../../node_modules/bare-os": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "../../../node_modules/bare-path": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "../../../node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/basic-ftp": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "../../../node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/binary": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "../../../node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/bluebird": { + "version": "3.4.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/body-parser": { + "version": "1.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../../../node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "../../../node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../../../node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/brfs": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" + }, + "bin": { + "brfs": "bin/cmd.js" + } + }, + "../../../node_modules/brfs/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "../../../node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/buffer-equal": { + "version": "0.0.1", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/buffers": { + "version": "0.1.1", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "../../../node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request": { + "version": "10.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/call-bind": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/caniuse-lite": { + "version": "1.0.30001596", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "../../../node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "../../../node_modules/chai": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/chainsaw": { + "version": "0.1.0", + "dev": true, + "license": "MIT/X11", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + } + }, + "../../../node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "../../../node_modules/chromium-bidi": { + "version": "0.4.16", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "../../../node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/clean-css": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "../../../node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/codemirror": { + "version": "5.65.16", + "license": "MIT" + }, + "../../../node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../../../node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "../../../node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "../../../node_modules/compress-commons": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "../../../node_modules/condense-newlines": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "../../../node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "../../../node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "../../../node_modules/cosmiconfig": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/crc-32": { + "version": "1.2.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/crc32-stream": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/cross-fetch": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "../../../node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "../../../node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "../../../node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/css-loader": { + "version": "6.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../../../node_modules/css-shorthand-properties": { + "version": "1.1.1", + "dev": true + }, + "../../../node_modules/css-value": { + "version": "0.0.1", + "dev": true + }, + "../../../node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../../../node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../../../node_modules/decamelize": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../../../node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "../../../node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "../../../node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/define-data-property": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../../../node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/devtools-protocol": { + "version": "0.0.1262051", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "../../../node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "../../../node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "../../../node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "../../../node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "../../../node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "../../../node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "../../../node_modules/edge-paths": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "../../../node_modules/edgedriver": { + "version": "5.3.10", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "../../../node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/editorconfig": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/electron-to-chromium": { + "version": "1.4.699", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/element-size": { + "version": "1.1.1", + "license": "MIT" + }, + "../../../node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "../../../node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "../../../node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../../../node_modules/envinfo": { + "version": "7.11.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../../../node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../../../node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/esbuild": { + "version": "0.20.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "../../../node_modules/esbuild-loader": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "../../../node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "../../../node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "../../../node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "../../../node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-webpack-plugin": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.37.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^8.0.0", + "webpack": "^5.0.0" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/events": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "../../../node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/npm-run-path": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "../../../node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/express/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../../../node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "../../../node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "../../../node_modules/falafel": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "../../../node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "../../../node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "../../../node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "../../../node_modules/fastq": { + "version": "1.17.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "../../../node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "../../../node_modules/fetch-blob": { + "version": "3.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "../../../node_modules/fflate": { + "version": "0.8.1", + "license": "MIT" + }, + "../../../node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "../../../node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "../../../node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "../../../node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/fs-monkey": { + "version": "1.0.5", + "dev": true, + "license": "Unlicense" + }, + "../../../node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "../../../node_modules/fstream": { + "version": "1.0.12", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/fstream/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fstream/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fstream/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "../../../node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/geckodriver": { + "version": "4.3.3", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.5", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "../../../node_modules/geckodriver/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "../../../node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/get-intrinsic": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-port": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-tsconfig": { + "version": "4.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "../../../node_modules/get-uri": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "../../../node_modules/gl-matrix": { + "version": "3.1.0", + "license": "MIT" + }, + "../../../node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/glsl-editor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "brfs": "^1.2.0", + "codemirror": "^4.5.0", + "element-size": "^1.1.1", + "events": "^1.0.2", + "inherits": "^2.0.1", + "insert-css": "^0.2.0", + "through2": "^0.6.1", + "xtend": "^4.0.0" + } + }, + "../../../node_modules/glsl-editor/node_modules/codemirror": { + "version": "4.13.0" + }, + "../../../node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "../../../node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/has": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/has-property-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "../../../node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "../../../node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/html-entities": { + "version": "2.5.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "../../../node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/html-webpack-plugin": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "../../../node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "../../../node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "../../../node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/ikonate": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" + } + }, + "../../../node_modules/ikonate/node_modules/abab": { + "version": "1.0.4", + "license": "ISC" + }, + "../../../node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-walk": { + "version": "6.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "license": "MIT", + "dependencies": { + "cssom": "0.3.x" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/domexception": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "license": "MIT", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "../../../node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-meta-resolve": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "../../../node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "../../../node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../../../node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "../../../node_modules/insert-css": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "../../../node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-core-module": { + "version": "2.13.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../../../node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-plain-obj": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typed-array": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-whitespace": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "../../../node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "../../../node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "../../../node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "../../../node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/js-beautify": { + "version": "1.14.11", + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../../../node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/jsdom": { + "version": "17.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.4.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.0", + "decimal.js": "^10.3.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^9.0.0", + "ws": "^8.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../../../node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "../../../node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "../../../node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "../../../node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "../../../node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "../../../node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "../../../node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/ky": { + "version": "0.33.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "../../../node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "../../../node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "../../../node_modules/left-pad": { + "version": "1.3.0", + "license": "WTFPL" + }, + "../../../node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/lightningcss": { + "version": "1.23.0", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "../../../node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/listenercount": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "../../../node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "../../../node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/locate-app": { + "version": "2.2.20", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "n12": "1.8.23", + "type-fest": "2.13.0", + "userhome": "1.0.0" + } + }, + "../../../node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash.clonedeep": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "../../../node_modules/lodash.zip": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/loglevel": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "../../../node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "../../../node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "../../../node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "../../../node_modules/magic-string": { + "version": "0.30.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/memfs": { + "version": "4.7.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "../../../node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge-source-map": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "../../../node_modules/merge-source-map/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../../../node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../../node_modules/mitt": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../../../node_modules/mlly": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "../../../node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "../../../node_modules/n12": { + "version": "1.8.23", + "dev": true, + "license": "SEE LICENSE IN LICENSE" + }, + "../../../node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "../../../node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/nifti-reader-js": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "fflate": "*" + } + }, + "../../../node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/node-domexception": { + "version": "1.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "../../../node_modules/node-fetch": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "../../../node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "../../../node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/nopt": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/normalize-url": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "../../../node_modules/numcodecs": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "fflate": "^0.8.0" + } + }, + "../../../node_modules/nwmatcher": { + "version": "1.4.4", + "license": "MIT" + }, + "../../../node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "../../../node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../../../node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/open": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "../../../node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "../../../node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/pac-proxy-agent": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "../../../node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "../../../node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../../../node_modules/pkg-types": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "../../../node_modules/pn": { + "version": "1.1.0", + "license": "MIT" + }, + "../../../node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "../../../node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-scope": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../../node_modules/pretty": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/pretty-error": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "../../../node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "../../../node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "../../../node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/proxy-agent": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "../../../node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/puppeteer-core": { + "version": "20.9.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/queue-tick": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/quote-stream": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "bin": { + "quote-stream": "bin/cmd.js" + } + }, + "../../../node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../../../node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../../../node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/readdir-glob": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "../../../node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "../../../node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/renderkid": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "../../../node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/request-promise-core": { + "version": "1.1.4", + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native": { + "version": "1.0.9", + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "../../../node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "../../../node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/resq": { + "version": "1.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "../../../node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "../../../node_modules/rgb2hex": { + "version": "0.2.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/rollup": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "../../../node_modules/safaridriver": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "../../../node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "../../../node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/serialize-error": { + "version": "11.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../../../node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/set-function-length": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/shallow-copy": { + "version": "0.0.1", + "license": "MIT" + }, + "../../../node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "../../../node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../../../node_modules/socks": { + "version": "2.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks-proxy-agent": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/source-list-map": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/source-map": { + "version": "0.6.1", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../../../node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "../../../node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/split2": { + "version": "4.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "../../../node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/sshpk": { + "version": "1.18.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/static-eval": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "../../../node_modules/static-module": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" + } + }, + "../../../node_modules/static-module/node_modules/escodegen": { + "version": "1.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/static-module/node_modules/esprima": { + "version": "3.1.3", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/static-module/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/static-module/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/magic-string": { + "version": "0.22.5", + "license": "MIT", + "dependencies": { + "vlq": "^0.2.2" + } + }, + "../../../node_modules/static-module/node_modules/object-inspect": { + "version": "1.4.1", + "license": "MIT" + }, + "../../../node_modules/static-module/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/static-module/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/stealthy-require": { + "version": "1.1.1", + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/streamx": { + "version": "2.15.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "../../../node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-literal": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/style-loader": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "../../../node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../../../node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tar-fs": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../../../node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../../../node_modules/terser": { + "version": "5.29.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../../../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through2": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "../../../node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "../../../node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "../../../node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "../../../node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/traverse": { + "version": "0.3.9", + "dev": true, + "license": "MIT/X11" + }, + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../../../node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "../../../node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "../../../node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "../../../node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../../node_modules/ufo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "../../../node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "../../../node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/unzipper": { + "version": "0.10.14", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "../../../node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "../../../node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "../../../node_modules/userhome": { + "version": "1.0.0", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "../../../node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "../../../node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/vite": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "../../../node_modules/vite-node": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "../../../node_modules/vitest": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "../../../node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/vlq": { + "version": "0.2.3", + "license": "MIT" + }, + "../../../node_modules/w3c-hr-time": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "../../../node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/wait-port": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "../../../node_modules/web-streams-polyfill": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/webdriver": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/webdriverio": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "archiver": "^6.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1262051", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.32.3" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "../../../node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.4" + } + }, + "../../../node_modules/webpack": { + "version": "5.90.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/webpack-cli": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "../../../node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/webpack-dev-middleware": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", + "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/webpack-dev-server": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.0.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "../../../node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "../../../node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/whatwg-encoding": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "../../../node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "../../../node_modules/whatwg-url": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/which-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/why-is-node-running": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "../../../node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/xmldom": { + "version": "0.1.31", + "license": "(LGPL-2.0 or MIT)", + "engines": { + "node": ">=0.1" + } + }, + "../../../node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "../../../node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "../../../node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "../../../node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/zip-stream": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@rsbuild/core": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.1.9.tgz", + "integrity": "sha512-mHZveEwlTtW9nxWa+T0xUm6ssm+HkDYZ0NENLfWMUmsL0LjMJrpQzRlbD+p5+9Uf+KXUo3Dbtv0ScA+p7cuGTg==", + "dev": true, + "dependencies": { + "@rspack/core": "~1.1.5", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.15", + "core-js": "~3.39.0" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=16.7.0" + } + }, + "node_modules/@rspack/binding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", + "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.5", + "@rspack/binding-darwin-x64": "1.1.5", + "@rspack/binding-linux-arm64-gnu": "1.1.5", + "@rspack/binding-linux-arm64-musl": "1.1.5", + "@rspack/binding-linux-x64-gnu": "1.1.5", + "@rspack/binding-linux-x64-musl": "1.1.5", + "@rspack/binding-win32-arm64-msvc": "1.1.5", + "@rspack/binding-win32-ia32-msvc": "1.1.5", + "@rspack/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", + "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", + "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.5", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } +} diff --git a/examples/rsbuild/rsbuild-project-source/package.json b/examples/rsbuild/rsbuild-project-source/package.json new file mode 100644 index 0000000000..ae76056a7f --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/package.json @@ -0,0 +1,23 @@ +{ + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of an rsbuild project that depends on Neuroglancer.", + "scripts": { + "build": "rsbuild build", + "dev-server": "rsbuild dev" + }, + "dependencies": { + "neuroglancer": "file:../../.." + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rsbuild/core": "^1.1.9" + }, + "type": "module" +} diff --git a/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts b/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts new file mode 100644 index 0000000000..459ddfc6d6 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts @@ -0,0 +1,58 @@ +import { defineConfig } from "@rsbuild/core"; + +export default defineConfig({ + html: { + title: "rsbuild neuroglancer test", + scriptLoading: "module", + mountId: "neuroglancer-container", + }, + output: { + assetPrefix: "./", + distPath: { + js: "", + jsAsync: "", + wasm: "", + css: "", + }, + }, + tools: { + rspack: { + module: { + rules: [ + // Needed to support Neuroglancer TypeScript sources when using + // Neuroglancer source package directly. + { + test: /\.tsx?$/, + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + }, + type: "javascript/auto", + }, + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + }, + }, + plugins: [], +}); diff --git a/examples/rsbuild/rsbuild-project-source/src/index.js b/examples/rsbuild/rsbuild-project-source/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rspack/rspack-project-built/.gitignore b/examples/rspack/rspack-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rspack/rspack-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rspack/rspack-project-built/README.md b/examples/rspack/rspack-project-built/README.md new file mode 100644 index 0000000000..4d92187a2f --- /dev/null +++ b/examples/rspack/rspack-project-built/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses webpack for bundling. diff --git a/examples/rspack/rspack-project-built/package-lock.json b/examples/rspack/rspack-project-built/package-lock.json new file mode 100644 index 0000000000..85c7f27965 --- /dev/null +++ b/examples/rspack/rspack-project-built/package-lock.json @@ -0,0 +1,4418 @@ +{ + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5", + "svg-inline-loader": "^0.8.2" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "core-js": "^3.39.0", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "engines": { + "node": ">=20.11 <21 || >=21.2" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", + "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rspack/binding": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", + "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.6", + "@rspack/binding-darwin-x64": "1.1.6", + "@rspack/binding-linux-arm64-gnu": "1.1.6", + "@rspack/binding-linux-arm64-musl": "1.1.6", + "@rspack/binding-linux-x64-gnu": "1.1.6", + "@rspack/binding-linux-x64-musl": "1.1.6", + "@rspack/binding-win32-arm64-msvc": "1.1.6", + "@rspack/binding-win32-ia32-msvc": "1.1.6", + "@rspack/binding-win32-x64-msvc": "1.1.6" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", + "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", + "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", + "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", + "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", + "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", + "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", + "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", + "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", + "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/cli": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.6.tgz", + "integrity": "sha512-404JTAadncCp81sDa7nGZdsT7r1Ry8fALR8Wkp9VMTUhWEFlbDGQvOTyali24pfyJxJTdsarSabmNhbDO5okJw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" + }, + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" + } + }, + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/@rspack/core": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", + "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.6", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@rspack/dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.10", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", + "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.1.2", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/examples/rspack/rspack-project-built/package.json b/examples/rspack/rspack-project-built/package.json new file mode 100644 index 0000000000..f684132e6a --- /dev/null +++ b/examples/rspack/rspack-project-built/package.json @@ -0,0 +1,25 @@ +{ + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of an rspack-bundled project that depends on Neuroglancer.", + "scripts": { + "build": "rspack build", + "dev-server": "rspack serve" + }, + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5", + "svg-inline-loader": "^0.8.2" + }, + "type": "module" +} diff --git a/examples/rspack/rspack-project-built/rspack.config.js b/examples/rspack/rspack-project-built/rspack.config.js new file mode 100644 index 0000000000..2dac5e39cf --- /dev/null +++ b/examples/rspack/rspack-project-built/rspack.config.js @@ -0,0 +1,46 @@ +import rspack from "@rspack/core"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new rspack.HtmlRspackPlugin({ + title: "Neuroglancer webpack test", + }), + ], + experiments: { + css: true, + }, +}; diff --git a/examples/rspack/rspack-project-built/src/index.js b/examples/rspack/rspack-project-built/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rspack/rspack-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rspack/rspack-project-source/.gitignore b/examples/rspack/rspack-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rspack/rspack-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json new file mode 100644 index 0000000000..6686ad5170 --- /dev/null +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -0,0 +1,17100 @@ +{ + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5", + "svg-inline-loader": "^0.8.2" + } + }, + "../../..": { + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "core-js": "^3.39.0", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.10.2", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", + "css-loader": "^7.1.2", + "esbuild": "^0.24.0", + "esbuild-loader": "^4.2.2", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", + "fork-ts-checker-webpack-plugin": "^6.5.3", + "glob": "^11.0.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "nunjucks": "^3.2.4", + "prettier": "3.4.2", + "style-loader": "^4.0.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.2.0", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" + }, + "engines": { + "node": ">=20.11 <21 || >=21.2" + } + }, + "../../../node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/@babel/code-frame": { + "version": "7.12.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "../../../node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../../../node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "../../../node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "../../../node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "../../../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../../../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../../../node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@one-ini/wasm": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/@polka/url": { + "version": "1.0.0-next.24", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@puppeteer/browsers": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@sindresorhus/is": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "../../../node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/codemirror": { + "version": "5.60.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "../../../node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/eslint": { + "version": "8.56.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../../../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../../../node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "../../../node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "../../../node_modules/@types/gl-matrix": { + "version": "2.4.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "../../../node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "../../../node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash-es": { + "version": "4.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "../../../node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../../../node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/qs": { + "version": "6.9.12", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "../../../node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "../../../node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/tern": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "../../../node_modules/@types/which": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "../../../node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "../../../node_modules/@vitest/expect": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/snapshot": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/spy": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/ui": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "../../../node_modules/@vitest/utils": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "../../../node_modules/@wdio/config": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger": { + "version": "8.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@wdio/protocols": { + "version": "8.32.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@wdio/repl": { + "version": "8.24.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/types": { + "version": "8.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/utils": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../../../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../../../node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../../../node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "../../../node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "../../../node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "../../../node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "../../../node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "../../../node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "../../../node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "../../../node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "../../../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/archiver": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/archiver-utils/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "../../../node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "../../../node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array-equal": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "../../../node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/async": { + "version": "3.2.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/async-limiter": { + "version": "1.0.1", + "license": "MIT" + }, + "../../../node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../../../node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/aws4": { + "version": "1.12.0", + "license": "MIT" + }, + "../../../node_modules/b4a": { + "version": "1.6.4", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/bare-events": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "../../../node_modules/bare-fs": { + "version": "2.1.5", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "../../../node_modules/bare-os": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "../../../node_modules/bare-path": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "../../../node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/basic-ftp": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "../../../node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/binary": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "../../../node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/bluebird": { + "version": "3.4.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/body-parser": { + "version": "1.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../../../node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "../../../node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../../../node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/brfs": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" + }, + "bin": { + "brfs": "bin/cmd.js" + } + }, + "../../../node_modules/brfs/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "../../../node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/buffer-equal": { + "version": "0.0.1", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/buffers": { + "version": "0.1.1", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "../../../node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request": { + "version": "10.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/call-bind": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/caniuse-lite": { + "version": "1.0.30001596", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "../../../node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "../../../node_modules/chai": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/chainsaw": { + "version": "0.1.0", + "dev": true, + "license": "MIT/X11", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + } + }, + "../../../node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "../../../node_modules/chromium-bidi": { + "version": "0.4.16", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "../../../node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/clean-css": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "../../../node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/codemirror": { + "version": "5.65.16", + "license": "MIT" + }, + "../../../node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../../../node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "../../../node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "../../../node_modules/compress-commons": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "../../../node_modules/condense-newlines": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "../../../node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "../../../node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "../../../node_modules/cosmiconfig": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/crc-32": { + "version": "1.2.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/crc32-stream": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/cross-fetch": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "../../../node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "../../../node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "../../../node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/css-loader": { + "version": "6.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../../../node_modules/css-shorthand-properties": { + "version": "1.1.1", + "dev": true + }, + "../../../node_modules/css-value": { + "version": "0.0.1", + "dev": true + }, + "../../../node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../../../node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../../../node_modules/decamelize": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../../../node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "../../../node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "../../../node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/default-gateway/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/define-data-property": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../../../node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/devtools-protocol": { + "version": "0.0.1262051", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "../../../node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "../../../node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "../../../node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "../../../node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "../../../node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "../../../node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "../../../node_modules/edge-paths": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "../../../node_modules/edgedriver": { + "version": "5.3.10", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "../../../node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/editorconfig": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/electron-to-chromium": { + "version": "1.4.699", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/element-size": { + "version": "1.1.1", + "license": "MIT" + }, + "../../../node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "../../../node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "../../../node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../../../node_modules/envinfo": { + "version": "7.11.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../../../node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../../../node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/esbuild": { + "version": "0.20.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "../../../node_modules/esbuild-loader": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "../../../node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "../../../node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "../../../node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "../../../node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-webpack-plugin": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.37.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^8.0.0", + "webpack": "^5.0.0" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/events": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "../../../node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/npm-run-path": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "../../../node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/express/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../../../node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "../../../node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "../../../node_modules/falafel": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "../../../node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "../../../node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "../../../node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "../../../node_modules/fastq": { + "version": "1.17.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "../../../node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "../../../node_modules/fetch-blob": { + "version": "3.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "../../../node_modules/fflate": { + "version": "0.8.1", + "license": "MIT" + }, + "../../../node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "../../../node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "../../../node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "../../../node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/fs-monkey": { + "version": "1.0.5", + "dev": true, + "license": "Unlicense" + }, + "../../../node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "../../../node_modules/fstream": { + "version": "1.0.12", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/fstream/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fstream/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fstream/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "../../../node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/geckodriver": { + "version": "4.3.3", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.5", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "../../../node_modules/geckodriver/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "../../../node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/get-intrinsic": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-port": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-tsconfig": { + "version": "4.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "../../../node_modules/get-uri": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "../../../node_modules/gl-matrix": { + "version": "3.1.0", + "license": "MIT" + }, + "../../../node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/glsl-editor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "brfs": "^1.2.0", + "codemirror": "^4.5.0", + "element-size": "^1.1.1", + "events": "^1.0.2", + "inherits": "^2.0.1", + "insert-css": "^0.2.0", + "through2": "^0.6.1", + "xtend": "^4.0.0" + } + }, + "../../../node_modules/glsl-editor/node_modules/codemirror": { + "version": "4.13.0" + }, + "../../../node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "../../../node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/has": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/has-property-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "../../../node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "../../../node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/html-entities": { + "version": "2.5.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "../../../node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/html-webpack-plugin": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "../../../node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "../../../node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "../../../node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/ikonate": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" + } + }, + "../../../node_modules/ikonate/node_modules/abab": { + "version": "1.0.4", + "license": "ISC" + }, + "../../../node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-walk": { + "version": "6.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "license": "MIT", + "dependencies": { + "cssom": "0.3.x" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/domexception": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "license": "MIT", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "../../../node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/import-meta-resolve": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "../../../node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "../../../node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../../../node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "../../../node_modules/insert-css": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "../../../node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-core-module": { + "version": "2.13.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../../../node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-plain-obj": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typed-array": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-whitespace": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "../../../node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "../../../node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "../../../node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "../../../node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/js-beautify": { + "version": "1.14.11", + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../../../node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/jsdom": { + "version": "17.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.4.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.0", + "decimal.js": "^10.3.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^9.0.0", + "ws": "^8.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../../../node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "../../../node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "../../../node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "../../../node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "../../../node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "../../../node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "../../../node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/ky": { + "version": "0.33.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "../../../node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "../../../node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "../../../node_modules/left-pad": { + "version": "1.3.0", + "license": "WTFPL" + }, + "../../../node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/lightningcss": { + "version": "1.23.0", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "../../../node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/listenercount": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "../../../node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "../../../node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/locate-app": { + "version": "2.2.20", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "n12": "1.8.23", + "type-fest": "2.13.0", + "userhome": "1.0.0" + } + }, + "../../../node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash.clonedeep": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "../../../node_modules/lodash.zip": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/loglevel": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "../../../node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "../../../node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "../../../node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "../../../node_modules/magic-string": { + "version": "0.30.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/memfs": { + "version": "4.7.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "../../../node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge-source-map": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "../../../node_modules/merge-source-map/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../../../node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../../node_modules/mitt": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../../../node_modules/mlly": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "../../../node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "../../../node_modules/n12": { + "version": "1.8.23", + "dev": true, + "license": "SEE LICENSE IN LICENSE" + }, + "../../../node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "../../../node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/nifti-reader-js": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "fflate": "*" + } + }, + "../../../node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/node-domexception": { + "version": "1.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "../../../node_modules/node-fetch": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "../../../node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "../../../node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/nopt": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/normalize-url": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "../../../node_modules/numcodecs": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "fflate": "^0.8.0" + } + }, + "../../../node_modules/nwmatcher": { + "version": "1.4.4", + "license": "MIT" + }, + "../../../node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "../../../node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../../../node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/open": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "../../../node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "../../../node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/pac-proxy-agent": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../../../node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "../../../node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "../../../node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../../../node_modules/pkg-types": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "../../../node_modules/pn": { + "version": "1.1.0", + "license": "MIT" + }, + "../../../node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "../../../node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-scope": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../../node_modules/pretty": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/pretty-error": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "../../../node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "../../../node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "../../../node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/proxy-agent": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "../../../node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/puppeteer-core": { + "version": "20.9.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/queue-tick": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/quote-stream": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "bin": { + "quote-stream": "bin/cmd.js" + } + }, + "../../../node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../../../node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../../../node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/readdir-glob": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "../../../node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "../../../node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../../../node_modules/renderkid": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "../../../node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/request-promise-core": { + "version": "1.1.4", + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native": { + "version": "1.0.9", + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "../../../node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "../../../node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/resq": { + "version": "1.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "../../../node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "../../../node_modules/rgb2hex": { + "version": "0.2.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/rollup": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "../../../node_modules/safaridriver": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "../../../node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "../../../node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/serialize-error": { + "version": "11.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../../../node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../../../node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/set-function-length": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/shallow-copy": { + "version": "0.0.1", + "license": "MIT" + }, + "../../../node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "../../../node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../../../node_modules/socks": { + "version": "2.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks-proxy-agent": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/source-list-map": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/source-map": { + "version": "0.6.1", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../../../node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "../../../node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/split2": { + "version": "4.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "../../../node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/sshpk": { + "version": "1.18.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/static-eval": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "../../../node_modules/static-module": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" + } + }, + "../../../node_modules/static-module/node_modules/escodegen": { + "version": "1.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/static-module/node_modules/esprima": { + "version": "3.1.3", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/static-module/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/static-module/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/magic-string": { + "version": "0.22.5", + "license": "MIT", + "dependencies": { + "vlq": "^0.2.2" + } + }, + "../../../node_modules/static-module/node_modules/object-inspect": { + "version": "1.4.1", + "license": "MIT" + }, + "../../../node_modules/static-module/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/static-module/node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "../../../node_modules/static-module/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/stealthy-require": { + "version": "1.1.1", + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/streamx": { + "version": "2.15.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "../../../node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-literal": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/style-loader": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "../../../node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../../../node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tar-fs": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../../../node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../../../node_modules/terser": { + "version": "5.29.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../../../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through2": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "../../../node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "../../../node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "../../../node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "../../../node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/traverse": { + "version": "0.3.9", + "dev": true, + "license": "MIT/X11" + }, + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../../../node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "../../../node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "../../../node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "../../../node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../../node_modules/ufo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "../../../node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "../../../node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/unzipper": { + "version": "0.10.14", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "../../../node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "../../../node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "../../../node_modules/userhome": { + "version": "1.0.0", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "../../../node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "../../../node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/vite": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "../../../node_modules/vite-node": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "../../../node_modules/vitest": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "../../../node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/vlq": { + "version": "0.2.3", + "license": "MIT" + }, + "../../../node_modules/w3c-hr-time": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "../../../node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/wait-port": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "../../../node_modules/web-streams-polyfill": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/webdriver": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/webdriverio": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "archiver": "^6.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1262051", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.32.3" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "../../../node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.4" + } + }, + "../../../node_modules/webpack": { + "version": "5.90.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/webpack-cli": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "../../../node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/webpack-dev-middleware": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", + "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/webpack-dev-server": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.0.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "../../../node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "../../../node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "../../../node_modules/whatwg-encoding": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "../../../node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "../../../node_modules/whatwg-url": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/which-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/why-is-node-running": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "../../../node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/xmldom": { + "version": "0.1.31", + "license": "(LGPL-2.0 or MIT)", + "engines": { + "node": ">=0.1" + } + }, + "../../../node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "../../../node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "../../../node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "../../../node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/zip-stream": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rspack/binding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", + "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.5", + "@rspack/binding-darwin-x64": "1.1.5", + "@rspack/binding-linux-arm64-gnu": "1.1.5", + "@rspack/binding-linux-arm64-musl": "1.1.5", + "@rspack/binding-linux-x64-gnu": "1.1.5", + "@rspack/binding-linux-x64-musl": "1.1.5", + "@rspack/binding-win32-arm64-msvc": "1.1.5", + "@rspack/binding-win32-ia32-msvc": "1.1.5", + "@rspack/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", + "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/cli": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.5.tgz", + "integrity": "sha512-R08aM5gEvRV9zSE9fIaTxT77Nu/kRtoghj9TqItFk0xTbFxai9jF1fwRTbnDv23yVGNCwPfwvPOmpqvrf3SGnQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" + }, + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" + } + }, + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/@rspack/core": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", + "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.5", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@rspack/dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.10", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.7.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/examples/rspack/rspack-project-source/package.json b/examples/rspack/rspack-project-source/package.json new file mode 100644 index 0000000000..127b2d94c7 --- /dev/null +++ b/examples/rspack/rspack-project-source/package.json @@ -0,0 +1,25 @@ +{ + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of an rspack-bundled project that depends on Neuroglancer.", + "scripts": { + "build": "rspack build", + "dev-server": "rspack serve" + }, + "dependencies": { + "neuroglancer": "file:../../.." + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5", + "svg-inline-loader": "^0.8.2" + }, + "type": "module" +} diff --git a/examples/rspack/rspack-project-source/rspack.config.js b/examples/rspack/rspack-project-source/rspack.config.js new file mode 100644 index 0000000000..8eff44f67b --- /dev/null +++ b/examples/rspack/rspack-project-source/rspack.config.js @@ -0,0 +1,61 @@ +import rspack from "@rspack/core"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed to support Neuroglancer TypeScript sources when using + // Neuroglancer source package directly. + { + test: /\.tsx?$/, + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + }, + type: "javascript/auto", + }, + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new rspack.HtmlRspackPlugin({ + title: "Neuroglancer webpack test", + }), + ], + experiments: { + css: true, + }, +}; diff --git a/examples/rspack/rspack-project-source/src/index.js b/examples/rspack/rspack-project-source/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rspack/rspack-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index a333c77b1c..343ee68278 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -29,40 +29,40 @@ "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.16.0", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.2", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", + "esbuild": "^0.24.0", "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", - "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", "fork-ts-checker-webpack-plugin": "^6.5.3", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "nunjucks": "^3.2.4", + "prettier": "3.4.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-dev-server": "^5.2.0", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" }, "engines": { "node": ">=20.11 <21 || >=21.2" @@ -771,11 +771,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/send": { "version": "0.17.4", "dev": true, @@ -854,188 +849,6 @@ "@types/node": "*" } }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "../../../node_modules/@ungap/structured-clone": { "version": "1.2.0", "dev": true, @@ -1644,65 +1457,6 @@ "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/ansi-html-community": { "version": "0.0.8", "dev": true, @@ -1889,14 +1643,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -2002,14 +1748,6 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, @@ -2167,29 +1905,6 @@ "node": ">=8" } }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, @@ -2267,38 +1982,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2373,29 +2056,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "../../../node_modules/buffer-crc32": { "version": "0.2.13", "dev": true, @@ -2526,17 +2186,6 @@ "tslib": "^2.0.3" } }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2685,44 +2334,8 @@ "dependencies": { "source-map": "~0.6.0" }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 10.0" } }, "../../../node_modules/cliui": { @@ -2826,11 +2439,6 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, @@ -2839,11 +2447,6 @@ "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { "version": "5.0.1", "dev": true, @@ -3500,25 +3103,6 @@ "node": ">=6" } }, - "../../../node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, @@ -3643,17 +3227,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/dns-packet": { "version": "5.6.1", "dev": true, @@ -3935,18 +3508,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "../../../node_modules/entities": { "version": "2.2.0", "dev": true, @@ -4219,18 +3780,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -4273,71 +3822,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -5040,21 +4524,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5759,20 +5228,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/globals": { "version": "13.24.0", "dev": true, @@ -5812,25 +5267,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/glsl-editor": { "version": "1.0.0", "license": "MIT", @@ -6707,14 +6143,6 @@ "version": "2.0.4", "license": "ISC" }, - "../../../node_modules/ini": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "../../../node_modules/insert-css": { "version": "0.2.0", "license": "MIT" @@ -6923,32 +6351,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7113,17 +6515,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -7631,42 +7022,11 @@ "version": "4.7.0", "license": "MIT" }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, "license": "MIT" }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, @@ -8194,14 +7554,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -8355,72 +7707,14 @@ "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 0.8.0" } }, "../../../node_modules/p-cancelable": { @@ -8701,96 +7995,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/pkg-types": { "version": "1.0.3", "dev": true, @@ -9551,26 +8755,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "../../../node_modules/retry": { "version": "0.13.1", "dev": true, @@ -10105,11 +9289,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -10123,30 +9302,6 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "../../../node_modules/smart-buffer": { "version": "4.2.0", "dev": true, @@ -10462,20 +9617,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -10693,18 +9834,6 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "license": "MIT", @@ -10715,97 +9844,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "../../../node_modules/symbol-tree": { "version": "3.2.4", "license": "MIT" }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -10837,21 +9879,6 @@ "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, @@ -11030,17 +10057,6 @@ "dev": true, "license": "MIT/X11" }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, @@ -11723,14 +10739,6 @@ "minimalistic-assert": "^1.0.0" } }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -12347,20 +11355,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 44d489277d..d9f5fe35ca 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -36,40 +36,40 @@ "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.16.0", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.2", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", + "esbuild": "^0.24.0", "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", - "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", "fork-ts-checker-webpack-plugin": "^6.5.3", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "nunjucks": "^3.2.4", + "prettier": "3.4.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-dev-server": "^5.2.0", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" }, "engines": { "node": ">=20.11 <21 || >=21.2" @@ -1314,11 +1314,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/send": { "version": "0.17.4", "dev": true, @@ -1397,188 +1392,6 @@ "@types/node": "*" } }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "../../../node_modules/@ungap/structured-clone": { "version": "1.2.0", "dev": true, @@ -2187,65 +2000,6 @@ "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/ansi-html-community": { "version": "0.0.8", "dev": true, @@ -2432,14 +2186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -2545,14 +2291,6 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, @@ -2710,29 +2448,6 @@ "node": ">=8" } }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, @@ -2810,38 +2525,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2916,29 +2599,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "../../../node_modules/buffer-crc32": { "version": "0.2.13", "dev": true, @@ -3069,17 +2729,6 @@ "tslib": "^2.0.3" } }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -3222,50 +2871,14 @@ } }, "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", + "version": "5.3.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "source-map": "~0.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 10.0" } }, "../../../node_modules/cliui": { @@ -3369,11 +2982,6 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, @@ -3382,11 +2990,6 @@ "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { "version": "5.0.1", "dev": true, @@ -4043,25 +3646,6 @@ "node": ">=6" } }, - "../../../node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, @@ -4186,17 +3770,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/dns-packet": { "version": "5.6.1", "dev": true, @@ -4478,18 +4051,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "../../../node_modules/entities": { "version": "2.2.0", "dev": true, @@ -5114,18 +4675,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -5168,71 +4717,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -5935,21 +5419,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -6668,20 +6137,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/globals": { "version": "13.24.0", "dev": true, @@ -6721,25 +6176,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/glsl-editor": { "version": "1.0.0", "license": "MIT", @@ -7616,14 +7052,6 @@ "version": "2.0.4", "license": "ISC" }, - "../../../node_modules/ini": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "../../../node_modules/insert-css": { "version": "0.2.0", "license": "MIT" @@ -7832,32 +7260,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -8022,17 +7424,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -8540,42 +7931,11 @@ "version": "4.7.0", "license": "MIT" }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, "license": "MIT" }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, @@ -9103,14 +8463,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -9271,65 +8623,7 @@ "type-check": "^0.4.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 0.8.0" } }, "../../../node_modules/p-cancelable": { @@ -9611,96 +8905,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/pkg-types": { "version": "1.0.3", "dev": true, @@ -10462,26 +9666,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "../../../node_modules/retry": { "version": "0.13.1", "dev": true, @@ -11020,11 +10204,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -11038,30 +10217,6 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "../../../node_modules/smart-buffer": { "version": "4.2.0", "dev": true, @@ -11378,20 +10533,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -11609,18 +10750,6 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "license": "MIT", @@ -11631,97 +10760,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "../../../node_modules/symbol-tree": { "version": "3.2.4", "license": "MIT" }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -11753,21 +10795,6 @@ "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, @@ -11946,17 +10973,6 @@ "dev": true, "license": "MIT/X11" }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, @@ -12994,14 +12010,6 @@ "minimalistic-assert": "^1.0.0" } }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -13618,20 +12626,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, diff --git a/package-lock.json b/package-lock.json index 4f72ce3474..7da1114d4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,8 @@ "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" }, "engines": { "node": ">=20.11 <21 || >=21.2" diff --git a/package.json b/package.json index 73f3408324..9a6998d796 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,8 @@ "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" }, "dependencies": { "codemirror": "^5.61.1", diff --git a/python/tests/client_test.py b/python/tests/client_test.py index 50f45ce3d4..c21d474b46 100644 --- a/python/tests/client_test.py +++ b/python/tests/client_test.py @@ -16,6 +16,7 @@ import sys import threading import time +import urllib.request import filelock import neuroglancer.static_file_server @@ -80,6 +81,14 @@ def thread_func(f): assert url is not None + while True: + try: + assert urllib.request.urlopen(url).status == 200 + break + except Exception as e: + print(f"URL {url} not yet ready: {e}") + time.sleep(0.1) + return capture_screenshot(webdriver, url, test_fragment) finally: if sys.platform == "win32": @@ -139,7 +148,7 @@ def capture_screenshot(webdriver, url, test_fragment): webdriver.driver.switch_to.window(original_window_handle) -TEST_FRAGMENT = "#!%7B%22dimensions%22:%7B%22x%22:%5B8e-9%2C%22m%22%5D%2C%22y%22:%5B8e-9%2C%22m%22%5D%2C%22z%22:%5B8e-9%2C%22m%22%5D%7D%2C%22position%22:%5B22316.904296875%2C21921.87890625%2C24029.763671875%5D%2C%22crossSectionScale%22:1%2C%22crossSectionDepth%22:-37.62185354999912%2C%22projectionOrientation%22:%5B-0.1470303237438202%2C0.5691322684288025%2C0.19562694430351257%2C0.7849844694137573%5D%2C%22projectionScale%22:118020.30607575581%2C%22layers%22:%5B%7B%22type%22:%22image%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/emdata/clahe_yz/jpeg%22%2C%22tab%22:%22source%22%2C%22name%22:%22emdata%22%7D%2C%7B%22type%22:%22segmentation%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/v1.0/segmentation%22%2C%22tab%22:%22segments%22%2C%22segments%22:%5B%221944507292%22%5D%2C%22name%22:%22segmentation%22%7D%5D%2C%22showSlices%22:false%2C%22selectedLayer%22:%7B%22layer%22:%22segmentation%22%7D%2C%22layout%22:%22xy-3d%22%7D" +TEST_FRAGMENT = "#!%7B%22dimensions%22:%7B%22x%22:%5B8e-9%2C%22m%22%5D%2C%22y%22:%5B8e-9%2C%22m%22%5D%2C%22z%22:%5B8e-9%2C%22m%22%5D%7D%2C%22position%22:%5B22316.904296875%2C21921.87890625%2C24029.763671875%5D%2C%22crossSectionScale%22:1%2C%22crossSectionDepth%22:-37.62185354999912%2C%22projectionOrientation%22:%5B-0.1470303237438202%2C0.5691322684288025%2C0.19562694430351257%2C0.7849844694137573%5D%2C%22projectionScale%22:118020.30607575581%2C%22layers%22:%5B%7B%22type%22:%22image%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/emdata/clahe_yz/jpeg%22%2C%22tab%22:%22rendering%22%2C%22crossSectionRenderScale%22:4%2C%22name%22:%22emdata%22%7D%2C%7B%22type%22:%22segmentation%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/v1.0/segmentation%22%2C%22tab%22:%22rendering%22%2C%22segments%22:%5B%221944507292%22%5D%2C%22name%22:%22segmentation%22%7D%5D%2C%22showSlices%22:false%2C%22selectedLayer%22:%7B%22layer%22:%22emdata%22%7D%2C%22layout%22:%22xy-3d%22%2C%22statistics%22:%7B%22size%22:232%7D%7D" @pytest.fixture(scope="session") @@ -162,6 +171,8 @@ def expected_screenshot(request, webdriver_generic): # Disable parcel since it currently has "failed to resolve bundle" errors. # "parcel", "webpack", + "rsbuild", + "rspack", ] for package in ["source", "built"] ] @@ -201,7 +212,11 @@ def do_build(): subprocess.run( ["npm", "install", "--no-fund", "--no-audit"], cwd=root_dir, check=True ) - subprocess.run(["npm", "run", "build-package"], cwd=root_dir, check=True) + subprocess.run( + ["npm", "run", "build-package", "--", "--skip-declarations"], + cwd=root_dir, + check=True, + ) get_xdist_session_value( do_build, @@ -270,7 +285,6 @@ def compare_screenshot(screenshot, expected_screenshot, extras, threshold=20): pytest.fail(f"Screenshots don't match, max_difference={max_difference}") -# Flaky due to https://github.com/parcel-bundler/parcel/issues/9476 @pytest.mark.flaky(reruns=5) @pytest.mark.timeout(timeout=60, func_only=True) def test_dev_server( @@ -292,7 +306,6 @@ def test_dev_server( ) -# Flaky due to https://github.com/parcel-bundler/parcel/issues/9476 @pytest.mark.flaky(reruns=5) @pytest.mark.timeout(timeout=60, func_only=True) def test_build( @@ -314,6 +327,7 @@ def test_build( ) +@pytest.mark.flaky(reruns=5) @pytest.mark.timeout(timeout=60, func_only=True) def test_root_build( request, From c6bc8472ee063804577ce77c275afe9cc318a8b5 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 10 Dec 2024 21:58:53 -0800 Subject: [PATCH 14/41] fix(typings): add ?raw declaration and remove stale dependency on vite typings --- typings/index.d.ts | 4 +--- typings/{html.d.ts => raw.d.ts} | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) rename typings/{html.d.ts => raw.d.ts} (65%) diff --git a/typings/index.d.ts b/typings/index.d.ts index ea8848a6c6..b1018d0087 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,5 +1,3 @@ -/// -/// +/// /// /// -/// diff --git a/typings/html.d.ts b/typings/raw.d.ts similarity index 65% rename from typings/html.d.ts rename to typings/raw.d.ts index 0877141d37..a20ce87840 100644 --- a/typings/html.d.ts +++ b/typings/raw.d.ts @@ -1,4 +1,4 @@ -declare module "*.html" { +declare module "*?raw" { const value: string; export default value; } From 22246e20def2c1dba386ba12a004970fcf21b8da Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 11 Dec 2024 08:56:47 -0800 Subject: [PATCH 15/41] chore(generate-code): migrate to ES module, fix type annotations --- {config => build_tools}/generate-code.ts | 33 +++++++++------ package-lock.json | 54 ++++++++++++++++++++++++ package.json | 4 +- 3 files changed, 78 insertions(+), 13 deletions(-) rename {config => build_tools}/generate-code.ts (84%) diff --git a/config/generate-code.ts b/build_tools/generate-code.ts similarity index 84% rename from config/generate-code.ts rename to build_tools/generate-code.ts index b3b2e2c200..37106b61c7 100644 --- a/config/generate-code.ts +++ b/build_tools/generate-code.ts @@ -14,14 +14,11 @@ * limitations under the License. */ -"use strict"; +import fs from "node:fs"; +import path from "node:path"; +import nunjucks from "nunjucks"; -const nunjucks = require("nunjucks"); -const fs = require("fs"); -const path = require("path"); - -const rootDir = path.resolve(__dirname, ".."); -const srcDir = path.resolve(rootDir, "src"); +const rootDir = path.resolve(import.meta.dirname, ".."); const templatesDir = path.resolve(rootDir, "templates"); const env = nunjucks.configure(rootDir, { @@ -34,7 +31,11 @@ const env = nunjucks.configure(rootDir, { }, }); -function writeGenerated(sourcePath, outputPath, contents) { +function writeGenerated( + sourcePath: string, + outputPath: string, + contents: string, +) { fs.writeFileSync( path.resolve(rootDir, "src", outputPath), `// DO NOT EDIT. Generated from templates/${sourcePath}. @@ -42,7 +43,11 @@ function writeGenerated(sourcePath, outputPath, contents) { ); } -function renderTemplate(sourcePath, outputPath, context) { +function renderTemplate( + sourcePath: string, + outputPath: string, + context: Record, +) { writeGenerated( sourcePath, outputPath, @@ -58,7 +63,7 @@ function writeSegmentationCompression() { {}, ); for (const dataType of ["uint64", "uint32"]) { - const context = { + const context: Record = { dataType, strideMultiplier: dataType === "uint64" ? 2 : 1, }; @@ -72,7 +77,11 @@ function writeSegmentationCompression() { } } -function makeSubstitutions(inputPath, outputPath, replacements) { +function makeSubstitutions( + inputPath: string, + outputPath: string, + replacements: [string | RegExp, string][], +) { let inputContents = fs.readFileSync(path.resolve(templatesDir, inputPath), { encoding: "utf-8", }); @@ -107,7 +116,7 @@ function writeDataStructures() { const nextPrevReplacements = [ [/NEXT_PROPERTY/g, `next${i}`], [/PREV_PROPERTY/g, `prev${i}`], - ]; + ] as [string | RegExp, string][]; makeSubstitutions( path.join(baseDir, "linked_list.template.ts"), path.join(baseDir, `linked_list.${i}.ts`), diff --git a/package-lock.json b/package-lock.json index 7da1114d4e..f87ae5fdad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", + "@types/nunjucks": "^3.2.6", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -41,6 +42,7 @@ "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", "mini-css-extract-plugin": "^2.9.0", + "nunjucks": "^3.2.4", "prettier": "3.3.3", "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", @@ -1666,6 +1668,12 @@ "@types/node": "*" } }, + "node_modules/@types/nunjucks": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", + "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -2519,6 +2527,12 @@ "node": ">=16.5.0" } }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true + }, "node_modules/abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -3122,6 +3136,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -10056,6 +10076,40 @@ "fflate": "^0.8.0" } }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dev": true, + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/nwmatcher": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", diff --git a/package.json b/package.json index 9a6998d796..8569da54f8 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "last 2 Safari versions" ], "scripts": { - "generate-code": "tsx ./config/generate_code.ts", + "generate-code": "tsx ./build_tools/generate-code.ts", "update-conditions": "tsx ./build_tools/update-conditions.ts", "prepare": "tsx ./build_tools/build-package.ts --inplace --if-not-toplevel", "prepack": "tsx ./build_tools/build-package.ts --inplace", @@ -45,6 +45,7 @@ "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.14.12", + "@types/nunjucks": "^3.2.6", "@types/yargs": "^17.0.32", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", @@ -63,6 +64,7 @@ "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", "mini-css-extract-plugin": "^2.9.0", + "nunjucks": "^3.2.4", "prettier": "3.3.3", "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", From b1c8e95eea24ce8990cc46125f0d1ebf0835c2f5 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 11 Dec 2024 09:11:49 -0800 Subject: [PATCH 16/41] chore: support typescript 5.7 --- package-lock.json | 6 +-- src/annotation/backend.ts | 2 +- src/annotation/frontend_source.ts | 2 +- src/annotation/index.ts | 2 +- src/async_computation/decode_blosc.ts | 4 +- src/async_computation/decode_blosc_request.ts | 4 +- src/async_computation/decode_compresso.ts | 2 +- .../decode_compresso_request.ts | 4 +- src/async_computation/decode_jpeg.ts | 4 +- src/async_computation/decode_jpeg_request.ts | 2 +- src/async_computation/decode_png.ts | 2 +- src/async_computation/decode_png_request.ts | 4 +- src/async_computation/decode_zstd.ts | 4 +- src/async_computation/decode_zstd_request.ts | 4 +- src/async_computation/obj_mesh.ts | 3 +- src/datasource/precomputed/backend.ts | 2 +- src/datasource/vtk/parse.ts | 6 +-- src/datasource/zarr/codec/blosc/decode.ts | 6 +-- src/datasource/zarr/codec/bytes/decode.ts | 4 +- src/datasource/zarr/codec/crc32c/decode.ts | 4 +- src/datasource/zarr/codec/decode.ts | 18 +++---- src/datasource/zarr/codec/gzip/decode.ts | 4 +- src/datasource/zarr/codec/transpose/decode.ts | 4 +- src/datasource/zarr/codec/zstd/decode.ts | 6 +-- src/datasource/zarr/ome.ts | 6 +-- src/kvstore/index.ts | 2 +- src/render_coordinate_transform.ts | 2 +- .../property_map.ts | 16 ++---- src/single_mesh/base.ts | 8 +-- .../backend_chunk_decoders/compresso.ts | 3 +- .../compressed_segmentation/decode_uint32.ts | 3 +- .../compressed_segmentation/decode_uint64.ts | 3 +- .../compressed_segmentation/encode_common.ts | 27 +++++----- .../compressed_segmentation/encode_uint32.ts | 23 ++++----- .../compressed_segmentation/encode_uint64.ts | 23 ++++----- src/sliceview/compresso/index.ts | 2 +- .../uncompressed_chunk_format.browser_test.ts | 2 +- src/sliceview/uncompressed_chunk_format.ts | 4 +- src/third_party/jpgjs/jpg.d.ts | 6 ++- src/util/array.ts | 51 +++++++++++-------- src/util/data_type.ts | 10 ++-- src/util/float32array_builder.ts | 12 +++-- src/util/float64array_builder.ts | 12 +++-- src/util/int16array_builder.ts | 12 +++-- src/util/int32array_builder.ts | 12 +++-- src/util/int8array_builder.ts | 12 +++-- src/util/linked_list.0.ts | 2 +- src/util/linked_list.1.ts | 2 +- src/util/pairing_heap.0.ts | 5 +- src/util/pairing_heap.1.ts | 5 +- src/util/uint16array_builder.ts | 12 +++-- src/util/uint32array_builder.ts | 12 +++-- src/util/uint8array_builder.ts | 12 +++-- src/webgl/lerp.browser_test.ts | 5 +- src/widget/transfer_function.ts | 2 +- .../decode.template.ts | 4 +- .../encode.template.ts | 11 ++-- .../encode_common.template.ts | 2 +- templates/util/pairing_heap.template.ts | 2 +- templates/util/typedarray_builder.template.ts | 4 +- 60 files changed, 234 insertions(+), 200 deletions(-) diff --git a/package-lock.json b/package-lock.json index f87ae5fdad..d758dbf1ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13734,9 +13734,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index 0c2b10b29c..aa7f43ce49 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -99,7 +99,7 @@ export class AnnotationMetadataChunk extends Chunk { } export class AnnotationGeometryData implements SerializedAnnotations { - data: Uint8Array; + data: Uint8Array; typeToOffset: number[]; typeToIds: string[][]; typeToIdMaps: Map[]; diff --git a/src/annotation/frontend_source.ts b/src/annotation/frontend_source.ts index e957c6bae3..77f80d9d83 100644 --- a/src/annotation/frontend_source.ts +++ b/src/annotation/frontend_source.ts @@ -290,7 +290,7 @@ function copyOtherAnnotations( propertySerializers: AnnotationPropertySerializer[], excludedType: AnnotationType, excludedTypeAdjustment: number, -): Uint8Array { +): Uint8Array { const newData = new Uint8Array( serializedAnnotations.data.length + excludedTypeAdjustment, ); diff --git a/src/annotation/index.ts b/src/annotation/index.ts index f920d1a96d..db2dded24e 100644 --- a/src/annotation/index.ts +++ b/src/annotation/index.ts @@ -1363,7 +1363,7 @@ export function makeDataBoundsBoundingBoxAnnotationSet( } export interface SerializedAnnotations { - data: Uint8Array; + data: Uint8Array; typeToIds: string[][]; typeToOffset: number[]; typeToIdMaps: Map[]; diff --git a/src/async_computation/decode_blosc.ts b/src/async_computation/decode_blosc.ts index effe9a723f..efca39e514 100644 --- a/src/async_computation/decode_blosc.ts +++ b/src/async_computation/decode_blosc.ts @@ -17,9 +17,9 @@ import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; import { registerAsyncComputation } from "#src/async_computation/handler.js"; -registerAsyncComputation(decodeBlosc, async (data: Uint8Array) => { +registerAsyncComputation(decodeBlosc, async (data) => { const { default: Blosc } = await import("numcodecs/blosc"); const codec = Blosc.fromConfig({ id: "blosc" }); - const result = await codec.decode(data); + const result = (await codec.decode(data)) as Uint8Array; return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_blosc_request.ts b/src/async_computation/decode_blosc_request.ts index 54f577b5da..b5d5f9ed3e 100644 --- a/src/async_computation/decode_blosc_request.ts +++ b/src/async_computation/decode_blosc_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeBlosc = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeBlosc"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeBlosc", + ); diff --git a/src/async_computation/decode_compresso.ts b/src/async_computation/decode_compresso.ts index 377c345d07..e9813a92c0 100644 --- a/src/async_computation/decode_compresso.ts +++ b/src/async_computation/decode_compresso.ts @@ -18,7 +18,7 @@ import { decodeCompresso } from "#src/async_computation/decode_compresso_request import { registerAsyncComputation } from "#src/async_computation/handler.js"; import { decompressCompresso } from "#src/sliceview/compresso/index.js"; -registerAsyncComputation(decodeCompresso, async (data: Uint8Array) => { +registerAsyncComputation(decodeCompresso, async (data) => { const result = await decompressCompresso(data); return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_compresso_request.ts b/src/async_computation/decode_compresso_request.ts index 3c36ad518b..d955a26295 100644 --- a/src/async_computation/decode_compresso_request.ts +++ b/src/async_computation/decode_compresso_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeCompresso = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeCompresso"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeCompresso", + ); diff --git a/src/async_computation/decode_jpeg.ts b/src/async_computation/decode_jpeg.ts index c20dbea214..bf073c7769 100644 --- a/src/async_computation/decode_jpeg.ts +++ b/src/async_computation/decode_jpeg.ts @@ -22,7 +22,7 @@ import { transposeArray2d } from "#src/util/array.js"; registerAsyncComputation( decodeJpeg, async ( - data: Uint8Array, + data, width: number | undefined, height: number | undefined, area: number | undefined, @@ -52,7 +52,7 @@ registerAsyncComputation( ); } numComponents = parser.numComponents; - let result: Uint8Array; + let result: Uint8Array; if (parser.numComponents === 1) { result = parser.getData( parser.width, diff --git a/src/async_computation/decode_jpeg_request.ts b/src/async_computation/decode_jpeg_request.ts index c5b9a7d1df..1aa9722520 100644 --- a/src/async_computation/decode_jpeg_request.ts +++ b/src/async_computation/decode_jpeg_request.ts @@ -18,7 +18,7 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeJpeg = asyncComputation< ( - data: Uint8Array, + data: Uint8Array, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_png.ts b/src/async_computation/decode_png.ts index ed33df0763..57e37a3c48 100644 --- a/src/async_computation/decode_png.ts +++ b/src/async_computation/decode_png.ts @@ -21,7 +21,7 @@ import { decompressPng } from "#src/sliceview/png/index.js"; registerAsyncComputation( decodePng, async ( - data: Uint8Array, + data, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_png_request.ts b/src/async_computation/decode_png_request.ts index 0980b4e453..46d05a2228 100644 --- a/src/async_computation/decode_png_request.ts +++ b/src/async_computation/decode_png_request.ts @@ -19,12 +19,12 @@ export interface DecodedImage { width: number; height: number; numComponents: number; - uint8Array: Uint8Array; + uint8Array: Uint8Array; } export const decodePng = asyncComputation< ( - data: Uint8Array, + data: Uint8Array, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_zstd.ts b/src/async_computation/decode_zstd.ts index becdaf5901..f4808b7c89 100644 --- a/src/async_computation/decode_zstd.ts +++ b/src/async_computation/decode_zstd.ts @@ -17,9 +17,9 @@ import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; import { registerAsyncComputation } from "#src/async_computation/handler.js"; -registerAsyncComputation(decodeZstd, async (data: Uint8Array) => { +registerAsyncComputation(decodeZstd, async (data) => { const { default: Zstd } = await import("numcodecs/zstd"); const codec = Zstd.fromConfig({ id: "blosc" }); - const result = await codec.decode(data); + const result = (await codec.decode(data)) as Uint8Array; return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_zstd_request.ts b/src/async_computation/decode_zstd_request.ts index 25c709d366..b895e9f4d3 100644 --- a/src/async_computation/decode_zstd_request.ts +++ b/src/async_computation/decode_zstd_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeZstd = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeZstd"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeZstd", + ); diff --git a/src/async_computation/obj_mesh.ts b/src/async_computation/obj_mesh.ts index 68646946d0..35ec5820a3 100644 --- a/src/async_computation/obj_mesh.ts +++ b/src/async_computation/obj_mesh.ts @@ -24,8 +24,7 @@ import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; registerAsyncComputation( parseOBJFromArrayBuffer, async (buffer: ArrayBuffer) => { - buffer = await maybeDecompressGzip(buffer); - let text = new TextDecoder().decode(buffer); + let text = new TextDecoder().decode(await maybeDecompressGzip(buffer)); // Strip comments text = text.replace(/#.*/g, ""); const vertexPositions = new Float32ArrayBuilder(); diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 23b3e2c82e..c7a1eac117 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -910,7 +910,7 @@ function parseAnnotations( } const geometryData = new AnnotationGeometryData(); const origData = new Uint8Array(buffer, 8, numBytes * countLow); - let data: Uint8Array; + let data: Uint8Array; const { propertyGroupBytes } = propertySerializer; if (propertyGroupBytes.length > 1) { // Need to transpose the property data. diff --git a/src/datasource/vtk/parse.ts b/src/datasource/vtk/parse.ts index a5107d7e18..39069bab42 100644 --- a/src/datasource/vtk/parse.ts +++ b/src/datasource/vtk/parse.ts @@ -49,7 +49,7 @@ export interface VTKHeader { export interface VertexAttribute { name: string; - data: Float32Array; + data: Float32Array; numComponents: number; tableName: string; dataType: string; @@ -59,9 +59,9 @@ export class TriangularMesh { constructor( public header: VTKHeader, public numVertices: number, - public vertexPositions: Float32Array, + public vertexPositions: Float32Array, public numTriangles: number, - public indices: Uint32Array, + public indices: Uint32Array, public vertexAttributes: VertexAttribute[], ) {} } diff --git a/src/datasource/zarr/codec/blosc/decode.ts b/src/datasource/zarr/codec/blosc/decode.ts index 1f33d84bcf..a6c47d725a 100644 --- a/src/datasource/zarr/codec/blosc/decode.ts +++ b/src/datasource/zarr/codec/blosc/decode.ts @@ -23,11 +23,7 @@ import { CodecKind } from "#src/datasource/zarr/codec/index.js"; registerCodec({ name: "blosc", kind: CodecKind.bytesToBytes, - decode( - configuration: Configuration, - encoded: Uint8Array, - abortSignal: AbortSignal, - ): Promise { + decode(configuration: Configuration, encoded, abortSignal: AbortSignal) { configuration; return requestAsyncComputation( decodeBlosc, diff --git a/src/datasource/zarr/codec/bytes/decode.ts b/src/datasource/zarr/codec/bytes/decode.ts index 3a795a4320..e38c163a0f 100644 --- a/src/datasource/zarr/codec/bytes/decode.ts +++ b/src/datasource/zarr/codec/bytes/decode.ts @@ -27,9 +27,9 @@ registerCodec({ async decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: Uint8Array, + encoded, abortSignal: AbortSignal, - ): Promise { + ) { abortSignal; const { dataType, chunkShape } = decodedArrayInfo; const numElements = chunkShape.reduce((a, b) => a * b, 1); diff --git a/src/datasource/zarr/codec/crc32c/decode.ts b/src/datasource/zarr/codec/crc32c/decode.ts index ec6e6405d7..f225f18cee 100644 --- a/src/datasource/zarr/codec/crc32c/decode.ts +++ b/src/datasource/zarr/codec/crc32c/decode.ts @@ -25,9 +25,9 @@ registerCodec({ kind: CodecKind.bytesToBytes, async decode( configuration: Configuration, - encoded: Uint8Array, + encoded, abortSignal: AbortSignal, - ): Promise { + ) { configuration; abortSignal; if (encoded.length < checksumSize) { diff --git a/src/datasource/zarr/codec/decode.ts b/src/datasource/zarr/codec/decode.ts index 2db3a367ce..dcc4726e0b 100644 --- a/src/datasource/zarr/codec/decode.ts +++ b/src/datasource/zarr/codec/decode.ts @@ -33,9 +33,9 @@ export interface ArrayToArrayCodec extends Codec { decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: ArrayBufferView, + encoded: ArrayBufferView, abortSignal: AbortSignal, - ): Promise; + ): Promise>; } export interface ArrayToBytesCodec extends Codec { @@ -43,9 +43,9 @@ export interface ArrayToBytesCodec extends Codec { decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: Uint8Array, + encoded: Uint8Array, abortSignal: AbortSignal, - ): Promise; + ): Promise>; } export type ShardingKey = { @@ -66,9 +66,9 @@ export interface BytesToBytesCodec extends Codec { kind: CodecKind.bytesToBytes; decode( configuration: Configuration, - encoded: Uint8Array, + encoded: Uint8Array, abortSignal: AbortSignal, - ): Promise; + ): Promise>; } const codecRegistry = { @@ -94,9 +94,9 @@ export function registerCodec( export async function decodeArray( codecs: CodecChainSpec, - encoded: Uint8Array, + encoded: Uint8Array, abortSignal: AbortSignal, -): Promise { +): Promise> { const bytesToBytes = codecs[CodecKind.bytesToBytes]; for (let i = bytesToBytes.length; i--; ) { const codec = bytesToBytes[i]; @@ -107,7 +107,7 @@ export async function decodeArray( encoded = await impl.decode(codec.configuration, encoded, abortSignal); } - let decoded: ArrayBufferView; + let decoded: ArrayBufferView; { const codec = codecs[CodecKind.arrayToBytes]; const impl = codecRegistry[CodecKind.arrayToBytes].get(codec.name); diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 93ca0bc6fb..75a713416e 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -28,9 +28,9 @@ for (const [name, compressionFormat] of [ kind: CodecKind.bytesToBytes, async decode( configuration: Configuration, - encoded: Uint8Array, + encoded, abortSignal: AbortSignal, - ): Promise { + ) { configuration; return new Uint8Array( await decodeGzip(encoded, compressionFormat, abortSignal), diff --git a/src/datasource/zarr/codec/transpose/decode.ts b/src/datasource/zarr/codec/transpose/decode.ts index 287bc05cb1..6eafd6bb90 100644 --- a/src/datasource/zarr/codec/transpose/decode.ts +++ b/src/datasource/zarr/codec/transpose/decode.ts @@ -25,9 +25,9 @@ registerCodec({ async decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: ArrayBufferView, + encoded, abortSignal: AbortSignal, - ): Promise { + ) { decodedArrayInfo; abortSignal; configuration; diff --git a/src/datasource/zarr/codec/zstd/decode.ts b/src/datasource/zarr/codec/zstd/decode.ts index 744a0ec196..eed9654ab7 100644 --- a/src/datasource/zarr/codec/zstd/decode.ts +++ b/src/datasource/zarr/codec/zstd/decode.ts @@ -23,11 +23,7 @@ import type { Configuration } from "#src/datasource/zarr/codec/zstd/resolve.js"; registerCodec({ name: "zstd", kind: CodecKind.bytesToBytes, - decode( - configuration: Configuration, - encoded: Uint8Array, - abortSignal: AbortSignal, - ): Promise { + decode(configuration: Configuration, encoded, abortSignal: AbortSignal) { configuration; return requestAsyncComputation( decodeZstd, diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index ed1adf7979..dafd8ac4dd 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -138,7 +138,7 @@ const coordinateTransformParsers = new Map([ function parseOmeCoordinateTransform( rank: number, transformJson: unknown, -): Float64Array { +): Float64Array { verifyObject(transformJson); const transformType = verifyObjectProperty( transformJson, @@ -163,7 +163,7 @@ function parseOmeCoordinateTransforms( parseArray(transforms, (transformJson) => { const newTransform = parseOmeCoordinateTransform(rank, transformJson); transform = matrix.multiply( - new Float64Array(transform.length), + new Float64Array(transform.length) as Float64Array, rank + 1, newTransform, rank + 1, @@ -211,7 +211,7 @@ function parseOmeMultiscale( parseArray(obj, (x) => { const scale = parseMultiscaleScale(rank, url, x); scale.transform = matrix.multiply( - new Float64Array((rank + 1) ** 2), + new Float64Array((rank + 1) ** 2) as Float64Array, rank + 1, transform, rank + 1, diff --git a/src/kvstore/index.ts b/src/kvstore/index.ts index fb72305114..3bd16631b7 100644 --- a/src/kvstore/index.ts +++ b/src/kvstore/index.ts @@ -53,7 +53,7 @@ export type ByteRangeRequest = }; export interface ReadResponse { - data: Uint8Array; + data: Uint8Array; dataRange: ByteRange; totalSize: number | undefined; } diff --git a/src/render_coordinate_transform.ts b/src/render_coordinate_transform.ts index 36e31a7829..1987061306 100644 --- a/src/render_coordinate_transform.ts +++ b/src/render_coordinate_transform.ts @@ -287,7 +287,7 @@ export function getRenderLayerTransform( subspaceRank + 1, subspaceRank + 1, subspaceRank + 1, - ); + ) as Float32Array; } const channelSpaceShape = new Uint32Array(channelRank); const { diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index d3cf816a47..4fa7c85453 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -19,11 +19,7 @@ import { ChunkSource } from "#src/chunk_manager/frontend.js"; import type { IndexedSegmentProperty } from "#src/segmentation_display_state/base.js"; import type { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; import type { Uint64Set } from "#src/uint64_set.js"; -import type { - TypedArray, - TypedArrayConstructor, - WritableArrayLike, -} from "#src/util/array.js"; +import type { TypedArray, WritableArrayLike } from "#src/util/array.js"; import { mergeSequences } from "#src/util/array.js"; import { DataType } from "#src/util/data_type.js"; import type { Borrowed } from "#src/util/disposable.js"; @@ -68,13 +64,13 @@ export interface InlineSegmentNumericalProperty { type: "number"; dataType: DataType; description: string | undefined; - values: TypedArray; + values: TypedArray; bounds: DataTypeInterval; } export interface InlineSegmentPropertyMap { // Specifies low/high 32-bit portions of ids. - ids: Uint32Array; + ids: Uint32Array; properties: InlineSegmentProperty[]; } @@ -289,9 +285,7 @@ export function normalizeInlineSegmentPropertyMap( } const properties = inlineProperties.properties.map((property) => { const { values } = property; - const newValues = new (values.constructor as - | TypedArrayConstructor - | typeof Array)(length); + const newValues = new (values.constructor as typeof Array)(length); for (let i = 0; i < length; ++i) { newValues[i] = values[permutation[i]]; } @@ -385,7 +379,7 @@ function mergeInlinePropertyMaps( ++numUnique; }, ); - let ids: Uint32Array; + let ids: Uint32Array; if (numUnique === aCount) { ids = aIds; } else if (numUnique === bCount) { diff --git a/src/single_mesh/base.ts b/src/single_mesh/base.ts index 30c499c758..c56421975c 100644 --- a/src/single_mesh/base.ts +++ b/src/single_mesh/base.ts @@ -39,10 +39,10 @@ export interface SingleMeshInfo { } export interface SingleMeshData { - vertexPositions: Float32Array; - indices: Uint32Array; - vertexNormals?: Float32Array; - vertexAttributes: Float32Array[]; + vertexPositions: Float32Array; + indices: Uint32Array; + vertexNormals?: Float32Array; + vertexAttributes: Float32Array[]; } export class SingleMeshSourceParameters { diff --git a/src/sliceview/backend_chunk_decoders/compresso.ts b/src/sliceview/backend_chunk_decoders/compresso.ts index 511746b5ed..322a725e86 100644 --- a/src/sliceview/backend_chunk_decoders/compresso.ts +++ b/src/sliceview/backend_chunk_decoders/compresso.ts @@ -18,14 +18,13 @@ import { decodeCompresso } from "#src/async_computation/decode_compresso_request import { requestAsyncComputation } from "#src/async_computation/request.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { TypedArray } from "#src/util/array.js"; export async function decodeCompressoChunk( chunk: VolumeChunk, abortSignal: AbortSignal, response: ArrayBuffer, ) { - const image: TypedArray = await requestAsyncComputation( + const image = await requestAsyncComputation( decodeCompresso, abortSignal, [response], diff --git a/src/sliceview/compressed_segmentation/decode_uint32.ts b/src/sliceview/compressed_segmentation/decode_uint32.ts index 8fa21d13b5..8794469964 100644 --- a/src/sliceview/compressed_segmentation/decode_uint32.ts +++ b/src/sliceview/compressed_segmentation/decode_uint32.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/decode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/decode.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/sliceview/compressed_segmentation/decode_uint64.ts b/src/sliceview/compressed_segmentation/decode_uint64.ts index 76a4b32e6b..329d014cee 100644 --- a/src/sliceview/compressed_segmentation/decode_uint64.ts +++ b/src/sliceview/compressed_segmentation/decode_uint64.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/decode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/decode.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/sliceview/compressed_segmentation/encode_common.ts b/src/sliceview/compressed_segmentation/encode_common.ts index 4cc5bcc3f9..ac283a0e21 100644 --- a/src/sliceview/compressed_segmentation/encode_common.ts +++ b/src/sliceview/compressed_segmentation/encode_common.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode_common.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode_common.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -351,22 +350,22 @@ export function encodeChannel( const curGridSize = (gridSize[i] = Math.ceil(volumeSize[i] / blockSize[i])); blockIndexSize *= curGridSize; } - const gx = gridSize[0]; - const gy = gridSize[1]; - const gz = gridSize[2]; - const xSize = volumeSize[0]; - const ySize = volumeSize[1]; - const zSize = volumeSize[2]; - const xBlockSize = blockSize[0]; - const yBlockSize = blockSize[1]; - const zBlockSize = blockSize[2]; + const gx = gridSize[0], + gy = gridSize[1], + gz = gridSize[2]; + const xSize = volumeSize[0], + ySize = volumeSize[1], + zSize = volumeSize[2]; + const xBlockSize = blockSize[0], + yBlockSize = blockSize[1], + zBlockSize = blockSize[2]; const baseOffset = output.length; let headerOffset = baseOffset; const actualSize = [0, 0, 0]; output.resize(baseOffset + blockIndexSize); - const sx = inputStrides[0]; - const sy = inputStrides[1]; - const sz = inputStrides[2]; + const sx = inputStrides[0], + sy = inputStrides[1], + sz = inputStrides[2]; for (let bz = 0; bz < gz; ++bz) { actualSize[2] = Math.min(zBlockSize, zSize - bz * zBlockSize); for (let by = 0; by < gy; ++by) { diff --git a/src/sliceview/compressed_segmentation/encode_uint32.ts b/src/sliceview/compressed_segmentation/encode_uint32.ts index e5d62e588c..fc868d266d 100644 --- a/src/sliceview/compressed_segmentation/encode_uint32.ts +++ b/src/sliceview/compressed_segmentation/encode_uint32.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -49,15 +48,15 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder, ): [number, number] { - const ax = actualSize[0]; - const ay = actualSize[1]; - const az = actualSize[2]; - const bx = blockSize[0]; - const by = blockSize[1]; - const bz = blockSize[2]; + const ax = actualSize[0], + ay = actualSize[1], + az = actualSize[2]; + const bx = blockSize[0], + by = blockSize[1], + bz = blockSize[2]; const sx = inputStrides[0]; - let sy = inputStrides[1]; - let sz = inputStrides[2]; + let sy = inputStrides[1], + sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { @@ -153,7 +152,7 @@ export function encodeChannel( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 1), ) { return encodeChannelCommon( @@ -172,7 +171,7 @@ export function encodeChannels( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 1), ) { return encodeChannelsCommon( diff --git a/src/sliceview/compressed_segmentation/encode_uint64.ts b/src/sliceview/compressed_segmentation/encode_uint64.ts index b40fd5c84b..e2030d8f73 100644 --- a/src/sliceview/compressed_segmentation/encode_uint64.ts +++ b/src/sliceview/compressed_segmentation/encode_uint64.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -49,15 +48,15 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder, ): [number, number] { - const ax = actualSize[0]; - const ay = actualSize[1]; - const az = actualSize[2]; - const bx = blockSize[0]; - const by = blockSize[1]; - const bz = blockSize[2]; + const ax = actualSize[0], + ay = actualSize[1], + az = actualSize[2]; + const bx = blockSize[0], + by = blockSize[1], + bz = blockSize[2]; const sx = inputStrides[0]; - let sy = inputStrides[1]; - let sz = inputStrides[2]; + let sy = inputStrides[1], + sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { @@ -170,7 +169,7 @@ export function encodeChannel( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 2), ) { return encodeChannelCommon( @@ -189,7 +188,7 @@ export function encodeChannels( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 2), ) { return encodeChannelsCommon( diff --git a/src/sliceview/compresso/index.ts b/src/sliceview/compresso/index.ts index 3ab4100a35..b29ba329e7 100644 --- a/src/sliceview/compresso/index.ts +++ b/src/sliceview/compresso/index.ts @@ -75,7 +75,7 @@ function readHeader(buffer: Uint8Array): { export async function decompressCompresso( buffer: Uint8Array, -): Promise { +): Promise> { const m = await getCompressoModulePromise(); const { sx, sy, sz, dataWidth } = readHeader(buffer); diff --git a/src/sliceview/uncompressed_chunk_format.browser_test.ts b/src/sliceview/uncompressed_chunk_format.browser_test.ts index 2ee2ade407..132bfa6940 100644 --- a/src/sliceview/uncompressed_chunk_format.browser_test.ts +++ b/src/sliceview/uncompressed_chunk_format.browser_test.ts @@ -59,7 +59,7 @@ describe("sliceview/uncompressed_chunk_format", () => { ]) { const numElements = prod4(volumeSize); for (const [dataType, arrayConstructor] of < - [DataType, TypedArrayConstructor][] + [DataType, TypedArrayConstructor][] >[ [DataType.UINT8, Uint8Array], [DataType.UINT16, Uint16Array], diff --git a/src/sliceview/uncompressed_chunk_format.ts b/src/sliceview/uncompressed_chunk_format.ts index 910269198e..e4fc7409ea 100644 --- a/src/sliceview/uncompressed_chunk_format.ts +++ b/src/sliceview/uncompressed_chunk_format.ts @@ -348,7 +348,9 @@ export function getFillValueArray( dataType: DataType, fillValue: number | Uint64, ) { - const array = new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType]( + const array = new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)( DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT[dataType], ); if (dataType === DataType.UINT64) { diff --git a/src/third_party/jpgjs/jpg.d.ts b/src/third_party/jpgjs/jpg.d.ts index 91d6ec452a..8439e8b614 100644 --- a/src/third_party/jpgjs/jpg.d.ts +++ b/src/third_party/jpgjs/jpg.d.ts @@ -23,5 +23,9 @@ export class JpegDecoder { height: number; numComponents: number; parse(data: Uint8Array): void; - getData(width: number, height: number, forceRGBOutput?: boolean): Uint8Array; + getData( + width: number, + height: number, + forceRGBOutput?: boolean, + ): Uint8Array; } diff --git a/src/util/array.ts b/src/util/array.ts index c18e90cc87..240f5b23ce 100644 --- a/src/util/array.ts +++ b/src/util/array.ts @@ -63,35 +63,42 @@ export function filterArrayInplace( array.length = outIndex; } -export type TypedArrayConstructor = - | typeof Int8Array - | typeof Uint8Array - | typeof Int16Array - | typeof Uint16Array - | typeof Int32Array - | typeof Uint32Array - | typeof Float32Array - | typeof Float64Array; +export type TypedArrayConstructor< + TArrayBuffer extends ArrayBufferLike = ArrayBufferLike, +> = ( + | typeof Int8Array + | typeof Uint8Array + | typeof Int16Array + | typeof Uint16Array + | typeof Int32Array + | typeof Uint32Array + | typeof Float32Array + | typeof Float64Array +) & + (TArrayBuffer extends ArrayBuffer + ? { new (count: number): TypedArray } + : Record); -export type TypedArray = - | Int8Array - | Uint8Array - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array; +export type TypedArray = + + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; /** * Returns an array of size newSize that starts with the contents of array. * Either returns array if it has the correct size, or a new array with zero * padding at the end. */ -export function maybePadArray( - array: T, - newSize: number, -): T { +export function maybePadArray< + TArrayBuffer extends ArrayBufferLike, + T extends TypedArray, +>(array: T, newSize: number): T { if (array.length === newSize) { return array; } diff --git a/src/util/data_type.ts b/src/util/data_type.ts index 3e478f4e15..8ce7db97e2 100644 --- a/src/util/data_type.ts +++ b/src/util/data_type.ts @@ -80,16 +80,18 @@ export const DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT: Record< [DataType.FLOAT32]: 1, }; -export function makeDataTypeArrayView( +export function makeDataTypeArrayView( dataType: DataType, - buffer: ArrayBuffer, + buffer: TArrayBuffer, byteOffset = 0, byteLength: number = buffer.byteLength, -): ArrayBufferView { +): ArrayBufferView { const bytesPerElement = DATA_TYPE_BYTES[dataType]; const javascriptElementsPerArrayElement = DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT[dataType]; - return new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType]( + return new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)( buffer, byteOffset, (byteLength / bytesPerElement) * javascriptElementsPerArrayElement, diff --git a/src/util/float32array_builder.ts b/src/util/float32array_builder.ts index 271d5a6160..513e05e284 100644 --- a/src/util/float32array_builder.ts +++ b/src/util/float32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Float32ArrayBuilder { length = 0; - data: Float32Array; + data: Float32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Float32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Float32ArrayBuilder { get view() { const { data } = this; - return new Float32Array(data.buffer, data.byteOffset, this.length); + return new Float32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/float64array_builder.ts b/src/util/float64array_builder.ts index 960c22afad..32ca2a5632 100644 --- a/src/util/float64array_builder.ts +++ b/src/util/float64array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Float64ArrayBuilder { length = 0; - data: Float64Array; + data: Float64Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Float64Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Float64ArrayBuilder { get view() { const { data } = this; - return new Float64Array(data.buffer, data.byteOffset, this.length); + return new Float64Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/int16array_builder.ts b/src/util/int16array_builder.ts index 80e86a3504..80fb1c282c 100644 --- a/src/util/int16array_builder.ts +++ b/src/util/int16array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int16ArrayBuilder { length = 0; - data: Int16Array; + data: Int16Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int16Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int16ArrayBuilder { get view() { const { data } = this; - return new Int16Array(data.buffer, data.byteOffset, this.length); + return new Int16Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/int32array_builder.ts b/src/util/int32array_builder.ts index 035c022596..31778b442f 100644 --- a/src/util/int32array_builder.ts +++ b/src/util/int32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int32ArrayBuilder { length = 0; - data: Int32Array; + data: Int32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int32ArrayBuilder { get view() { const { data } = this; - return new Int32Array(data.buffer, data.byteOffset, this.length); + return new Int32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/int8array_builder.ts b/src/util/int8array_builder.ts index 923b97ba1d..5ff5d37d28 100644 --- a/src/util/int8array_builder.ts +++ b/src/util/int8array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int8ArrayBuilder { length = 0; - data: Int8Array; + data: Int8Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int8Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int8ArrayBuilder { get view() { const { data } = this; - return new Int8Array(data.buffer, data.byteOffset, this.length); + return new Int8Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/linked_list.0.ts b/src/util/linked_list.0.ts index 2de7c5595d..0561c54970 100644 --- a/src/util/linked_list.0.ts +++ b/src/util/linked_list.0.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/linked_list.template.ts. +// DO NOT EDIT. Generated from templates/util/linked_list.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/util/linked_list.1.ts b/src/util/linked_list.1.ts index e7163da435..6a6ce2416b 100644 --- a/src/util/linked_list.1.ts +++ b/src/util/linked_list.1.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/linked_list.template.ts. +// DO NOT EDIT. Generated from templates/util/linked_list.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/util/pairing_heap.0.ts b/src/util/pairing_heap.0.ts index 10e222c028..394730db37 100644 --- a/src/util/pairing_heap.0.ts +++ b/src/util/pairing_heap.0.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/pairing_heap.template.ts. +// DO NOT EDIT. Generated from templates/util/pairing_heap.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -71,8 +71,7 @@ export default class Implementation> let head: T | null = null; while (true) { const curNext: T | null = cur.next0; - let next: T | null; - let m: T; + let next: T | null, m: T; if (curNext === null) { next = null; m = cur; diff --git a/src/util/pairing_heap.1.ts b/src/util/pairing_heap.1.ts index 3b4f5f3d66..e8cc96d86a 100644 --- a/src/util/pairing_heap.1.ts +++ b/src/util/pairing_heap.1.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/pairing_heap.template.ts. +// DO NOT EDIT. Generated from templates/util/pairing_heap.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -71,8 +71,7 @@ export default class Implementation> let head: T | null = null; while (true) { const curNext: T | null = cur.next1; - let next: T | null; - let m: T; + let next: T | null, m: T; if (curNext === null) { next = null; m = cur; diff --git a/src/util/uint16array_builder.ts b/src/util/uint16array_builder.ts index 6383bca489..34606cb4b6 100644 --- a/src/util/uint16array_builder.ts +++ b/src/util/uint16array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint16ArrayBuilder { length = 0; - data: Uint16Array; + data: Uint16Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint16Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint16ArrayBuilder { get view() { const { data } = this; - return new Uint16Array(data.buffer, data.byteOffset, this.length); + return new Uint16Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/uint32array_builder.ts b/src/util/uint32array_builder.ts index 3bc6b50ac4..856e0ef367 100644 --- a/src/util/uint32array_builder.ts +++ b/src/util/uint32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint32ArrayBuilder { length = 0; - data: Uint32Array; + data: Uint32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint32ArrayBuilder { get view() { const { data } = this; - return new Uint32Array(data.buffer, data.byteOffset, this.length); + return new Uint32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/uint8array_builder.ts b/src/util/uint8array_builder.ts index 9519a8261c..78d27f9074 100644 --- a/src/util/uint8array_builder.ts +++ b/src/util/uint8array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint8ArrayBuilder { length = 0; - data: Uint8Array; + data: Uint8Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint8Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint8ArrayBuilder { get view() { const { data } = this; - return new Uint8Array(data.buffer, data.byteOffset, this.length); + return new Uint8Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/webgl/lerp.browser_test.ts b/src/webgl/lerp.browser_test.ts index c700d6761e..e925609bd5 100644 --- a/src/webgl/lerp.browser_test.ts +++ b/src/webgl/lerp.browser_test.ts @@ -15,6 +15,7 @@ */ import { expect, describe, it } from "vitest"; +import type { TypedArrayConstructor } from "#src/util/array.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; import type { DataTypeInterval } from "#src/util/lerp.js"; import { @@ -39,7 +40,9 @@ function getRandomValue(dataType: DataType) { case DataType.INT16: case DataType.UINT32: case DataType.INT32: { - const buf = new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType](1); + const buf = new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)(1); getRandomValues(buf); return buf[0]; } diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 8d016f5d05..5e439a168b 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -51,7 +51,7 @@ import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Uint64 } from "#src/util/uint64.js"; import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import { Buffer , getMemoizedBuffer } from "#src/webgl/buffer.js"; +import { Buffer, getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { diff --git a/templates/sliceview/compressed_segmentation/decode.template.ts b/templates/sliceview/compressed_segmentation/decode.template.ts index a54d9be097..5cf984a321 100644 --- a/templates/sliceview/compressed_segmentation/decode.template.ts +++ b/templates/sliceview/compressed_segmentation/decode.template.ts @@ -19,10 +19,10 @@ * Support for decompressing uint64 segment label chunks. */ -import {decodeValueOffset} from 'neuroglancer/sliceview/compressed_segmentation/decode_common'; +import {decodeValueOffset} from '#src/sliceview/compressed_segmentation/decode_common.js'; /*% if dataType == 'uint64' %*/ -import {Uint64} from 'neuroglancer/util/uint64'; +import {Uint64} from '#src/util/uint64.js'; /*% endif %*/ /** diff --git a/templates/sliceview/compressed_segmentation/encode.template.ts b/templates/sliceview/compressed_segmentation/encode.template.ts index 126dc2a39c..177991d62f 100644 --- a/templates/sliceview/compressed_segmentation/encode.template.ts +++ b/templates/sliceview/compressed_segmentation/encode.template.ts @@ -19,11 +19,11 @@ * Support for compressing uint32/uint64 segment label chunks. */ -import {encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock} from 'neuroglancer/sliceview/compressed_segmentation/encode_common'; -import {getFortranOrderStrides} from 'neuroglancer/util/array'; -import {Uint32ArrayBuilder} from 'neuroglancer/util/uint32array_builder'; +import {encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock} from '#src/sliceview/compressed_segmentation/encode_common.js'; +import {getFortranOrderStrides} from '#src/util/array.js'; +import {Uint32ArrayBuilder} from '#src/util/uint32array_builder.js'; -export {newCache} from 'neuroglancer/sliceview/compressed_segmentation/encode_common'; +export {newCache} from '#src/sliceview/compressed_segmentation/encode_common.js'; let tempEncodingBuffer: Uint32Array; let tempValuesBuffer1: Uint32Array; @@ -39,7 +39,8 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder): [number, number] { const ax = actualSize[0], ay = actualSize[1], az = actualSize[2]; const bx = blockSize[0], by = blockSize[1], bz = blockSize[2]; - let sx = inputStrides[0], sy = inputStrides[1], sz = inputStrides[2]; + const sx = inputStrides[0]; + let sy = inputStrides[1], sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { diff --git a/templates/sliceview/compressed_segmentation/encode_common.template.ts b/templates/sliceview/compressed_segmentation/encode_common.template.ts index 71ae905d23..263878fd70 100644 --- a/templates/sliceview/compressed_segmentation/encode_common.template.ts +++ b/templates/sliceview/compressed_segmentation/encode_common.template.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Uint32ArrayBuilder} from 'neuroglancer/util/uint32array_builder'; +import {Uint32ArrayBuilder} from '#src/util/uint32array_builder.js'; export const BLOCK_HEADER_SIZE = 2; diff --git a/templates/util/pairing_heap.template.ts b/templates/util/pairing_heap.template.ts index 5f1f50c9eb..ab46374a10 100644 --- a/templates/util/pairing_heap.template.ts +++ b/templates/util/pairing_heap.template.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {PairingHeapOperations} from 'neuroglancer/util/pairing_heap'; +import { PairingHeapOperations } from "#src/util/pairing_heap.js"; interface Node { CHILD_PROPERTY: T|null; diff --git a/templates/util/typedarray_builder.template.ts b/templates/util/typedarray_builder.template.ts index b448b27670..2f438c1fba 100644 --- a/templates/util/typedarray_builder.template.ts +++ b/templates/util/typedarray_builder.template.ts @@ -16,7 +16,7 @@ export class $TYPE$Builder { length = 0; - data: $TYPE$; + data: $TYPE$; constructor(initialCapacity: number = 16) { this.data = new $TYPE$(initialCapacity); @@ -34,7 +34,7 @@ export class $TYPE$Builder { get view() { let {data} = this; - return new $TYPE$(data.buffer, data.byteOffset, this.length); + return new $TYPE$(data.buffer, data.byteOffset, this.length); } shrinkToFit() { From 0e02e358675de3a3ffd9433006e7215e64db9a08 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 11 Dec 2024 10:43:25 -0800 Subject: [PATCH 17/41] fix(fetchChunk): properly handle already-failed chunks This avoids the possibility of hangs when requesting a chunk via the Python API that is already in a FAILED state. --- src/sliceview/backend.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index d85be5105c..1612ea580f 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -545,6 +545,10 @@ registerPromiseRPC( // Already available on frontend. return { value: undefined }; } + if (chunk.state === ChunkState.FAILED) { + // Already failed + throw chunk.error; + } const disposeRecompute = chunkManager.recomputeChunkPriorities.add(() => { chunkManager.requestChunk( chunk, From 46dbd70954fd15921aeaff81e2dd169b8d2a9415 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 11 Dec 2024 11:05:16 -0800 Subject: [PATCH 18/41] fix(status): fix delayed visibility of modal status messages --- src/status.css | 12 ++--- src/status.ts | 131 +++++++++++++++++++++++++++++-------------------- 2 files changed, 84 insertions(+), 59 deletions(-) diff --git a/src/status.css b/src/status.css index b0d7b9c850..a5c9c922a8 100644 --- a/src/status.css +++ b/src/status.css @@ -14,7 +14,7 @@ * limitations under the License. */ -#statusContainer { +#neuroglancer-status-container { position: absolute; bottom: 0px; z-index: 100; @@ -25,7 +25,7 @@ font: 10pt sans-serif; } -#statusContainer li { +#neuroglancer-status-container li { width: 100vw; max-height: 25vh; overflow-y: auto; @@ -39,7 +39,7 @@ padding: 2px; } -#statusContainerModal { +#neuroglancer-status-container-modal { pointer-events: none; position: absolute; z-index: 100; @@ -57,7 +57,7 @@ grid-row-gap: 10px; } -#statusContainerModal > div { +#neuroglancer-status-container-modal > div { pointer-events: initial; position: relative; background-color: #808080; @@ -65,7 +65,7 @@ padding-top: 30px; } -#statusContainerModal > div > div:first-child { +#neuroglancer-status-container-modal > div > div:first-child { position: absolute; top: 4px; right: 4px; @@ -73,6 +73,6 @@ padding: 0; } -#statusContainerModal li { +#neuroglancer-status-container-modal li { display: block; } diff --git a/src/status.ts b/src/status.ts index 860165b915..07b2deb6d9 100644 --- a/src/status.ts +++ b/src/status.ts @@ -18,70 +18,63 @@ import "#src/status.css"; import { makeCloseButton } from "#src/widget/close_button.js"; -let statusContainer: HTMLElement | null = null; -let modalStatusContainer: HTMLElement | null = null; +let statusContainer: HTMLElement | undefined; +let modalStatusContainer: HTMLElement | undefined; export const DEFAULT_STATUS_DELAY = 200; export type Delay = boolean | number; +function getStatusContainer() { + if (statusContainer === undefined) { + statusContainer = document.createElement("ul"); + statusContainer.id = "neuroglancer-status-container"; + const el: HTMLElement | null = document.getElementById( + "neuroglancer-container", + ); + if (el) { + el.appendChild(statusContainer); + } else { + document.body.appendChild(statusContainer); + } + } + return statusContainer; +} + +function getModalStatusContainer() { + if (modalStatusContainer === undefined) { + modalStatusContainer = document.createElement("ul"); + modalStatusContainer.id = "neuroglancer-status-container-modal"; + const el: HTMLElement | null = document.getElementById( + "neuroglancer-container", + ); + if (el) { + el.appendChild(modalStatusContainer); + } else { + document.body.appendChild(modalStatusContainer); + } + } + return modalStatusContainer; +} + export class StatusMessage { element: HTMLElement; - modalElementWrapper: HTMLElement | undefined; + private modalElementWrapper: HTMLElement | undefined; private timer: number | null; + private visibility = true; constructor(delay: Delay = false, modal = false) { - if (statusContainer === null) { - statusContainer = document.createElement("ul"); - statusContainer.id = "statusContainer"; - const el: HTMLElement | null = document.getElementById( - "neuroglancer-container", - ); - if (el) { - el.appendChild(statusContainer); - } else { - document.body.appendChild(statusContainer); - } - } - if (modal && modalStatusContainer === null) { - modalStatusContainer = document.createElement("ul"); - modalStatusContainer.id = "statusContainerModal"; - const el: HTMLElement | null = document.getElementById( - "neuroglancer-container", - ); - if (el) { - el.appendChild(modalStatusContainer); - } else { - document.body.appendChild(modalStatusContainer); - } - } const element = document.createElement("li"); this.element = element; if (delay === true) { delay = DEFAULT_STATUS_DELAY; } + this.setModal(modal); if (delay !== false) { this.setVisible(false); this.timer = window.setTimeout(this.setVisible.bind(this, true), delay); } else { this.timer = null; } - if (modal) { - const modalElementWrapper = document.createElement("div"); - const dismissModalElement = makeCloseButton({ - title: "Dismiss", - onClick: () => { - this.dismissModal(); - }, - }); - dismissModalElement.classList.add("dismiss-modal"); - dismissModalElement.addEventListener("click", () => this.dismissModal()); - modalElementWrapper.appendChild(dismissModalElement); - modalElementWrapper.appendChild(element); - this.modalElementWrapper = modalElementWrapper; - modalStatusContainer!.appendChild(modalElementWrapper); - } else { - statusContainer.appendChild(element); - } } [Symbol.dispose]() { @@ -94,18 +87,10 @@ export class StatusMessage { } else { statusContainer!.removeChild(this.element); } - this.element = undefined; if (this.timer !== null) { clearTimeout(this.timer); } } - dismissModal() { - if (this.modalElementWrapper) { - modalStatusContainer!.removeChild(this.modalElementWrapper); - this.modalElementWrapper = undefined; - statusContainer!.appendChild(this.element); - } - } setText(text: string, makeVisible?: boolean) { this.element.textContent = text; if (makeVisible) { @@ -118,12 +103,52 @@ export class StatusMessage { this.setVisible(true); } } + setModal(value: boolean) { + if (value) { + if (this.modalElementWrapper === undefined) { + const modalElementWrapper = document.createElement("div"); + const dismissModalElement = makeCloseButton({ + title: "Dismiss", + onClick: () => { + this.setModal(false); + }, + }); + dismissModalElement.classList.add("neuroglancer-dismiss-modal"); + modalElementWrapper.appendChild(dismissModalElement); + modalElementWrapper.appendChild(this.element); + this.modalElementWrapper = modalElementWrapper; + this.applyVisibility(); + getModalStatusContainer().appendChild(modalElementWrapper); + } + } else { + if (this.modalElementWrapper !== undefined) { + modalStatusContainer!.removeChild(this.modalElementWrapper); + this.modalElementWrapper = undefined; + getStatusContainer().appendChild(this.element); + } else if (this.element.parentElement === null) { + getStatusContainer().appendChild(this.element); + } + } + } + + private applyVisibility() { + const newVisibility = this.visibility ? "" : "none"; + this.element.style.display = newVisibility; + const { modalElementWrapper } = this; + if (modalElementWrapper !== undefined) { + modalElementWrapper.style.display = newVisibility; + } + } + setVisible(value: boolean) { if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; } - this.element.style.display = value ? "block" : "none"; + if (value !== this.visibility) { + this.visibility = value; + this.applyVisibility(); + } } static forPromise( From a03db486d1dff543de774ac6c7767035613ed744 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 11 Dec 2024 13:16:07 -0800 Subject: [PATCH 19/41] chore(eslint): upgrade eslint --- .eslintignore | 16 - .eslintrc.yml | 68 - .ncurc.yml | 8 + MANIFEST.in | 4 +- build_tools/cli.ts | 2 +- eslint.config.js | 124 + package-lock.json | 5984 ++++++++--------- package.json | 43 +- src/datasource/graphene/frontend.ts | 2 +- src/datasource/render/frontend.ts | 2 +- src/datasource/zarr/metadata/parse.ts | 2 +- src/datasource/zarr/ome.ts | 2 +- src/layer/index.ts | 3 +- src/layer_groups_layout.ts | 2 +- src/navigation_state.ts | 2 +- .../property_map.ts | 2 +- src/trackable_vec3.ts | 2 +- src/widget/transfer_function.ts | 4 +- 18 files changed, 2951 insertions(+), 3321 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.yml create mode 100644 .ncurc.yml create mode 100644 eslint.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 897be2bcc9..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,16 +0,0 @@ -node_modules -dist -python -templates/neuroglancer/sliceview -src/third_party/jpgjs/jpg.js -templates -build -.tox -.nox -/lib -python -config -typings -src/mesh/draco/stub.js -tsconfig.tsbuildinfo -/examples diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index e033486195..0000000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,68 +0,0 @@ -root: true -parser: "@typescript-eslint/parser" -plugins: - - "@typescript-eslint" - - "import" -settings: - "import/parsers": - "@typescript-eslint/parser": [".ts", ".tsx"] - "import/resolver": - "typescript": - "node": -extends: - - "eslint:recommended" - - "plugin:@typescript-eslint/eslint-recommended" - - "plugin:@typescript-eslint/recommended" - - "plugin:import/recommended" -rules: - "@typescript-eslint/no-explicit-any": "off" - "@typescript-eslint/explicit-module-boundary-types": "off" - "@typescript-eslint/no-non-null-assertion": "off" - "@typescript-eslint/no-inferrable-types": "off" - "@typescript-eslint/no-this-alias": "off" - "@typescript-eslint/no-empty-function": "off" - "@typescript-eslint/no-empty-interface": "off" - "prefer-const": - - "error" - - destructuring: "all" - "no-constant-condition": "off" - "@typescript-eslint/no-unused-vars": - - "error" - - argsIgnorePattern: "^_" - ignoreRestSiblings: true - "@typescript-eslint/ban-types": - - "error" - - types: - # unban Function - "Function": false - extendDefaults: true - "no-unsafe-finally": "off" - "require-yield": "off" - "no-inner-declarations": "off" - "import/no-named-as-default": "off" - "import/no-named-as-default-member": "off" - "import/no-cycle": "error" - "@typescript-eslint/consistent-type-imports": "error" - "import/no-unresolved": "error" - "import/no-extraneous-dependencies": "error" - "import/first": "error" - "import/order": - - "error" - - groups: - - "builtin" - - "external" - - "internal" - alphabetize: - order: "asc" - orderImportKind: "asc" -overrides: - - files: - - "src/**/*" - rules: - "no-restricted-imports": - - "error" - - patterns: - - group: - - "./" - - "../" - message: "Relative imports are not allowed." diff --git a/.ncurc.yml b/.ncurc.yml new file mode 100644 index 0000000000..b6ef85ec0f --- /dev/null +++ b/.ncurc.yml @@ -0,0 +1,8 @@ +reject: + # API break + - "gl-matrix" + - "@types/gl-matrix" + # Newer versions don't support eslint + - "fork-ts-checker-webpack-plugin" + # API break + - "codemirror" diff --git a/MANIFEST.in b/MANIFEST.in index 6d3dbc6240..55b2673d8f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -14,7 +14,6 @@ prune examples exclude .clang-format exclude .editorconfig exclude .eslintignore -exclude .eslintrc exclude .style.yapf exclude cors_webserver.py exclude gulpfile.js @@ -36,7 +35,8 @@ exclude MANIFEST.in exclude *.ts exclude .prettierrc.yml exclude .prettierignore -exclude .eslintrc.yml +exclude eslint.config.js +exclude .ncurc.yml exclude index.html exclude webpack.config.js exclude firebase.json diff --git a/build_tools/cli.ts b/build_tools/cli.ts index c791dca5e6..2c3dda2292 100644 --- a/build_tools/cli.ts +++ b/build_tools/cli.ts @@ -23,7 +23,7 @@ import { pathToFileURL } from "node:url"; import path from "path"; import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin"; import type { Configuration } from "webpack"; -import webpackCli from "webpack-cli/lib/bootstrap.js"; // eslint-disable-line import/default +import webpackCli from "webpack-cli/lib/bootstrap.js"; import * as webpackMerge from "webpack-merge"; import yargs from "yargs"; import { normalizeConfigurationWithDefine } from "./webpack/configuration_with_define.js"; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000..e877f40fe4 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,124 @@ +// @ts-check + +import eslint from "@eslint/js"; +// @ts-expect-error missing .d.ts file +import importPlugin from "eslint-plugin-import"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { + ignores: [ + "**/node_modules", + "**/dist", + "**/python", + "templates/neuroglancer/sliceview", + "src/third_party/jpgjs/jpg.js", + "**/templates", + "**/build", + "**/.tox", + "**/.nox", + "lib", + "**/python", + "**/config", + "**/typings", + "src/mesh/draco/stub.js", + "**/tsconfig.tsbuildinfo", + "examples", + ], + }, + eslint.configs.recommended, + tseslint.configs.recommended, + importPlugin.flatConfigs.recommended, + importPlugin.flatConfigs.typescript, + { + settings: { + "import/resolver": { + typescript: {}, + node: {}, + }, + }, + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + + "prefer-const": [ + "error", + { + destructuring: "all", + }, + ], + + "no-constant-condition": "off", + + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + + "@typescript-eslint/no-unsafe-function-type": "off", + + "no-unsafe-finally": "off", + "require-yield": "off", + "no-inner-declarations": "off", + "import/no-named-as-default": "off", + "import/no-named-as-default-member": "off", + "import/no-cycle": [ + "error", + { + ignoreExternal: true, + disableScc: true, + }, + ], + "@typescript-eslint/consistent-type-imports": "error", + "import/no-unresolved": "error", + "import/no-extraneous-dependencies": "error", + "import/first": "error", + + "import/order": [ + "error", + { + groups: ["builtin", "external", "internal"], + + alphabetize: { + order: "asc", + orderImportKind: "asc", + }, + }, + ], + + // Neuroglancer uses `varname;` to suppress unused parameter warnings. + "@typescript-eslint/no-unused-expressions": "off", + }, + }, + { + files: ["src/**/*"], + + rules: { + "no-restricted-imports": [ + "error", + { + patterns: [ + { + group: ["./", "../"], + message: "Relative imports are not allowed.", + }, + ], + }, + ], + }, + }, + { + files: ["build_tools/**/*.cjs"], + languageOptions: { + sourceType: "commonjs", + }, + }, +); diff --git a/package-lock.json b/package-lock.json index d758dbf1ea..39beec0c26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,41 +19,38 @@ "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.16.0", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", + "@types/node": "^22.10.2", "@types/nunjucks": "^3.2.6", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", + "esbuild": "^0.24.0", "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", - "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", "fork-ts-checker-webpack-plugin": "^6.5.3", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", - "prettier": "3.3.3", + "prettier": "3.4.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", + "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -70,19 +67,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -199,21 +183,12 @@ } }, "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", "dev": true, "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" + "cookie": "^0.7.2" } }, "node_modules/@bundled-es-modules/statuses": { @@ -245,9 +220,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -261,9 +236,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -277,9 +252,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -293,9 +268,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -309,9 +284,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -325,9 +300,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -341,9 +316,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -357,9 +332,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -373,9 +348,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -389,9 +364,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -405,9 +380,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -421,9 +396,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -437,9 +412,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -453,9 +428,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -469,9 +444,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -485,9 +460,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -501,9 +476,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -517,9 +492,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -533,9 +508,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", "cpu": [ "arm64" ], @@ -549,9 +524,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -565,9 +540,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -581,9 +556,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -597,9 +572,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -613,9 +588,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -644,24 +619,72 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -669,7 +692,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -698,48 +721,68 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -755,40 +798,46 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@inquirer/confirm": { - "version": "3.1.17", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", - "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.0.tgz", + "integrity": "sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw==", "dev": true, "dependencies": { - "@inquirer/core": "^9.0.5", - "@inquirer/type": "^1.5.1" + "@inquirer/core": "^10.1.1", + "@inquirer/type": "^3.0.1" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", - "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.1.tgz", + "integrity": "sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==", "dev": true, "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.1", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.11", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", @@ -798,21 +847,6 @@ "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@inquirer/core/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -833,18 +867,6 @@ "node": ">=8" } }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -860,24 +882,24 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", - "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@isaacs/cliui": { @@ -993,9 +1015,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -1008,6 +1030,60 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", + "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -1015,16 +1091,16 @@ "dev": true }, "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.3.tgz", + "integrity": "sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==", "dev": true, "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", + "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" }, "engines": { @@ -1066,6 +1142,15 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1109,9 +1194,9 @@ "dev": true }, "node_modules/@promptbook/utils": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.58.0.tgz", - "integrity": "sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ==", + "version": "0.69.5", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", + "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", "dev": true, "funding": [ { @@ -1124,20 +1209,20 @@ } ], "dependencies": { - "spacetrim": "0.11.36" + "spacetrim": "0.11.59" } }, "node_modules/@puppeteer/browsers": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.4.tgz", - "integrity": "sha512-BdG2qiI1dn89OTUUsx2GZSpUzW+DRffR1wlMJyKxVHYrhnKoELSDxDd+2XImUkuWPEKk76H5FcM/gPFrEK1Tfw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.2", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" @@ -1149,27 +1234,10 @@ "node": ">=18" } }, - "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", - "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", "cpu": [ "arm" ], @@ -1180,9 +1248,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", - "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", "cpu": [ "arm64" ], @@ -1193,9 +1261,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", - "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", "cpu": [ "arm64" ], @@ -1206,9 +1274,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", - "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", "cpu": [ "x64" ], @@ -1218,10 +1286,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", - "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", "cpu": [ "arm" ], @@ -1232,9 +1326,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", - "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", "cpu": [ "arm" ], @@ -1245,9 +1339,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", - "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", "cpu": [ "arm64" ], @@ -1258,9 +1352,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", - "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", "cpu": [ "arm64" ], @@ -1270,10 +1364,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", - "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", "cpu": [ "ppc64" ], @@ -1284,9 +1391,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", - "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", "cpu": [ "riscv64" ], @@ -1297,9 +1404,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", - "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", "cpu": [ "s390x" ], @@ -1310,9 +1417,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", - "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", "cpu": [ "x64" ], @@ -1323,9 +1430,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", - "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", "cpu": [ "x64" ], @@ -1336,9 +1443,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", - "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", "cpu": [ "arm64" ], @@ -1349,9 +1456,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", - "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", "cpu": [ "ia32" ], @@ -1362,9 +1469,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", - "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", "cpu": [ "x64" ], @@ -1374,36 +1481,18 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -1502,9 +1591,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1522,9 +1611,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/express": { @@ -1563,12 +1652,6 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -1576,9 +1659,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -1641,22 +1724,13 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", - "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/node-forge": { @@ -1728,6 +1802,12 @@ "@types/node": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "dev": true + }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -1764,12 +1844,6 @@ "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -1780,9 +1854,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -1805,77 +1879,69 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", - "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", + "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/type-utils": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/type-utils": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", - "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1883,39 +1949,35 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", - "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/utils": "7.17.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", - "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1923,90 +1985,97 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", - "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", - "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0" + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", - "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/@vitest/browser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.0.4.tgz", - "integrity": "sha512-QsIkbqPqHsXvgxjCjjgKjuWKmrC0VJgpaDkuEmOy5gTnErhhifWIfp3HpH92K7cscfaIao+RlKv5f8nUMgjfmA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.8.tgz", + "integrity": "sha512-OWVvEJThRgxlNMYNVLEK/9qVkpRcLvyuKLngIV3Hob01P56NjPHprVBYn+rx4xAJudbM9yrCrywPIEuA3Xyo8A==", "dev": true, "dependencies": { - "@testing-library/dom": "^10.3.1", + "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.5.2", - "@vitest/utils": "2.0.4", - "magic-string": "^0.30.10", - "msw": "^2.3.1", - "sirv": "^2.0.4", + "@vitest/mocker": "2.1.8", + "@vitest/utils": "2.1.8", + "magic-string": "^0.30.12", + "msw": "^2.6.4", + "sirv": "^3.0.0", + "tinyrainbow": "^1.2.0", "ws": "^8.18.0" }, "funding": { @@ -2014,7 +2083,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "2.0.4", + "vitest": "2.1.8", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -2029,25 +2098,65 @@ } } }, + "node_modules/@vitest/browser/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@vitest/expect": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "dev": true, "dependencies": { - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, "dependencies": { "tinyrainbow": "^1.2.0" @@ -2057,12 +2166,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, "dependencies": { - "@vitest/utils": "2.0.4", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -2070,13 +2179,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.0.4", - "magic-string": "^0.30.10", + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { @@ -2084,47 +2193,60 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "dev": true, "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/ui": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.4.tgz", - "integrity": "sha512-9SNE9ve3kgDkVTxJsY7BjqSwyqDVRJbq/AHVHZs+V0vmr/0cCX6yGT6nOahSXEsXFtKAsvRtBXKlTgr+5njzZQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.8.tgz", + "integrity": "sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==", "dev": true, "dependencies": { - "@vitest/utils": "2.0.4", - "fast-glob": "^3.3.2", + "@vitest/utils": "2.1.8", "fflate": "^0.8.2", "flatted": "^3.3.1", "pathe": "^1.1.2", - "sirv": "^2.0.4", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.4" + "vitest": "2.1.8" + } + }, + "node_modules/@vitest/ui/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/@vitest/utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.0.4", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -2132,21 +2254,21 @@ } }, "node_modules/@wdio/config": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.39.0.tgz", - "integrity": "sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==", + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", + "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", "dev": true, "dependencies": { - "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", + "deepmerge-ts": "^7.0.3", "glob": "^10.2.2", "import-meta-resolve": "^4.0.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, "node_modules/@wdio/config/node_modules/glob": { @@ -2207,9 +2329,9 @@ } }, "node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", + "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, "dependencies": { "chalk": "^5.1.2", @@ -2218,13 +2340,13 @@ "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, "node_modules/@wdio/logger/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -2261,202 +2383,232 @@ } }, "node_modules/@wdio/protocols": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", - "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", + "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", "dev": true }, "node_modules/@wdio/repl": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", - "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", + "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", "dev": true, "dependencies": { "@types/node": "^20.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" + } + }, + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" } }, + "node_modules/@wdio/repl/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "node_modules/@wdio/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.39.0.tgz", - "integrity": "sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", + "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", "dev": true, "dependencies": { "@types/node": "^20.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" + } + }, + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" } }, + "node_modules/@wdio/types/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "node_modules/@wdio/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==", + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", + "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", "dev": true, "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", + "@puppeteer/browsers": "^2.2.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.5.0", - "geckodriver": "^4.3.1", + "deepmerge-ts": "^7.0.3", + "edgedriver": "^5.6.1", + "geckodriver": "^4.3.3", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", + "locate-app": "^2.2.24", + "safaridriver": "^0.1.2", "split2": "^4.2.0", - "wait-port": "^1.0.4" + "wait-port": "^1.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2517,9 +2669,9 @@ "dev": true }, "node_modules/@zip.js/zip.js": { - "version": "2.7.47", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.47.tgz", - "integrity": "sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==", + "version": "2.7.54", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", + "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", "dev": true, "engines": { "bun": ">=0.7.0", @@ -2573,9 +2725,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2604,15 +2756,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2631,13 +2774,10 @@ } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } @@ -2705,63 +2845,25 @@ "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "type-fest": "^1.0.2" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -3006,13 +3108,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3033,15 +3138,16 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3051,26 +3157,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3116,17 +3214,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -3179,15 +3278,6 @@ "node": ">=4" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -3214,10 +3304,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3257,9 +3350,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, "optional": true, "dependencies": { @@ -3269,9 +3362,9 @@ } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, "optional": true }, @@ -3286,13 +3379,13 @@ } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.5.2.tgz", + "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", "dev": true, "optional": true, "dependencies": { - "streamx": "^2.18.0" + "streamx": "^2.21.0" } }, "node_modules/base64-js": { @@ -3356,35 +3449,10 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -3395,7 +3463,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -3430,12 +3498,12 @@ "dev": true }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -3460,52 +3528,18 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { "fill-range": "^7.1.1" @@ -3543,9 +3577,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -3562,10 +3596,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3653,54 +3687,48 @@ "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", "dev": true, "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3725,22 +3753,10 @@ "tslib": "^2.0.3" } }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001596", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", - "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "dev": true, "funding": [ { @@ -3763,9 +3779,9 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, "dependencies": { "assertion-error": "^2.0.1", @@ -3803,6 +3819,214 @@ "node": ">= 16" } }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3848,18 +4072,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3887,45 +4099,6 @@ "node": ">= 10.0" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -4047,12 +4220,6 @@ "node": ">= 0.8" } }, - "node_modules/comlink": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", - "dev": true - }, "node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -4062,12 +4229,6 @@ "node": "^12.20.0 || >=14" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, "node_modules/compress-commons": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", @@ -4264,9 +4425,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "engines": { "node": ">= 0.6" @@ -4368,68 +4529,17 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { - "whatwg-url": "^5.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/cross-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/cross-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "node": ">= 8" } }, "node_modules/css-loader": { @@ -4578,6 +4688,57 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -4585,12 +4746,12 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4613,33 +4774,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -4664,9 +4798,9 @@ } }, "node_modules/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, "engines": { "node": ">=16.0.0" @@ -4700,131 +4834,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -4912,24 +4936,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/devtools-protocol": { - "version": "0.0.1302984", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz", - "integrity": "sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -4942,18 +4948,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -5043,6 +5037,20 @@ "tslib": "^2.0.3" } }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -5088,16 +5096,17 @@ } }, "node_modules/edgedriver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.0.tgz", - "integrity": "sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", + "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^8.28.0", - "@zip.js/zip.js": "^2.7.44", + "@wdio/logger": "^8.38.0", + "@zip.js/zip.js": "^2.7.48", "decamelize": "^6.0.0", "edge-paths": "^3.0.5", + "fast-xml-parser": "^4.4.1", "node-fetch": "^3.3.2", "which": "^4.0.0" }, @@ -5105,6 +5114,45 @@ "edgedriver": "bin/edgedriver.js" } }, + "node_modules/edgedriver/node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "dev": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/edgedriver/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/edgedriver/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/edgedriver/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -5114,6 +5162,21 @@ "node": ">=16" } }, + "node_modules/edgedriver/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/edgedriver/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -5175,9 +5238,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.699", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", - "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", + "version": "1.5.72", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", + "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", "dev": true }, "node_modules/element-size": { @@ -5200,47 +5263,71 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", "dev": true, "dependencies": { - "once": "^1.4.0" + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/encoding-sniffer/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "iconv-lite": "0.6.3" }, "engines": { - "node": ">=8.6" + "node": ">=18" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/entities": { @@ -5274,50 +5361,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -5326,21 +5420,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -5373,9 +5497,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "bin": { @@ -5385,30 +5509,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/esbuild-loader": { @@ -5836,9 +5960,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -5883,71 +6007,62 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", - "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" + "url": "https://eslint.org/donate" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-import-resolver-node": { @@ -5971,18 +6086,19 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5992,82 +6108,22 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-interactive": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/eslint-interactive/-/eslint-interactive-10.8.0.tgz", - "integrity": "sha512-bsMSr0NVyxoSbKbA3Rn8so5+A9q+Zu8xExiIM18umPjrqfBAN8WcJfsWvfc9Myfiqn2WwLDM9mRglbx+Hp+z3Q==", - "dev": true, - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -6091,34 +6147,36 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -6174,16 +6232,16 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6202,16 +6260,16 @@ } }, "node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", "dev": true, "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", + "@types/eslint": "^8.56.10", + "jest-worker": "^29.7.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" + "schema-utils": "^4.2.0" }, "engines": { "node": ">= 14.15.0" @@ -6221,7 +6279,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "eslint": "^8.0.0", + "eslint": "^8.0.0 || ^9.0.0", "webpack": "^5.0.0" } }, @@ -6318,6 +6376,18 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6331,17 +6401,29 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6440,115 +6522,47 @@ "node": ">=0.4.x" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6557,6 +6571,19 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, "node_modules/express/node_modules/debug": { @@ -6574,13 +6601,19 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -6625,21 +6658,6 @@ "@types/yauzl": "^2.9.1" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6720,6 +6738,34 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -6788,15 +6834,15 @@ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -6812,13 +6858,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -6844,22 +6890,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6886,17 +6916,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -6906,9 +6935,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -7185,15 +7214,6 @@ "node": ">= 10.0.0" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -7224,29 +7244,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs-monkey": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", @@ -7309,17 +7306,17 @@ } }, "node_modules/geckodriver": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.2.tgz", - "integrity": "sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.5.1.tgz", + "integrity": "sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==", "dev": true, "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^8.28.0", - "@zip.js/zip.js": "^2.7.44", + "@wdio/logger": "^9.0.0", + "@zip.js/zip.js": "^2.7.48", "decamelize": "^6.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", + "https-proxy-agent": "^7.0.5", "node-fetch": "^3.3.2", "tar-fs": "^3.0.6", "which": "^4.0.0" @@ -7364,25 +7361,23 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", + "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7401,25 +7396,29 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -7441,15 +7440,14 @@ } }, "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "debug": "^4.3.4" }, "engines": { "node": ">= 14" @@ -7533,55 +7531,26 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7590,26 +7559,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glsl-editor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", @@ -7631,52 +7580,15 @@ "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -7775,22 +7687,25 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -7799,9 +7714,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "engines": { "node": ">= 0.4" @@ -7811,12 +7726,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7826,9 +7741,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7871,22 +7786,6 @@ "whatwg-encoding": "^1.0.1" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -7924,9 +7823,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -7955,6 +7854,12 @@ } } }, + "node_modules/htmlfy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", + "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", + "dev": true + }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -7974,12 +7879,6 @@ "entities": "^2.0.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -8036,9 +7935,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", @@ -8085,39 +7984,26 @@ "npm": ">=1.3.7" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "engines": { - "node": ">=16.17.0" + "node": ">=10.18" } }, "node_modules/iconv-lite": { @@ -8322,27 +8208,18 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/insert-css": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -8388,14 +8265,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8407,6 +8286,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -8452,6 +8346,15 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -8465,11 +8368,29 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8522,6 +8443,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -8530,6 +8466,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8560,38 +8511,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -8642,15 +8577,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -8676,13 +8602,15 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -8691,28 +8619,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-string": { @@ -8746,12 +8677,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8765,16 +8696,16 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { @@ -8789,6 +8720,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -9259,18 +9206,6 @@ "node": ">=0.10.0" } }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", @@ -9351,9 +9286,9 @@ } }, "node_modules/locate-app": { - "version": "2.4.21", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.21.tgz", - "integrity": "sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", "dev": true, "funding": [ { @@ -9366,18 +9301,18 @@ } ], "dependencies": { - "@promptbook/utils": "0.58.0", - "type-fest": "2.13.0", - "userhome": "1.0.0" + "@promptbook/utils": "0.69.5", + "type-fest": "4.26.0", + "userhome": "1.0.1" } }, "node_modules/locate-app/node_modules/type-fest": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", - "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", "dev": true, "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9425,50 +9360,16 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, "node_modules/lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "dev": true }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, "engines": { "node": ">= 0.6.0" @@ -9485,13 +9386,10 @@ "dev": true }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true }, "node_modules/lower-case": { "version": "2.0.2", @@ -9502,18 +9400,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", @@ -9533,12 +9419,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.15", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz", + "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/media-typer": { @@ -9551,11 +9437,14 @@ } }, "node_modules/memfs": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", - "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.0.tgz", + "integrity": "sha512-q9MmZXd2rRWHS6GU3WEm3HyiXZyyoA1DqdOhEq0lxPBmKb5S7IAOwX0RgUCwJfqjelDCySa5h8ujOy24LqsWcw==", "dev": true, "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", "tslib": "^2.0.0" }, "engines": { @@ -9567,10 +9456,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-source-map": { "version": "1.0.4", @@ -9613,12 +9505,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -9656,31 +9548,10 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -9786,12 +9657,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -9802,23 +9667,24 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/msw": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", - "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.6.8.tgz", + "integrity": "sha512-nxXxnH6WALZ9a7rsQp4HU2AaD4iGAiouMmE/MY4al7pXTibgA6OZOuKhmN2WBIM6w9qMKwRtX8p2iOb45B2M/Q==", "dev": true, "hasInstallScript": true, "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.37.0", + "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", @@ -9826,10 +9692,10 @@ "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", + "type-fest": "^4.26.1", "yargs": "^17.7.2" }, "bin": { @@ -9842,7 +9708,7 @@ "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.7.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -9850,16 +9716,10 @@ } } }, - "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, "node_modules/msw/node_modules/type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", "dev": true, "engines": { "node": ">=16" @@ -9882,18 +9742,18 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -10003,9 +9863,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/nopt": { @@ -10031,30 +9891,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -10123,20 +9959,14 @@ "node": "*" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10169,14 +9999,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10186,26 +10017,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10250,21 +10083,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -10309,83 +10127,12 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/outvariant": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10443,19 +10190,19 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -10524,27 +10271,115 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-parser-stream/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, @@ -10591,9 +10426,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, "node_modules/path-type": { @@ -10632,9 +10467,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -10649,112 +10484,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, - "node_modules/pkg-dir/node_modules/yocto-queue": { + "node_modules/possible-typed-array-names": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -10772,8 +10519,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -10867,9 +10614,9 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10981,19 +10728,19 @@ } }, "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", + "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -11020,9 +10767,9 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, "dependencies": { "end-of-stream": "^1.1.0", @@ -11037,58 +10784,6 @@ "node": ">=6" } }, - "node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -11135,18 +10830,6 @@ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "dev": true }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/quote-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", @@ -11286,6 +10969,28 @@ "node": ">= 10.13.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", + "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.0", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -11293,14 +10998,15 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -11470,12 +11176,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -11515,21 +11215,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/resq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", @@ -11545,28 +11230,6 @@ "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", "dev": true }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -11592,108 +11255,54 @@ "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", "dev": true }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/rollup": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.6" }, "bin": { - "rimraf": "bin.js" + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", + "fsevents": "~2.3.2" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rollup": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", - "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.0", - "@rollup/rollup-android-arm64": "4.19.0", - "@rollup/rollup-darwin-arm64": "4.19.0", - "@rollup/rollup-darwin-x64": "4.19.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", - "@rollup/rollup-linux-arm-musleabihf": "4.19.0", - "@rollup/rollup-linux-arm64-gnu": "4.19.0", - "@rollup/rollup-linux-arm64-musl": "4.19.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", - "@rollup/rollup-linux-riscv64-gnu": "4.19.0", - "@rollup/rollup-linux-s390x-gnu": "4.19.0", - "@rollup/rollup-linux-x64-gnu": "4.19.0", - "@rollup/rollup-linux-x64-musl": "4.19.0", - "@rollup/rollup-win32-arm64-msvc": "4.19.0", - "@rollup/rollup-win32-ia32-msvc": "4.19.0", - "@rollup/rollup-win32-x64-msvc": "4.19.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { @@ -11726,13 +11335,13 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11763,13 +11372,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -11838,9 +11447,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -11876,11 +11485,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/serialize-error": { "version": "11.0.3", @@ -11985,45 +11597,47 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12096,14 +11710,72 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12126,12 +11798,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==", - "dev": true - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -12146,32 +11812,6 @@ "node": ">= 10" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -12217,12 +11857,12 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" }, @@ -12246,9 +11886,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12265,9 +11905,9 @@ } }, "node_modules/spacetrim": { - "version": "0.11.36", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.36.tgz", - "integrity": "sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw==", + "version": "0.11.59", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", + "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", "dev": true, "funding": [ { @@ -12363,6 +12003,12 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -12518,26 +12164,11 @@ } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dev": true, - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -12547,9 +12178,9 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", + "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", "dev": true, "dependencies": { "fast-fifo": "^1.3.2", @@ -12640,14 +12271,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12657,28 +12292,35 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12716,18 +12358,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12740,6 +12370,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", @@ -12768,19 +12404,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -12792,106 +12415,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", - "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12926,22 +12454,6 @@ "streamx": "^2.15.0" } }, - "node_modules/terminal-link": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", - "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.29.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", @@ -13009,11 +12521,17 @@ "b4a": "^1.6.4" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } }, "node_modules/through": { "version": "2.3.8", @@ -13058,15 +12576,60 @@ "dev": true }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -13082,9 +12645,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "engines": { "node": ">=14.0.0" @@ -13143,10 +12706,26 @@ "punycode": "^2.1.0" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "engines": { "node": ">=16" @@ -13186,12 +12765,12 @@ "dev": true }, "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dev": true, "dependencies": { - "esbuild": "~0.21.5", + "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -13205,9 +12784,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", "cpu": [ "ppc64" ], @@ -13217,13 +12796,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ "arm" ], @@ -13233,13 +12812,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ "arm64" ], @@ -13249,13 +12828,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ "x64" ], @@ -13265,13 +12844,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ "arm64" ], @@ -13281,13 +12860,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ "x64" ], @@ -13297,13 +12876,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], @@ -13313,13 +12892,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", "cpu": [ "x64" ], @@ -13329,13 +12908,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", "cpu": [ "arm" ], @@ -13345,13 +12924,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", "cpu": [ "arm64" ], @@ -13361,13 +12940,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", "cpu": [ "ia32" ], @@ -13377,13 +12956,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", "cpu": [ "loong64" ], @@ -13393,13 +12972,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", "cpu": [ "mips64el" ], @@ -13409,13 +12988,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", "cpu": [ "ppc64" ], @@ -13425,13 +13004,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", "cpu": [ "riscv64" ], @@ -13441,13 +13020,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", "cpu": [ "s390x" ], @@ -13457,13 +13036,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", "cpu": [ "x64" ], @@ -13473,13 +13052,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", "cpu": [ "x64" ], @@ -13489,13 +13068,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", "cpu": [ "x64" ], @@ -13505,13 +13100,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", "cpu": [ "x64" ], @@ -13521,13 +13116,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], @@ -13537,13 +13132,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" ], @@ -13553,13 +13148,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", "cpu": [ "x64" ], @@ -13569,45 +13164,46 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/tunnel-agent": { @@ -13664,29 +13260,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -13696,16 +13293,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -13715,14 +13314,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13746,6 +13351,28 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.0.tgz", + "integrity": "sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.18.0", + "@typescript-eslint/parser": "8.18.0", + "@typescript-eslint/utils": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -13795,10 +13422,19 @@ "ieee754": "^1.1.13" } }, + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, "node_modules/universalify": { @@ -13820,9 +13456,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -13839,8 +13475,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -13867,10 +13503,16 @@ "requires-port": "^1.0.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "node_modules/userhome": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", - "integrity": "sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", + "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -13933,14 +13575,14 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -13959,6 +13601,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -13976,6 +13619,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -13988,15 +13634,15 @@ } }, "node_modules/vite-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", "dev": true, "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -14009,23 +13655,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-node/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -14433,29 +14062,30 @@ } }, "node_modules/vitest": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.4", - "@vitest/pretty-format": "^2.0.4", - "@vitest/runner": "2.0.4", - "@vitest/snapshot": "2.0.4", - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.4", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { @@ -14470,8 +14100,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.4", - "@vitest/ui": "2.0.4", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -14496,23 +14126,6 @@ } } }, - "node_modules/vitest/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -14566,15 +14179,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -14585,92 +14189,122 @@ } }, "node_modules/webdriver": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.39.0.tgz", - "integrity": "sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.4.1.tgz", + "integrity": "sha512-vFDdxMj/9W1+6jhpHSiRYfO8dix23HjAUtLx7aOv9ejEsntC0EzCIAftJ59YsF3Ppu184+FkdDVhnivpkZPTFw==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.39.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "deepmerge-ts": "^7.0.3", + "undici": "^6.20.1", "ws": "^8.8.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/webdriverio": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.39.1.tgz", - "integrity": "sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==", + "node_modules/webdriver/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.39.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "archiver": "^7.0.0", - "aria-query": "^5.0.0", + "undici-types": "~6.19.2" + } + }, + "node_modules/webdriver/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/webdriverio": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.4.1.tgz", + "integrity": "sha512-XIPtRnxSES4CoxH2BfUY/6QzNgEgJEUjMYu7t7SJR8bVfbLRVXAA1ie9kM0MtdLs4oZ2Pr8rR8fqytsA1CjEWw==", + "dev": true, + "dependencies": { + "@types/node": "^20.11.30", + "@types/sinonjs__fake-timers": "^8.1.5", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/repl": "9.0.8", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "archiver": "^7.0.1", + "aria-query": "^5.3.0", + "cheerio": "^1.0.0-rc.12", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1302984", - "grapheme-splitter": "^1.0.2", + "grapheme-splitter": "^1.0.4", + "htmlfy": "^0.3.0", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", "jszip": "^3.10.1", "lodash.clonedeep": "^4.5.0", "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", + "minimatch": "^9.0.3", + "query-selector-shadow-dom": "^1.0.1", + "resq": "^1.11.0", "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.39.0" + "serialize-error": "^11.0.3", + "urlpattern-polyfill": "^10.0.0", + "webdriver": "9.4.1" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" }, "peerDependencies": { - "devtools": "^8.14.0" + "puppeteer-core": "^22.3.0" }, "peerDependenciesMeta": { - "devtools": { + "puppeteer-core": { "optional": true } } }, + "node_modules/webdriverio/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/webdriverio/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -14836,9 +14470,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -14865,15 +14499,15 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -14899,9 +14533,9 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -14910,7 +14544,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -14918,9 +14552,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.13", @@ -14936,23 +14570,20 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.7", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", - "rimraf": "^5.0.5", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -15004,87 +14635,12 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/webpack-dev-server/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -15244,17 +14800,62 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15279,21 +14880,6 @@ "node": ">=8" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index 8569da54f8..cdc20841e2 100644 --- a/package.json +++ b/package.json @@ -41,41 +41,38 @@ "version": "tsx ./build_tools/after-version-change.ts" }, "devDependencies": { + "@eslint/js": "^9.16.0", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", + "@types/node": "^22.10.2", "@types/nunjucks": "^3.2.6", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", + "esbuild": "^0.24.0", "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", - "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-webpack-plugin": "^4.2.0", "fork-ts-checker-webpack-plugin": "^6.5.3", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", - "prettier": "3.3.3", + "prettier": "3.4.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", + "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", + "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 6cd7dc6692..71790be466 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -245,7 +245,7 @@ class AppInfo { "supported_api_versions", (x) => parseArray(x, verifyNonnegativeInt), ); - } catch (error) { + } catch { // Dealing with a prehistoric graph server with no version information this.supported_api_versions = [0]; } diff --git a/src/datasource/render/frontend.ts b/src/datasource/render/frontend.ts index 66370a7154..6fd9b0225d 100644 --- a/src/datasource/render/frontend.ts +++ b/src/datasource/render/frontend.ts @@ -249,7 +249,7 @@ function parseStackVersionInfo(stackVersionObj: any): vec3 { "stackResolutionZ", verifyFloat, ); - } catch (ignoredError) { + } catch { // default is 1, 1, 1 voxelResolution[0] = 1; voxelResolution[1] = 1; diff --git a/src/datasource/zarr/metadata/parse.ts b/src/datasource/zarr/metadata/parse.ts index a4f515f98e..3af2732fe0 100644 --- a/src/datasource/zarr/metadata/parse.ts +++ b/src/datasource/zarr/metadata/parse.ts @@ -77,7 +77,7 @@ const UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision + // eslint-disable-next-line no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index dafd8ac4dd..ebeed9b195 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -46,7 +46,7 @@ const OME_UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision + // eslint-disable-next-line no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], diff --git a/src/layer/index.ts b/src/layer/index.ts index c5e2f7e6fd..d7b1755d97 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -1247,8 +1247,7 @@ const DATA_SELECTION_STATE_DEFAULT_PANEL_LOCATION_VISIBLE = { export class TrackableDataSelectionState extends RefCounted - implements - TrackableValueInterface + implements TrackableValueInterface { changed = new NullarySignal(); history: PersistentViewerSelectionState[] = []; diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index fb9bd92114..ca8c0898e3 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -518,7 +518,7 @@ function setupDropZone( event.stopPropagation(); try { layoutSpec = JSON.parse(event.dataTransfer!.getData(viewerDragType)); - } catch (e) { + } catch { return; } dropLayers = getDropLayers(event, manager, { diff --git a/src/navigation_state.ts b/src/navigation_state.ts index 4ccfd47095..ca3dfc3e65 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -1010,7 +1010,7 @@ export class OrientationState extends RefCounted { try { parseFiniteVec(this.orientation, obj); quat.normalize(this.orientation, this.orientation); - } catch (ignoredError) { + } catch { quat.identity(this.orientation); } this.changed.dispatch(); diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index 4fa7c85453..e4e5d90f39 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -681,7 +681,7 @@ export function parseSegmentQuery( } try { parsed.regexp = new RegExp(word.substring(1)); - } catch (e) { + } catch { errors.push({ begin: startIndex, end: endIndex, diff --git a/src/trackable_vec3.ts b/src/trackable_vec3.ts index c220858393..fe233b52af 100644 --- a/src/trackable_vec3.ts +++ b/src/trackable_vec3.ts @@ -48,7 +48,7 @@ export class TrackableVec3 implements Trackable { restoreState(x: any) { try { this.value = verify3dVec(x.split(",")); - } catch (e) { + } catch { this.value = this.defaultValue; } } diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 5e439a168b..35e325de9b 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -593,7 +593,7 @@ abstract class BaseLookupTexture extends RefCounted { */ class DirectLookupTableTexture extends BaseLookupTexture { texture: WebGLTexture | null = null; - protected declare priorOptions: LookupTableTextureOptions | undefined; + declare protected priorOptions: LookupTableTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); @@ -622,7 +622,7 @@ class DirectLookupTableTexture extends BaseLookupTexture { } export class ControlPointTexture extends BaseLookupTexture { - protected declare priorOptions: ControlPointTextureOptions | undefined; + declare protected priorOptions: ControlPointTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); } From d5b26504588019f39d575a5c01db34038f8d9884 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 12 Dec 2024 12:50:39 -0800 Subject: [PATCH 20/41] chore: switch to rspack from webpack --- .ncurc.yml | 3 - MANIFEST.in | 2 +- build_tools/cli.ts | 36 +- .../configuration_with_define.js | 8 +- build_tools/rspack/rspack_config_from_cli.js | 12 + .../webpack/webpack_config_from_cli.cjs | 14 - .../parcel-project-built/package-lock.json | 1 + .../parcel-project-source/package-lock.json | 4451 +-------- .../rsbuild-project-source/package-lock.json | 3343 +------ .../rspack-project-source/package-lock.json | 3355 +------ .../vite-project-source/package-lock.json | 3327 +------ .../webpack-project-source/package-lock.json | 3301 +------ package-lock.json | 8188 ++++++++--------- package.json | 13 +- webpack.config.js => rspack.config.js | 72 +- 15 files changed, 4935 insertions(+), 21191 deletions(-) rename build_tools/{webpack => rspack}/configuration_with_define.js (51%) create mode 100644 build_tools/rspack/rspack_config_from_cli.js delete mode 100644 build_tools/webpack/webpack_config_from_cli.cjs rename webpack.config.js => rspack.config.js (65%) diff --git a/.ncurc.yml b/.ncurc.yml index b6ef85ec0f..4250db1cf6 100644 --- a/.ncurc.yml +++ b/.ncurc.yml @@ -2,7 +2,4 @@ reject: # API break - "gl-matrix" - "@types/gl-matrix" - # Newer versions don't support eslint - - "fork-ts-checker-webpack-plugin" - # API break - "codemirror" diff --git a/MANIFEST.in b/MANIFEST.in index 55b2673d8f..54472f0285 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -38,6 +38,6 @@ exclude .prettierignore exclude eslint.config.js exclude .ncurc.yml exclude index.html -exclude webpack.config.js +exclude rspack.config.js exclude firebase.json exclude .firebaserc diff --git a/build_tools/cli.ts b/build_tools/cli.ts index 2c3dda2292..0ea4a51df1 100644 --- a/build_tools/cli.ts +++ b/build_tools/cli.ts @@ -16,18 +16,17 @@ // Command-line interface for building Neuroglancer. -/// - import process from "node:process"; import { pathToFileURL } from "node:url"; import path from "path"; -import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin"; -import type { Configuration } from "webpack"; -import webpackCli from "webpack-cli/lib/bootstrap.js"; +import { RspackCLI } from "@rspack/cli"; +import type { Configuration } from "@rspack/core"; +import ESLintPlugin from "eslint-rspack-plugin"; +import { TsCheckerRspackPlugin } from "ts-checker-rspack-plugin"; import * as webpackMerge from "webpack-merge"; import yargs from "yargs"; -import { normalizeConfigurationWithDefine } from "./webpack/configuration_with_define.js"; -import { setConfig } from "./webpack/webpack_config_from_cli.cjs"; +import { normalizeConfigurationWithDefine } from "./rspack/configuration_with_define.js"; +import { setConfig } from "./rspack/rspack_config_from_cli.js"; export interface WebpackConfigurationWithDefine extends Configuration { define?: Record | undefined; @@ -81,7 +80,7 @@ async function getWebpackConfig( ...extraConfigs: WebpackConfigurationWithDefine[] ): Promise<(...args: any[]) => Configuration> { const configPaths = [ - pathToFileURL(path.resolve(import.meta.dirname, "../webpack.config.js")) + pathToFileURL(path.resolve(import.meta.dirname, "../rspack.config.js")) .href, ...argv.config.map((configPath) => pathToFileURL(configPath).href), ]; @@ -109,15 +108,15 @@ async function getWebpackConfig( outDir = path.resolve(outDir); } const plugins = []; - if (argv.typecheck || argv.lint) { + if (argv.typecheck) { + plugins.push(new TsCheckerRspackPlugin()); + } + if (argv.lint) { plugins.push( - new ForkTsCheckerWebpackPlugin({ - typescript: argv.typecheck, - eslint: argv.lint - ? { - files: ".", - } - : undefined, + new ESLintPlugin({ + configType: "flat", + files: ".", + threads: true, }), ); } @@ -141,12 +140,11 @@ async function getWebpackConfig( } async function runWebpack(...args: string[]) { - // @ts-expect-error: no typings available - await webpackCli([ + await new RspackCLI().run([ ...process.argv.slice(0, 2), ...args, "--config", - path.resolve(import.meta.dirname, "webpack", "webpack_config_from_cli.cjs"), + path.resolve(import.meta.dirname, "rspack", "rspack_config_from_cli.js"), ]); } diff --git a/build_tools/webpack/configuration_with_define.js b/build_tools/rspack/configuration_with_define.js similarity index 51% rename from build_tools/webpack/configuration_with_define.js rename to build_tools/rspack/configuration_with_define.js index 602ac51425..81dfff9aaf 100644 --- a/build_tools/webpack/configuration_with_define.js +++ b/build_tools/rspack/configuration_with_define.js @@ -1,13 +1,13 @@ -// Converts a webpack configuration that optionally contains an extra `define` -// property into a regular webpack configuration with an added `DefinePlugin`. +// Converts an rspack configuration that optionally contains an extra `define` +// property into a regular rspack configuration with an added `DefinePlugin`. -import webpack from "webpack"; +import { DefinePlugin } from "@rspack/core"; export function normalizeConfigurationWithDefine(config) { let { define, plugins, ...rest } = config; if (define !== undefined && Object.keys(define).length > 0) { plugins ??= []; - plugins.push(new webpack.DefinePlugin(define)); + plugins.push(new DefinePlugin(define)); } return { plugins, ...rest }; } diff --git a/build_tools/rspack/rspack_config_from_cli.js b/build_tools/rspack/rspack_config_from_cli.js new file mode 100644 index 0000000000..4ef6bd67d1 --- /dev/null +++ b/build_tools/rspack/rspack_config_from_cli.js @@ -0,0 +1,12 @@ +// This module is specified as the rspack config module when `cli.ts` invokes +// `@rspack/cli` programmatically. +// +// It simply returns the configuration previously set by `cli.ts`. + +let config = undefined; + +export function setConfig(newConfig) { + config = newConfig; +} + +export default (...args) => config(...args); diff --git a/build_tools/webpack/webpack_config_from_cli.cjs b/build_tools/webpack/webpack_config_from_cli.cjs deleted file mode 100644 index a566f4591e..0000000000 --- a/build_tools/webpack/webpack_config_from_cli.cjs +++ /dev/null @@ -1,14 +0,0 @@ -// This module is specified as the webpack config module when `cli.ts` invokes -// `webpack-cli` programmatically. -// -// It simply returns the configuration previously set by `cli.ts`. -// -// This module is in cjs format rather than esm format to avoid a separate copy -// being loaded, for some reason, by tsx. - -let config = undefined; - -module.exports = (...args) => config(...args); -module.exports.setConfig = (newConfig) => { - config = newConfig; -}; diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 8b7cb6c2cb..9c5b0cc6e7 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -23,6 +23,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index a365a3d15c..abc7f2f934 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -22,6 +22,7 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.39.0", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", @@ -30,40 +31,35 @@ "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.2", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^2.1.8", + "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", - "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "esbuild": "^0.24.0", + "eslint": "^9.16.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "nunjucks": "^3.2.4", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.0.3", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.0", + "vitest": "^2.1.8", + "webdriverio": "^9.4.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2" }, "engines": { "node": ">=20.11 <21 || >=21.2" @@ -77,99 +73,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -716,26 +619,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -749,6 +638,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -757,6 +648,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -765,6 +658,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -779,16 +674,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -1108,23 +1000,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", "dev": true, @@ -1133,27 +1008,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1163,6 +1023,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1173,81 +1035,22 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1267,11 +1070,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1280,74 +1078,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1391,224 +1121,42 @@ "@types/node": "*" } }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" }, "peerDependenciesMeta": { - "typescript": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { "optional": true } } }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/@vitest/browser": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.3.1", - "magic-string": "^0.30.5", - "sirv": "^2.0.4" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "1.3.1", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "../../../node_modules/@vitest/expect": { - "version": "1.3.1", + "../../../node_modules/@vitest/expect": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -1845,6 +1393,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1853,22 +1403,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1878,12 +1436,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1895,6 +1457,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1903,6 +1467,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1910,12 +1476,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1931,6 +1501,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1943,6 +1515,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1954,6 +1528,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1967,61 +1543,26 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "../../../node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", @@ -2037,18 +1578,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -2088,6 +1617,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -2137,150 +1668,34 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, + "optional": true, + "peer": true, "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "ajv": "^6.9.1" } }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, + "../../../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "../../../node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "../../../node_modules/archiver": { @@ -2403,11 +1818,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2426,14 +1836,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -2539,14 +1941,6 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, @@ -2560,14 +1954,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2659,11 +2045,6 @@ "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2679,14 +2060,6 @@ "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, @@ -2696,146 +2069,11 @@ "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, "license": "MIT" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2897,6 +2135,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2910,29 +2150,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "../../../node_modules/buffer-crc32": { "version": "0.2.13", "dev": true, @@ -2967,30 +2184,8 @@ "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/cac": { - "version": "6.7.14", + "../../../node_modules/cac": { + "version": "6.7.14", "dev": true, "license": "MIT", "engines": { @@ -3054,26 +2249,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -3091,7 +2266,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -3148,44 +2325,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -3201,67 +2346,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -3348,11 +2432,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3363,11 +2442,6 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, @@ -3376,11 +2450,6 @@ "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { "version": "5.0.1", "dev": true, @@ -3408,52 +2477,6 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -3496,70 +2519,14 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", "license": "MIT" }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/crc-32": { "version": "1.2.2", "dev": true, @@ -3688,21 +2655,6 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", "dev": true @@ -3711,17 +2663,6 @@ "version": "0.0.1", "dev": true }, - "../../../node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -3919,14 +2860,6 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, @@ -3935,161 +2868,29 @@ "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", + "../../../node_modules/define-data-property": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "execa": "^5.0.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">= 0.4" } }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/define-data-property": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/define-properties": { - "version": "1.2.1", + "../../../node_modules/define-properties": { + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { @@ -4124,14 +2925,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, @@ -4140,15 +2933,6 @@ "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -4162,11 +2946,6 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, @@ -4180,28 +2959,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -4213,38 +2970,6 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, @@ -4268,42 +2993,6 @@ "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -4418,15 +3107,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/element-size": { "version": "1.1.1", @@ -4436,22 +3122,6 @@ "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -4472,45 +3142,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4566,7 +3197,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4642,23 +3275,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -5019,11 +3635,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -5108,18 +3719,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -5162,71 +3761,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -5354,106 +3888,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -5537,19 +3971,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/events": { "version": "1.1.1", "license": "MIT", @@ -5629,75 +4050,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -5816,14 +4168,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5832,17 +4176,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5899,51 +4232,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5985,25 +4273,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.5", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -6033,242 +4302,31 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", + "../../../node_modules/form-data": { + "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">= 6" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", "dev": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.17" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/form-data-encoder": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "../../../node_modules/formdata-polyfill": { - "version": "4.0.10", + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { @@ -6278,22 +4336,6 @@ "node": ">=12.20.0" } }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/fs-extra": { "version": "11.2.0", "dev": true, @@ -6315,11 +4357,6 @@ "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6659,21 +4696,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6714,25 +4739,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/glsl-editor": { "version": "1.0.0", "license": "MIT", @@ -6825,11 +4831,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6928,25 +4929,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, @@ -6960,197 +4942,33 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "../../../node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../../../node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/http-signature": { - "version": "1.2.0", + "../../../node_modules/http-signature": { + "version": "1.2.0", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -7502,83 +5320,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, @@ -7609,14 +5350,6 @@ "version": "2.0.4", "license": "ISC" }, - "../../../node_modules/ini": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "../../../node_modules/insert-css": { "version": "0.2.0", "license": "MIT" @@ -7634,14 +5367,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, @@ -7659,14 +5384,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", "dev": true, @@ -7680,11 +5397,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7696,17 +5408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7761,20 +5462,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -7808,91 +5495,37 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", + "../../../node_modules/is-negative-zero": { + "version": "2.0.2", "dev": true, "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", + "../../../node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12.0" } }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", + "../../../node_modules/is-number-object": { + "version": "1.0.7", "dev": true, "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-negative-zero": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "../../../node_modules/is-number-object": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" } }, "../../../node_modules/is-path-inside": { @@ -8015,17 +5648,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -8044,20 +5666,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", "license": "MIT" @@ -8094,26 +5702,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8127,6 +5721,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8155,11 +5751,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -8230,7 +5821,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -8249,17 +5842,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -8326,15 +5908,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -8430,11 +6003,6 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, @@ -8444,23 +6012,12 @@ "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -8533,42 +6090,11 @@ "version": "4.7.0", "license": "MIT" }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, "license": "MIT" }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, @@ -8594,14 +6120,6 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, @@ -8631,34 +6149,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/merge-source-map": { "version": "1.0.4", "license": "MIT", @@ -8686,14 +6176,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -8706,17 +6188,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8734,14 +6205,6 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, @@ -8753,79 +6216,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8893,18 +6283,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, @@ -8932,18 +6310,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", + "../../../node_modules/neo-async": { + "version": "2.6.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", @@ -8960,15 +6332,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -9004,18 +6367,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -9049,28 +6406,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -9096,14 +6431,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -9180,30 +6507,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, @@ -9212,37 +6515,6 @@ "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -9267,64 +6539,6 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/p-cancelable": { "version": "3.0.0", "dev": true, @@ -9361,30 +6575,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, @@ -9450,15 +6640,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -9470,23 +6651,6 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -9494,23 +6658,6 @@ "optional": true, "peer": true }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/path-exists": { "version": "4.0.0", "dev": true, @@ -9552,19 +6699,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9578,120 +6712,30 @@ "node": "*" } }, - "../../../node_modules/pend": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/performance-now": { - "version": "2.1.0", - "license": "MIT" - }, - "../../../node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "../../../node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", + "../../../node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "../../../node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, "../../../node_modules/pkg-types": { @@ -9842,15 +6886,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9891,26 +6926,6 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, @@ -10124,40 +7139,12 @@ "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -10203,28 +7190,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -10241,26 +7206,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -10360,18 +7305,12 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -10393,25 +7332,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -10455,34 +7375,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "../../../node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -10585,17 +7477,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -10699,6 +7580,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -10712,23 +7595,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -10749,154 +7615,31 @@ "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serialize-error": { - "version": "11.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/serialize-javascript": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "../../../node_modules/serve-static": { - "version": "1.15.0", + "../../../node_modules/serialize-error": { + "version": "11.0.3", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "type-fest": "^2.12.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" } }, "../../../node_modules/set-function-length": { @@ -10932,11 +7675,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -10977,14 +7715,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -11013,11 +7743,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -11031,30 +7756,6 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "../../../node_modules/smart-buffer": { "version": "4.2.0", "dev": true, @@ -11064,24 +7765,6 @@ "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, @@ -11119,15 +7802,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -11145,52 +7823,13 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, @@ -11358,33 +7997,11 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -11576,21 +8193,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -11602,18 +8204,6 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "license": "MIT", @@ -11624,97 +8214,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "../../../node_modules/symbol-tree": { "version": "3.2.4", "license": "MIT" }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -11746,25 +8249,12 @@ "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -11782,6 +8272,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -11814,7 +8306,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -11852,11 +8346,6 @@ "version": "0.10.31", "license": "MIT" }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -11889,14 +8378,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11939,17 +8420,6 @@ "dev": true, "license": "MIT/X11" }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, @@ -12435,24 +8905,12 @@ "../../../node_modules/type-fest": { "version": "2.19.0", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.6" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "../../../node_modules/typed-array-buffer": { @@ -12598,14 +9056,6 @@ "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, @@ -12641,6 +9091,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -12681,19 +9133,6 @@ "version": "1.0.2", "license": "MIT" }, - "../../../node_modules/utila": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -12701,14 +9140,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -12971,6 +9402,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12979,22 +9412,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -13080,6 +9497,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -13192,260 +9611,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -13459,19 +9624,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13484,6 +9642,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -13492,6 +9652,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -13500,31 +9662,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -13611,20 +9754,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, @@ -13779,14 +9908,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json index 4084cd4d7b..944fb1ebee 100644 --- a/examples/rsbuild/rsbuild-project-source/package-lock.json +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -30,6 +30,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -40,27 +42,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -76,99 +71,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -715,26 +617,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -748,6 +636,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -756,6 +646,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -764,6 +656,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -778,16 +672,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -1107,23 +998,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", "dev": true, @@ -1132,27 +1006,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1162,6 +1021,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1172,81 +1033,22 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1266,11 +1068,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1279,69 +1076,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1657,6 +1391,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1665,22 +1401,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1690,12 +1434,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1707,6 +1455,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1715,6 +1465,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1722,12 +1474,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1743,6 +1499,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1755,6 +1513,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1766,6 +1526,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1779,61 +1541,26 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", @@ -1849,18 +1576,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -1900,6 +1615,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -1949,61 +1666,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -2024,18 +1696,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, @@ -2156,11 +1816,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2297,14 +1952,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2396,11 +2043,6 @@ "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2416,14 +2058,6 @@ "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, @@ -2433,91 +2067,11 @@ "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, "license": "MIT" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2579,6 +2133,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2626,28 +2182,6 @@ "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/cac": { "version": "6.7.14", "dev": true, @@ -2713,15 +2247,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2739,7 +2264,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -2796,44 +2323,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -2849,31 +2344,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -2960,11 +2430,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3010,68 +2475,22 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", + "../../../node_modules/concat-map": { + "version": "0.0.1", "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "../../../node_modules/condense-newlines": { @@ -3098,70 +2517,14 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", "license": "MIT" }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/crc-32": { "version": "1.2.2", "dev": true, @@ -3290,21 +2653,6 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", "dev": true @@ -3313,17 +2661,6 @@ "version": "0.0.1", "dev": true }, - "../../../node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -3521,14 +2858,6 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, @@ -3537,108 +2866,6 @@ "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, @@ -3660,17 +2887,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/define-properties": { "version": "1.2.1", "dev": true, @@ -3707,14 +2923,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, @@ -3723,15 +2931,6 @@ "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -3745,11 +2944,6 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, @@ -3763,17 +2957,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3785,38 +2968,6 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, @@ -3840,52 +2991,16 @@ "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", + "../../../node_modules/duplexer": { + "version": "0.1.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "license": "BSD-3-Clause", "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/duplexer": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" + "readable-stream": "^2.0.2" } }, "../../../node_modules/eastasianwidth": { @@ -3990,15 +3105,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/element-size": { "version": "1.1.1", @@ -4008,22 +3120,6 @@ "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -4044,33 +3140,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4126,7 +3195,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4202,23 +3273,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -4579,11 +3633,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -4837,106 +3886,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -5020,19 +3969,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/events": { "version": "1.1.1", "license": "MIT", @@ -5112,75 +4048,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -5299,14 +4166,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5315,17 +4174,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5382,36 +4230,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5445,272 +4263,41 @@ "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "../../../node_modules/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "../../../node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "../../../node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/forever-agent": { - "version": "0.6.1", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^10.12.0 || >=12.0.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", + "../../../node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/for-each": { + "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "is-callable": "^1.1.3" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", "engines": { - "node": ">= 10.0.0" + "node": "*" } }, "../../../node_modules/form-data": { @@ -5747,22 +4334,6 @@ "node": ">=12.20.0" } }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/fs-extra": { "version": "11.2.0", "dev": true, @@ -5784,11 +4355,6 @@ "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6128,7 +4694,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6261,11 +4829,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6364,25 +4927,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, @@ -6396,146 +4940,16 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, "license": "BSD-2-Clause" }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, @@ -6551,40 +4965,6 @@ "node": ">= 6" } }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/http-signature": { "version": "1.2.0", "license": "MIT", @@ -6891,128 +5271,51 @@ "dependencies": { "punycode": "^2.1.0" } - }, - "../../../node_modules/ikonate/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/ikonate/node_modules/webidl-conversions": { - "version": "4.0.2", - "license": "BSD-2-Clause" - }, - "../../../node_modules/ikonate/node_modules/whatwg-url": { - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "../../../node_modules/ikonate/node_modules/ws": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - }, - "../../../node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, + }, + "../../../node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, + "../../../node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "../../../node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "../../../node_modules/import-local/node_modules/p-locate": { + "../../../node_modules/ikonate/node_modules/ws": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", + "../../../node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "../../../node_modules/import-meta-resolve": { @@ -7062,14 +5365,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, @@ -7087,14 +5382,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", "dev": true, @@ -7108,11 +5395,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7124,17 +5406,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7189,20 +5460,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -7236,23 +5493,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7264,17 +5504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -7435,20 +5664,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", "license": "MIT" @@ -7485,26 +5700,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7518,6 +5719,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7546,11 +5749,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -7621,7 +5819,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -7640,17 +5840,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -7717,15 +5906,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -7821,11 +6001,6 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, @@ -7835,23 +6010,12 @@ "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -7954,14 +6118,6 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, @@ -7991,34 +6147,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/merge-source-map": { "version": "1.0.4", "license": "MIT", @@ -8036,156 +6164,56 @@ "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "../../../node_modules/mimic-response": { - "version": "4.0.0", + "../../../node_modules/merge2": { + "version": "1.4.1", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", + "../../../node_modules/micromatch": { + "version": "4.0.5", "dev": true, "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=8.6" } }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, + "../../../node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.6" } }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, + "../../../node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "mime-db": "1.52.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">= 0.6" } }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", + "../../../node_modules/mimic-response": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8253,18 +6281,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, @@ -8292,18 +6308,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", @@ -8320,15 +6330,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8364,18 +6365,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -8409,28 +6404,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -8532,30 +6505,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, @@ -8564,37 +6513,6 @@ "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -8655,30 +6573,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, @@ -8744,15 +6638,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -8764,23 +6649,6 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -8788,23 +6656,6 @@ "optional": true, "peer": true }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/path-exists": { "version": "4.0.0", "dev": true, @@ -8846,19 +6697,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9046,15 +6884,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9095,26 +6924,6 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, @@ -9312,54 +7121,26 @@ "minimist": "^1.1.3", "through2": "^2.0.0" }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "bin": { + "quote-stream": "bin/cmd.js" } }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, + "../../../node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", + "../../../node_modules/randombytes": { + "version": "2.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" } }, "../../../node_modules/react-is": { @@ -9407,28 +7188,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -9445,26 +7204,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -9564,18 +7303,12 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -9597,25 +7330,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -9659,14 +7373,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "../../../node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -9769,17 +7475,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -9883,6 +7578,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9896,23 +7593,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -9936,47 +7616,6 @@ "node": ">=10" } }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/serialize-error": { "version": "11.0.3", "dev": true, @@ -9995,94 +7634,12 @@ "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/set-function-length": { "version": "1.2.0", "dev": true, @@ -10116,11 +7673,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -10161,14 +7713,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -10219,24 +7763,6 @@ "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, @@ -10274,15 +7800,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -10300,52 +7821,13 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, @@ -10513,14 +7995,6 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -10717,21 +8191,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -10792,6 +8251,8 @@ "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10809,6 +8270,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10841,7 +8304,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -10879,11 +8344,6 @@ "version": "0.10.31", "license": "MIT" }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -10916,14 +8376,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11459,18 +8911,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -11614,14 +9054,6 @@ "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, @@ -11657,6 +9089,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -11697,19 +9131,6 @@ "version": "1.0.2", "license": "MIT" }, - "../../../node_modules/utila": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -11717,14 +9138,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -11987,6 +9400,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11995,14 +9410,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -12088,6 +9495,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -12200,260 +9609,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -12467,19 +9622,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12492,6 +9640,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -12500,6 +9650,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -12508,31 +9660,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -12773,14 +9906,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json index 6686ad5170..0c002d5fba 100644 --- a/examples/rspack/rspack-project-source/package-lock.json +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -32,6 +32,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -42,27 +44,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -78,99 +73,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -717,26 +619,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -750,6 +638,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -758,6 +648,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -766,6 +658,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -780,16 +674,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -1109,23 +1000,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", "dev": true, @@ -1134,27 +1008,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1164,6 +1023,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1174,81 +1035,22 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1268,11 +1070,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1281,69 +1078,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1659,6 +1393,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1667,22 +1403,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1692,12 +1436,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1709,6 +1457,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1717,6 +1467,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1724,12 +1476,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1745,6 +1501,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1757,6 +1515,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1768,6 +1528,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1781,61 +1543,26 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "../../../node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", @@ -1851,18 +1578,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -1902,6 +1617,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -1951,61 +1668,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -2026,18 +1698,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, @@ -2158,11 +1818,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2299,14 +1954,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2398,11 +2045,6 @@ "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2418,14 +2060,6 @@ "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, @@ -2435,91 +2069,11 @@ "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, "license": "MIT" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2581,6 +2135,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2628,28 +2184,6 @@ "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/cac": { "version": "6.7.14", "dev": true, @@ -2715,15 +2249,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2741,7 +2266,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -2798,44 +2325,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/chrome-trace-event": { - "version": "1.0.3", + "../../../node_modules/chrome-trace-event": { + "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -2851,31 +2346,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -2962,11 +2432,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3012,52 +2477,6 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -3100,70 +2519,14 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", "license": "MIT" }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/crc-32": { "version": "1.2.2", "dev": true, @@ -3292,21 +2655,6 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", "dev": true @@ -3315,17 +2663,6 @@ "version": "0.0.1", "dev": true }, - "../../../node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -3523,14 +2860,6 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, @@ -3539,219 +2868,84 @@ "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", + "../../../node_modules/define-data-property": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "execa": "^5.0.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">= 0.4" } }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", + "../../../node_modules/define-properties": { + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", + "../../../node_modules/degenerator": { + "version": "5.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">= 14" } }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, + "../../../node_modules/delayed-stream": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", + "../../../node_modules/dequal": { + "version": "2.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "../../../node_modules/defer-to-connect": { - "version": "2.0.1", + "../../../node_modules/detect-libc": { + "version": "1.0.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/define-data-property": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/degenerator": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "../../../node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/dequal": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/detect-libc": { - "version": "1.0.3", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, "engines": { "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, @@ -3765,17 +2959,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3787,38 +2970,6 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, @@ -3842,42 +2993,6 @@ "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -3992,15 +3107,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/element-size": { "version": "1.1.1", @@ -4010,22 +3122,6 @@ "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -4046,33 +3142,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4128,7 +3197,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4204,23 +3275,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -4581,11 +3635,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -4839,134 +3888,34 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "*" } }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", + "../../../node_modules/espree": { + "version": "9.6.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "../../../node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5022,19 +3971,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/events": { "version": "1.1.1", "license": "MIT", @@ -5114,75 +4050,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -5301,14 +4168,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5317,17 +4176,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5384,36 +4232,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5455,26 +4273,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -5504,293 +4302,61 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", + "../../../node_modules/form-data": { + "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">= 6" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", "dev": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.17" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=4" + "node": ">=12.20.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", + "../../../node_modules/fs-extra": { + "version": "11.2.0", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=14.14" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/form-data-encoder": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "../../../node_modules/formdata-polyfill": { - "version": "4.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "../../../node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6130,7 +4696,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6263,11 +4831,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6366,25 +4929,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, @@ -6398,215 +4942,51 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, + "../../../node_modules/http-signature": { + "version": "1.2.0", "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, "engines": { - "node": ">= 12" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "../../../node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../../../node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/http-signature": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "../../../node_modules/http2-wrapper": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" @@ -6940,83 +5320,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, @@ -7064,14 +5367,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, @@ -7089,14 +5384,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", "dev": true, @@ -7110,11 +5397,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7126,17 +5408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7191,20 +5462,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -7238,23 +5495,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7266,19 +5506,8 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-number": { - "version": "7.0.0", + "../../../node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", "engines": { @@ -7437,20 +5666,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", "license": "MIT" @@ -7487,26 +5702,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7520,6 +5721,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7548,11 +5751,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -7623,7 +5821,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -7642,17 +5842,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -7719,15 +5908,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -7823,11 +6003,6 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, @@ -7837,23 +6012,12 @@ "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -7956,14 +6120,6 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, @@ -7993,34 +6149,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/merge-source-map": { "version": "1.0.4", "license": "MIT", @@ -8048,14 +6176,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -8068,17 +6188,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8096,14 +6205,6 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, @@ -8115,79 +6216,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8255,18 +6283,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, @@ -8294,18 +6310,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", @@ -8322,15 +6332,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8366,18 +6367,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -8411,28 +6406,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -8534,69 +6507,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/once": { - "version": "1.4.0", + "../../../node_modules/once": { + "version": "1.4.0", "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -8657,30 +6575,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, @@ -8746,15 +6640,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -8766,23 +6651,6 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -8790,23 +6658,6 @@ "optional": true, "peer": true }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/path-exists": { "version": "4.0.0", "dev": true, @@ -8848,19 +6699,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9048,15 +6886,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9097,26 +6926,6 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, @@ -9330,40 +7139,12 @@ "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -9409,28 +7190,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -9447,26 +7206,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -9566,18 +7305,12 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -9599,25 +7332,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -9661,14 +7375,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "../../../node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -9771,17 +7477,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -9885,6 +7580,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9898,26 +7595,9 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/semver": { - "version": "7.5.4", - "license": "ISC", + "../../../node_modules/semver": { + "version": "7.5.4", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9938,47 +7618,6 @@ "node": ">=10" } }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/serialize-error": { "version": "11.0.3", "dev": true, @@ -9997,94 +7636,12 @@ "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/set-function-length": { "version": "1.2.0", "dev": true, @@ -10118,11 +7675,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -10163,14 +7715,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -10221,24 +7765,6 @@ "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, @@ -10276,15 +7802,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -10302,52 +7823,13 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, @@ -10515,14 +7997,6 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -10719,21 +8193,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -10794,6 +8253,8 @@ "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10811,6 +8272,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10843,7 +8306,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -10881,11 +8346,6 @@ "version": "0.10.31", "license": "MIT" }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -10918,14 +8378,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11461,18 +8913,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -11616,14 +9056,6 @@ "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, @@ -11659,6 +9091,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -11699,19 +9133,6 @@ "version": "1.0.2", "license": "MIT" }, - "../../../node_modules/utila": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -11719,14 +9140,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -11989,6 +9402,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11997,14 +9412,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -12090,6 +9497,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -12202,260 +9611,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -12469,19 +9624,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12494,6 +9642,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -12502,6 +9652,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -12510,31 +9662,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -12775,14 +9908,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 343ee68278..e9a3982270 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -30,6 +30,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -40,27 +42,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -76,99 +71,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -363,26 +265,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -396,6 +284,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -404,6 +294,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -412,6 +304,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -426,16 +320,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -571,23 +462,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", "dev": true, @@ -596,27 +470,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -626,6 +485,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -636,81 +497,22 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -730,11 +532,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -743,69 +540,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1121,6 +855,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1129,22 +865,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1154,12 +898,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1171,6 +919,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1179,6 +929,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1186,12 +938,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1207,6 +963,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1219,6 +977,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1230,6 +990,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1243,61 +1005,26 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", @@ -1313,18 +1040,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -1364,6 +1079,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -1413,61 +1130,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -1488,18 +1160,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, @@ -1620,11 +1280,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -1761,14 +1416,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -1860,11 +1507,6 @@ "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -1880,14 +1522,6 @@ "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, @@ -1897,91 +1531,11 @@ "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, "license": "MIT" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2043,6 +1597,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2090,28 +1646,6 @@ "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/cac": { "version": "6.7.14", "dev": true, @@ -2177,15 +1711,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2203,7 +1728,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -2260,44 +1787,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -2313,31 +1808,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -2424,11 +1894,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -2474,68 +1939,22 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", + "../../../node_modules/concat-map": { + "version": "0.0.1", "dev": true, + "license": "MIT" + }, + "../../../node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "../../../node_modules/condense-newlines": { @@ -2562,70 +1981,14 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", "license": "MIT" }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/crc-32": { "version": "1.2.2", "dev": true, @@ -2754,21 +2117,6 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", "dev": true @@ -2777,17 +2125,6 @@ "version": "0.0.1", "dev": true }, - "../../../node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -2985,14 +2322,6 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, @@ -3001,108 +2330,6 @@ "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, @@ -3124,17 +2351,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/define-properties": { "version": "1.2.1", "dev": true, @@ -3171,14 +2387,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, @@ -3187,15 +2395,6 @@ "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -3209,11 +2408,6 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, @@ -3227,17 +2421,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3249,38 +2432,6 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, @@ -3304,52 +2455,16 @@ "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", + "../../../node_modules/duplexer": { + "version": "0.1.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "license": "BSD-3-Clause", "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/duplexer": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" + "readable-stream": "^2.0.2" } }, "../../../node_modules/eastasianwidth": { @@ -3454,15 +2569,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/element-size": { "version": "1.1.1", @@ -3472,22 +2584,6 @@ "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -3508,33 +2604,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -3590,7 +2659,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -3666,23 +2737,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/escalade": { "version": "3.1.1", "dev": true, @@ -3691,11 +2745,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -3949,106 +2998,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -4132,19 +3081,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/events": { "version": "1.1.1", "license": "MIT", @@ -4224,75 +3160,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -4411,14 +3278,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -4427,17 +3286,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -4473,356 +3321,95 @@ "license": "MIT" }, "../../../node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "../../../node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "../../../node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "../../../node_modules/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "../../../node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "../../../node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/forever-agent": { - "version": "0.6.1", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", + "version": "6.0.1", "dev": true, "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">=0.8.0" + "node": "^10.12.0 || >=12.0.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", + "../../../node_modules/fill-range": { + "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", + "../../../node_modules/find-up": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", + "../../../node_modules/flat": { + "version": "5.0.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", + "../../../node_modules/flat-cache": { + "version": "3.2.0", "dev": true, - "license": "Unlicense", + "license": "MIT", "dependencies": { - "fs-monkey": "^1.0.4" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 4.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", + "../../../node_modules/flatted": { + "version": "3.2.9", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "ISC" }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", + "../../../node_modules/for-each": { + "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "is-callable": "^1.1.3" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", "dependencies": { - "has-flag": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", "engines": { - "node": ">= 10.0.0" + "node": "*" } }, "../../../node_modules/form-data": { @@ -4859,22 +3446,6 @@ "node": ">=12.20.0" } }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/fs-extra": { "version": "11.2.0", "dev": true, @@ -4896,11 +3467,6 @@ "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -5226,7 +3792,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -5359,11 +3927,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -5462,25 +4025,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, @@ -5494,193 +4038,29 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, - "license": "MIT" - }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "../../../node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../../../node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } + "license": "MIT" }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 6" } }, "../../../node_modules/http-signature": { @@ -6036,83 +4416,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, @@ -6160,14 +4463,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, @@ -6185,14 +4480,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", "dev": true, @@ -6206,11 +4493,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -6222,17 +4504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -6287,20 +4558,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -6334,23 +4591,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -6362,17 +4602,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -6533,20 +4762,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", "license": "MIT" @@ -6583,26 +4798,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -6616,6 +4817,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6644,11 +4847,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -6719,7 +4917,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -6738,17 +4938,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -6815,15 +5004,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -6919,11 +5099,6 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, @@ -6933,23 +5108,12 @@ "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -7052,14 +5216,6 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, @@ -7089,34 +5245,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/merge-source-map": { "version": "1.0.4", "license": "MIT", @@ -7144,14 +5272,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -7161,18 +5281,7 @@ "picomatch": "^2.3.1" }, "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" + "node": ">=8.6" } }, "../../../node_modules/mime-db": { @@ -7192,14 +5301,6 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, @@ -7211,79 +5312,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -7351,18 +5379,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, @@ -7390,18 +5406,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", @@ -7418,15 +5428,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -7462,18 +5463,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -7507,28 +5502,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -7630,30 +5603,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, @@ -7662,37 +5611,6 @@ "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -7753,30 +5671,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, @@ -7842,15 +5736,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -7862,23 +5747,6 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -7886,23 +5754,6 @@ "optional": true, "peer": true }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/path-exists": { "version": "4.0.0", "dev": true, @@ -7944,19 +5795,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -8142,15 +5980,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -8191,26 +6020,6 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, @@ -8409,53 +6218,25 @@ "through2": "^2.0.0" }, "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "quote-stream": "bin/cmd.js" } }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, + "../../../node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", + "../../../node_modules/randombytes": { + "version": "2.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" } }, "../../../node_modules/react-is": { @@ -8503,28 +6284,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -8541,26 +6300,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -8660,18 +6399,12 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -8693,25 +6426,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -8755,14 +6469,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "../../../node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -8861,17 +6567,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -8975,6 +6670,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -8988,23 +6685,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -9028,47 +6708,6 @@ "node": ">=10" } }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/serialize-error": { "version": "11.0.3", "dev": true, @@ -9087,94 +6726,12 @@ "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/set-function-length": { "version": "1.2.0", "dev": true, @@ -9208,11 +6765,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -9253,14 +6805,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -9311,24 +6855,6 @@ "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, @@ -9366,15 +6892,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -9391,52 +6912,13 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, @@ -9604,14 +7086,6 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -9808,21 +7282,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -9883,6 +7342,8 @@ "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -9900,6 +7361,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -9932,7 +7395,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -9970,11 +7435,6 @@ "version": "0.10.31", "license": "MIT" }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -10007,14 +7467,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -10198,18 +7650,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -10353,14 +7793,6 @@ "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, @@ -10396,6 +7828,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -10436,19 +7870,6 @@ "version": "1.0.2", "license": "MIT" }, - "../../../node_modules/utila": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -10456,14 +7877,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -10723,6 +8136,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -10731,14 +8146,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -10824,6 +8231,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -10936,260 +8345,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -11203,19 +8358,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -11228,6 +8376,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -11236,6 +8386,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -11244,31 +8396,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -11509,14 +8642,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index d9f5fe35ca..8efbe2fb5e 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -37,6 +37,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -47,27 +49,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -83,99 +78,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -722,26 +624,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -755,6 +643,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -763,6 +653,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -771,6 +663,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -785,16 +679,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -1114,23 +1005,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", "dev": true, @@ -1139,27 +1013,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1169,6 +1028,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1179,81 +1040,22 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1273,11 +1075,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1286,69 +1083,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1664,6 +1398,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1672,22 +1408,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1697,12 +1441,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" - }, + "license": "MIT", + "optional": true, + "peer": true + }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1714,6 +1462,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1722,6 +1472,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1729,12 +1481,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1750,6 +1506,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1762,6 +1520,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1773,6 +1533,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1786,61 +1548,26 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "../../../node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", @@ -1856,18 +1583,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -1907,6 +1622,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -1956,61 +1673,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -2031,18 +1703,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, @@ -2163,11 +1823,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2304,14 +1959,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2403,11 +2050,6 @@ "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2423,14 +2065,6 @@ "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, @@ -2440,91 +2074,11 @@ "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, "license": "MIT" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/brace-expansion": { "version": "2.0.1", "license": "MIT", @@ -2586,6 +2140,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2633,28 +2189,6 @@ "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/cac": { "version": "6.7.14", "dev": true, @@ -2720,15 +2254,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2746,7 +2271,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -2803,44 +2330,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -2856,31 +2351,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -2967,11 +2437,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3017,52 +2482,6 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -3105,70 +2524,14 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", "license": "MIT" }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/crc-32": { "version": "1.2.2", "dev": true, @@ -3297,21 +2660,6 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", "dev": true @@ -3320,17 +2668,6 @@ "version": "0.0.1", "dev": true }, - "../../../node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -3528,14 +2865,6 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, @@ -3544,167 +2873,54 @@ "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", + "../../../node_modules/define-data-property": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "execa": "^5.0.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">= 0.4" } }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", + "../../../node_modules/define-properties": { + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", + "../../../node_modules/degenerator": { + "version": "5.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/define-data-property": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/degenerator": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" + "node": ">= 14" } }, "../../../node_modules/delayed-stream": { @@ -3714,14 +2930,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, @@ -3730,15 +2938,6 @@ "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -3752,11 +2951,6 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, @@ -3770,17 +2964,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3792,38 +2975,6 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, @@ -3847,42 +2998,6 @@ "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -3997,15 +3112,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/element-size": { "version": "1.1.1", @@ -4015,22 +3127,6 @@ "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -4051,33 +3147,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4133,7 +3202,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4209,23 +3280,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -4586,11 +3640,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -4844,117 +3893,17 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "../../../node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", "dev": true, "license": "ISC", "dependencies": { @@ -5027,19 +3976,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, "../../../node_modules/events": { "version": "1.1.1", "license": "MIT", @@ -5119,75 +4055,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -5306,14 +4173,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5322,17 +4181,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5389,36 +4237,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5460,26 +4278,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -5509,278 +4307,51 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", + "../../../node_modules/form-data": { + "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">= 6" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", "dev": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.17" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=4" + "node": ">=12.20.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", + "../../../node_modules/fs-extra": { + "version": "11.2.0", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/form-data-encoder": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "../../../node_modules/formdata-polyfill": { - "version": "4.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "node": ">=14.14" } }, "../../../node_modules/fs-extra/node_modules/universalify": { @@ -5791,11 +4362,6 @@ "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6135,7 +4701,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6268,11 +4836,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6371,25 +4934,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, @@ -6403,210 +4947,46 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, + "../../../node_modules/http-signature": { + "version": "1.2.0", "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, "engines": { - "node": ">= 12" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "../../../node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../../../node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/http-signature": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "../../../node_modules/http2-wrapper": { - "version": "2.2.1", + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { @@ -6945,83 +5325,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, @@ -7069,14 +5372,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, @@ -7094,14 +5389,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", "dev": true, @@ -7115,11 +5402,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7131,17 +5413,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7196,22 +5467,8 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-extendable": { - "version": "0.1.1", + "../../../node_modules/is-extendable": { + "version": "0.1.1", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7243,23 +5500,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7271,17 +5511,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -7442,20 +5671,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", "license": "MIT" @@ -7492,26 +5707,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7525,6 +5726,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7553,11 +5756,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -7628,7 +5826,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -7647,17 +5847,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -7724,15 +5913,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, @@ -7828,11 +6008,6 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, @@ -7842,23 +6017,12 @@ "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -7961,14 +6125,6 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, @@ -7998,34 +6154,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/merge-source-map": { "version": "1.0.4", "license": "MIT", @@ -8053,14 +6181,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -8073,17 +6193,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8101,14 +6210,6 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, @@ -8120,79 +6221,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8260,18 +6288,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, @@ -8299,18 +6315,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", @@ -8327,15 +6337,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8371,18 +6372,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -8416,28 +6411,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -8539,30 +6512,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, @@ -8571,37 +6520,6 @@ "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -8662,30 +6580,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, @@ -8751,15 +6645,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -8771,23 +6656,6 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -8795,23 +6663,6 @@ "optional": true, "peer": true }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/path-exists": { "version": "4.0.0", "dev": true, @@ -8853,19 +6704,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9053,15 +6891,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9102,26 +6931,6 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, @@ -9335,40 +7144,12 @@ "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -9414,28 +7195,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -9452,26 +7211,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -9571,18 +7310,12 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -9604,27 +7337,8 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-from": { - "version": "4.0.0", + "../../../node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { @@ -9666,14 +7380,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "../../../node_modules/reusify": { "version": "1.0.4", "dev": true, @@ -9776,17 +7482,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -9890,6 +7585,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9903,23 +7600,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -9943,47 +7623,6 @@ "node": ">=10" } }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/serialize-error": { "version": "11.0.3", "dev": true, @@ -10002,94 +7641,12 @@ "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/set-function-length": { "version": "1.2.0", "dev": true, @@ -10123,11 +7680,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -10168,14 +7720,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -10226,24 +7770,6 @@ "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, @@ -10281,15 +7807,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -10307,52 +7828,13 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, @@ -10520,14 +8002,6 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -10724,27 +8198,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", + "../../../node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" @@ -10799,6 +8258,8 @@ "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10816,6 +8277,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10848,7 +8311,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -10886,11 +8351,6 @@ "version": "0.10.31", "license": "MIT" }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -10923,14 +8383,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11466,18 +8918,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -11621,14 +9061,6 @@ "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, @@ -11664,6 +9096,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -11704,19 +9138,6 @@ "version": "1.0.2", "license": "MIT" }, - "../../../node_modules/utila": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -11724,14 +9145,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -11994,6 +9407,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12002,14 +9417,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, @@ -12095,6 +9502,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -12207,260 +9616,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -12474,19 +9629,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12499,6 +9647,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -12507,6 +9657,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -12515,31 +9667,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -12780,14 +9913,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, diff --git a/package-lock.json b/package-lock.json index 39beec0c26..a05f03f685 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -30,27 +32,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, @@ -68,106 +63,26 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, "node_modules/@babel/runtime": { @@ -977,6 +892,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -991,6 +908,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -1000,6 +919,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -1009,6 +930,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -1025,6 +948,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1090,6 +1015,41 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, "node_modules/@mswjs/interceptors": { "version": "0.37.3", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.3.tgz", @@ -1481,2251 +1441,2294 @@ "win32" ] }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "node_modules/@rspack/binding": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", + "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.6", + "@rspack/binding-darwin-x64": "1.1.6", + "@rspack/binding-linux-arm64-gnu": "1.1.6", + "@rspack/binding-linux-arm64-musl": "1.1.6", + "@rspack/binding-linux-x64-gnu": "1.1.6", + "@rspack/binding-linux-x64-musl": "1.1.6", + "@rspack/binding-win32-arm64-msvc": "1.1.6", + "@rspack/binding-win32-ia32-msvc": "1.1.6", + "@rspack/binding-win32-x64-msvc": "1.1.6" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", + "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", + "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", + "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", + "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", + "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", + "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", + "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", + "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@types/node": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/codemirror": { - "version": "5.60.15", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", - "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", + "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/tern": "*" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@rspack/cli": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.6.tgz", + "integrity": "sha512-404JTAadncCp81sDa7nGZdsT7r1Ry8fALR8Wkp9VMTUhWEFlbDGQvOTyali24pfyJxJTdsarSabmNhbDO5okJw==", "dev": true, "dependencies": { - "@types/node": "*" + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" + }, + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "node_modules/@rspack/cli/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "node_modules/@rspack/cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "engines": { + "node": ">= 10" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/@rspack/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@rspack/cli/node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "engines": { + "node": ">=10" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "node_modules/@rspack/cli/node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dev": true, "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "node_modules/@rspack/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/gl-matrix": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", - "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", - "dev": true - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "node_modules/@rspack/cli/node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "node_modules/@rspack/cli/node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dev": true, "dependencies": { - "@types/node": "*" + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "node_modules/@rspack/cli/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@rspack/cli/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@rspack/core": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", + "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", "dev": true, "dependencies": { - "@types/istanbul-lib-report": "*" + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.6", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", "dev": true, "dependencies": { - "@types/lodash": "*" + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" } }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "node_modules/@rspack/dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "node_modules/@rspack/dev-server/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "undici-types": "~6.20.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "node_modules/@rspack/dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "@types/node": "*" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/@types/nunjucks": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", - "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "node_modules/@rspack/dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "node_modules/@rspack/dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "node_modules/@rspack/dev-server/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@rspack/dev-server/node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "node_modules/@rspack/dev-server/node_modules/webpack-dev-server/node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "node_modules/@rspack/dev-server/node_modules/webpack-dev-server/node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "dependencies": { - "@types/node": "*" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true - }, - "node_modules/@types/tern": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, - "dependencies": { - "@types/estree": "*" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "dependencies": { - "@types/node": "*" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "optional": true, "dependencies": { + "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", - "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/type-utils": "8.18.0", - "@typescript-eslint/utils": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", - "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", + "node_modules/@types/codemirror": { + "version": "5.60.15", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", + "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "@types/tern": "*" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", - "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/utils": "8.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.18.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitest/browser": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.8.tgz", - "integrity": "sha512-OWVvEJThRgxlNMYNVLEK/9qVkpRcLvyuKLngIV3Hob01P56NjPHprVBYn+rx4xAJudbM9yrCrywPIEuA3Xyo8A==", - "dev": true, - "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.5.2", - "@vitest/mocker": "2.1.8", - "@vitest/utils": "2.1.8", - "magic-string": "^0.30.12", - "msw": "^2.6.4", - "sirv": "^3.0.0", - "tinyrainbow": "^1.2.0", - "ws": "^8.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "2.1.8", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/@vitest/browser/node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/@vitest/expect": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", - "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", - "dev": true, - "dependencies": { - "@vitest/spy": "2.1.8", - "@vitest/utils": "2.1.8", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true }, - "node_modules/@vitest/mocker": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", - "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, "dependencies": { - "@vitest/spy": "2.1.8", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", - "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@vitest/runner": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", - "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.1.8", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true }, - "node_modules/@vitest/snapshot": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", - "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.8", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@vitest/spy": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", - "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", "dev": true, "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@vitest/ui": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.8.tgz", - "integrity": "sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.1.8", - "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.1.8" - } + "node_modules/@types/gl-matrix": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", + "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", + "dev": true }, - "node_modules/@vitest/ui/node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, - "node_modules/@vitest/utils": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", - "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.8", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/node": "*" } }, - "node_modules/@wdio/config": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", - "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", - "dev": true, - "dependencies": { - "@wdio/logger": "9.1.3", - "@wdio/types": "9.2.2", - "@wdio/utils": "9.2.8", - "decamelize": "^6.0.0", - "deepmerge-ts": "^7.0.3", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": ">=18.20.0" - } + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true }, - "node_modules/@wdio/config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@wdio/config/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@wdio/config/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/@wdio/config/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/logger": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", - "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/logger/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true }, - "node_modules/@wdio/logger/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@types/lodash": "*" } }, - "node_modules/@wdio/protocols": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", - "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, - "node_modules/@wdio/repl": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", - "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", + "node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" + "undici-types": "~6.20.0" } }, - "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "@types/node": "*" } }, - "node_modules/@wdio/repl/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "node_modules/@types/nunjucks": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", + "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", "dev": true }, - "node_modules/@wdio/types": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", - "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@wdio/types/node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "@types/express": "*" } }, - "node_modules/@wdio/types/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true }, - "node_modules/@wdio/utils": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", - "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { - "@puppeteer/browsers": "^2.2.0", - "@wdio/logger": "9.1.3", - "@wdio/types": "9.2.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^7.0.3", - "edgedriver": "^5.6.1", - "geckodriver": "^4.3.3", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.2.24", - "safaridriver": "^0.1.2", - "split2": "^4.2.0", - "wait-port": "^1.1.0" - }, - "engines": { - "node": ">=18.20.0" + "@types/node": "*" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@types/estree": "*" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "@types/yargs-parser": "*" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", + "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/type-utils": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", "dev": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "dependencies": { - "@xtuc/long": "4.2.2" + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/@typescript-eslint/utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "node_modules/@vitest/browser": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.8.tgz", + "integrity": "sha512-OWVvEJThRgxlNMYNVLEK/9qVkpRcLvyuKLngIV3Hob01P56NjPHprVBYn+rx4xAJudbM9yrCrywPIEuA3Xyo8A==", "dev": true, - "engines": { - "node": ">=14.15.0" + "dependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.5.2", + "@vitest/mocker": "2.1.8", + "@vitest/utils": "2.1.8", + "magic-string": "^0.30.12", + "msw": "^2.6.4", + "sirv": "^3.0.0", + "tinyrainbow": "^1.2.0", + "ws": "^8.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "playwright": "*", + "vitest": "2.1.8", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "node_modules/@vitest/browser/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, "engines": { - "node": ">=14.15.0" + "node": ">=18" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", "dev": true, - "engines": { - "node": ">=14.15.0" + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "msw": "^2.4.9", + "vite": "^5.0.0" }, "peerDependenciesMeta": { - "webpack-dev-server": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.54", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", - "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", - "dev": true, - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true - }, - "node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, "dependencies": { - "event-target-shim": "^5.0.0" + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">=6.5" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "dev": true, "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" + "tinyspy": "^3.0.2" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@vitest/ui": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.8.tgz", + "integrity": "sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==", "dev": true, + "dependencies": { + "@vitest/utils": "2.1.8", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "vitest": "2.1.8" } }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/@vitest/ui/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=18" } }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, - "engines": { - "node": ">= 14" + "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@wdio/config": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", + "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.20.0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@wdio/config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "ajv": "^8.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "peerDependencies": { - "ajv": "^8.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@wdio/config/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/@wdio/config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@wdio/config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@wdio/logger": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", + "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18.20.0" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@wdio/protocols": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", + "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", + "dev": true + }, + "node_modules/@wdio/repl": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", + "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@types/node": "^20.1.0" }, "engines": { - "node": ">= 8" + "node": ">=18.20.0" } }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" + "undici-types": "~6.19.2" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "node_modules/@wdio/repl/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@wdio/types": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", + "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", "dev": true, "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "@types/node": "^20.1.0" }, "engines": { - "node": ">= 14" + "node": ">=18.20.0" } }, - "node_modules/archiver-utils/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, - "engines": { - "node": ">=0.8.x" + "dependencies": { + "undici-types": "~6.19.2" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@wdio/types/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/@wdio/utils": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", + "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@puppeteer/browsers": "^2.2.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "edgedriver": "^5.6.1", + "geckodriver": "^4.3.3", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.2.24", + "safaridriver": "^0.1.2", + "split2": "^4.2.0", + "wait-port": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.20.0" } }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "safe-buffer": "~5.2.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/archiver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "engines": { - "node": ">=0.8.x" - } + "optional": true, + "peer": true }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/archiver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "safe-buffer": "~5.2.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "dequal": "^2.0.3" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/array-equal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", - "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true, + "peer": true }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "node_modules/@zip.js/zip.js": { + "version": "2.7.54", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", + "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.5" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.4.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dependencies": { - "safer-buffer": "~2.1.0" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=0.8" + "node": ">=0.4.0" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/at-least-node": { + "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "engines": { - "node": ">= 4.0.0" + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, - "optional": true + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } }, - "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" } }, - "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "dev": true, - "optional": true + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/bare-stream": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.5.2.tgz", - "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, - "optional": true, "dependencies": { - "streamx": "^2.21.0" + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "node_modules/archiver-utils/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=0.8.x" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "engines": { - "node": "*" + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "ms": "2.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/archiver/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "side-channel": "^1.0.6" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "safe-buffer": "~5.2.0" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "dequal": "^2.0.3" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" + "node": ">= 0.4" }, - "bin": { - "brfs": "bin/cmd.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node_modules/array-equal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "run-applescript": "^7.0.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "tslib": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/call-bound": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", - "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "get-intrinsic": "^1.2.5" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3734,2229 +3737,2054 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, - "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, + "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, - "engines": { - "node": ">= 16" - } + "optional": true }, - "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, + "optional": true, "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=18.17" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "bare-os": "^2.1.0" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "node_modules/bare-stream": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.5.2.tgz", + "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", "dev": true, + "optional": true, "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "streamx": "^2.21.0" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "tweetnacl": "^0.14.3" } }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=8" } }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "ms": "2.0.0" } }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 4" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "balanced-match": "^1.0.0" } }, - "node_modules/cheerio/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "entities": "^4.5.0" + "fill-range": "^7.1.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, + "node_modules/brfs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "bin": { + "brfs": "bin/cmd.js" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/brfs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">=6.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=8.0.0" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/clone-deep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { + "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/compress-commons/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" + "node": ">= 0.4" } }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/compress-commons/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 16" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/connect-history-api-fallback": { + "node_modules/cheerio-select/node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "engines": { - "node": ">=0.8" + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/core-js": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", - "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", - "hasInstallScript": true, + "node": ">=0.12" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "bin": { - "crc32": "bin/crc32.njs" + "dependencies": { + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=0.8" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "engines": { - "node": ">= 14" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/crc32-stream/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/cheerio/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { - "node": ">=0.8.x" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/crc32-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/cheerio/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, + "node_modules/cheerio/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 8.10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" + "url": "https://paulmillr.com/funding/" }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">= 6" } }, - "node_modules/css-shorthand-properties": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", - "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", - "dev": true + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", - "dev": true + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">= 12" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { - "cssom": "0.3.x" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=0.10.0" } }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/codemirror": { + "version": "5.65.16", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", + "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/data-urls/node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.20.0 || >=14" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "node_modules/compress-commons/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "dependencies": { - "ms": "^2.1.3" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/deepmerge-ts": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", - "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "engines": { - "node": ">=16.0.0" + "node": ">=0.8" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "hasInstallScript": true, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "bin": { + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" }, "engines": { "node": ">= 14" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/crc32-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.8.x" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "utila": "~0.4" + "safe-buffer": "~5.2.0" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">= 8" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "deprecated": "Use your platform's native DOMException instead", "dependencies": { - "webidl-conversions": "^4.0.2" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/css-shorthand-properties": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", + "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", + "dev": true + }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", + "dev": true + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, "engines": { - "node": ">= 4" + "node": ">= 6" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "bin": { + "cssesc": "bin/cssesc" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "cssom": "0.3.x" } }, - "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", - "dev": true, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dependencies": { - "readable-stream": "^2.0.2" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/shirshak55" - } - }, - "node_modules/edgedriver": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", - "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@wdio/logger": "^8.38.0", - "@zip.js/zip.js": "^2.7.48", - "decamelize": "^6.0.0", - "edge-paths": "^3.0.5", - "fast-xml-parser": "^4.4.1", - "node-fetch": "^3.3.2", - "which": "^4.0.0" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/edgedriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/edgedriver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/edgedriver/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/edgedriver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/edgedriver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/edgedriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "ms": "^2.1.3" }, "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" + "node": ">=6.0" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", - "dev": true - }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/deepmerge-ts": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=16.0.0" } }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/encoding-sniffer/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/encoding-sniffer/node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "iconv-lite": "0.6.3" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "dependencies": { - "once": "^1.4.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "engines": { + "node": ">= 0.8" } }, - "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" + "webidl-conversions": "^4.0.2" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dependencies": { - "hasown": "^2.0.0" + "readable-stream": "^2.0.2" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@types/which": "^2.0.1", + "which": "^2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/shirshak55" } }, - "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "node_modules/edgedriver": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", + "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", "dev": true, "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "dependencies": { + "@wdio/logger": "^8.38.0", + "@zip.js/zip.js": "^2.7.48", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "fast-xml-parser": "^4.4.1", + "node-fetch": "^3.3.2", + "which": "^4.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "bin": { + "edgedriver": "bin/edgedriver.js" } }, - "node_modules/esbuild-loader": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.2.2.tgz", - "integrity": "sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==", + "node_modules/edgedriver/node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", "dev": true, "dependencies": { - "esbuild": "^0.21.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=12" + "node": "^16.13 || >=18" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/edgedriver/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/edgedriver/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/edgedriver/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, "engines": { - "node": ">=12" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, "engines": { - "node": ">=12" + "node": ">=14" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { - "node": ">=12" + "node": ">=14" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.72", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", + "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true + }, + "node_modules/element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/encoding-sniffer/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "iconv-lite": "0.6.3" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, "engines": { - "node": ">=12" + "node": ">=10.13.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true }, - "node_modules/esbuild-loader/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "hasown": "^2.0.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -6224,82 +6052,53 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/eslint-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", + "node_modules/eslint-rspack-plugin": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-rspack-plugin/-/eslint-rspack-plugin-4.2.1.tgz", + "integrity": "sha512-jv+VggchVC56U9ZxP2RUXTVOeOyjKVuTxGSQdp6YkPLLi9JTHFW5Fwkqi84NrOD3itBQz5m+Agvx6faAV1MJbg==", "dev": true, "dependencies": { "@types/eslint": "^8.56.10", "jest-worker": "^29.7.0", - "micromatch": "^4.0.5", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0", - "webpack": "^5.0.0" + "eslint": "^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/eslint-rspack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "node_modules/eslint-rspack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", @@ -6311,7 +6110,7 @@ "ajv": "^8.8.2" } }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "node_modules/eslint-rspack-plugin/node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", @@ -6326,16 +6125,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "node_modules/eslint-rspack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/eslint-rspack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -6344,14 +6143,14 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "node_modules/eslint-rspack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", @@ -6366,6 +6165,34 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6522,6 +6349,59 @@ "node": ">=0.4.x" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expect-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", @@ -6766,15 +6646,6 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, "node_modules/fastq": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", @@ -6909,309 +6780,81 @@ "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "*" + "node": ">=16" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 8.9.0" + "node": ">=4.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "is-callable": "^1.1.3" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">= 10.0.0" + "node": "*" } }, "node_modules/formdata-polyfill": { @@ -7244,18 +6887,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -7514,7 +7145,9 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/glob/node_modules/minimatch": { "version": "10.0.1", @@ -7751,15 +7384,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/headers-polyfill": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", @@ -7786,99 +7410,34 @@ "whatwg-encoding": "^1.0.1" } }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, "node_modules/htmlfy": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", "dev": true }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7997,6 +7556,15 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/hyperdyperid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", @@ -8091,89 +7659,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/import-meta-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", @@ -8193,16 +7678,6 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -8280,12 +7755,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -8646,6 +8115,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -8823,6 +8304,8 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8837,6 +8320,8 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9098,7 +8583,9 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -9116,43 +8603,10 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsprim": { "version": "1.4.2", @@ -9256,35 +8710,17 @@ "immediate": "~3.0.5" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-app": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", @@ -9391,15 +8827,6 @@ "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", "dev": true }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", @@ -9548,77 +8975,13 @@ "node": ">= 0.6" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=6" } }, "node_modules/minimalistic-assert": { @@ -9787,7 +9150,9 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/netmask": { "version": "2.0.2", @@ -9806,16 +9171,6 @@ "fflate": "*" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -9866,7 +9221,9 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/nopt": { "version": "7.2.0", @@ -9891,6 +9248,18 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -10083,6 +9452,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -10163,32 +9547,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pac-proxy-agent": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", @@ -10226,16 +9584,6 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10248,24 +9596,6 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -10368,16 +9698,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10387,15 +9707,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -10431,15 +9742,6 @@ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -10641,16 +9943,6 @@ "node": ">=0.10.0" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -10857,6 +10149,8 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -11015,28 +10309,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -11176,27 +10448,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -11221,40 +10472,112 @@ "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", "dev": true, "dependencies": { - "fast-deep-equal": "^2.0.1" + "fast-deep-equal": "^2.0.1" + } + }, + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "dev": true + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "node_modules/rimraf/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/rimraf/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "dev": true - }, "node_modules/rollup": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", @@ -11403,6 +10726,8 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -11514,6 +10839,8 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -11870,17 +11197,11 @@ "node": ">= 14" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -11899,6 +11220,8 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12358,6 +11681,15 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12376,22 +11708,6 @@ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "dev": true }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "dev": true, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12459,6 +11775,8 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -12477,6 +11795,8 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -12510,7 +11830,9 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/text-decoder": { "version": "1.1.1", @@ -12734,6 +12056,32 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-checker-rspack-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.0.3.tgz", + "integrity": "sha512-K5BUrytoFju1Olu11T49vlYvDEGOguBF1CBCl4o2ARxDGPoJHHf7fBzLlK0YYkUqI5EFA5cMRUC6332M7hQBHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@rspack/lite-tapable": "^1.0.0", + "chokidar": "^3.5.3", + "memfs": "^4.14.0", + "minimatch": "^9.0.5", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0", + "typescript": ">=3.8.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -13474,6 +12822,8 @@ "url": "https://github.com/sponsors/ai" } ], + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.0" @@ -13523,12 +12873,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -14162,6 +13506,8 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14295,6 +13641,8 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -14401,74 +13749,6 @@ } } }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-dev-middleware": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", @@ -14551,115 +13831,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -14674,21 +13845,13 @@ "node": ">=18.0.0" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -14702,6 +13865,8 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -14711,6 +13876,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -14720,6 +13887,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } @@ -15039,15 +14208,6 @@ "node": ">=10" } }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index cdc20841e2..d555bc463e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,8 @@ }, "devDependencies": { "@eslint/js": "^9.16.0", + "@rspack/cli": "^1.1.6", + "@rspack/core": "^1.1.6", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", @@ -52,27 +54,20 @@ "@vitest/ui": "^2.1.8", "css-loader": "^7.1.2", "esbuild": "^0.24.0", - "esbuild-loader": "^4.2.2", "eslint": "^9.16.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^6.5.3", + "eslint-rspack-plugin": "^4.2.1", "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.3", - "mini-css-extract-plugin": "^2.9.2", "nunjucks": "^3.2.4", "prettier": "3.4.2", - "style-loader": "^4.0.0", + "ts-checker-rspack-plugin": "^1.0.3", "tsx": "^4.19.2", "typescript": "^5.7.2", "typescript-eslint": "^8.18.0", "vitest": "^2.1.8", "webdriverio": "^9.4.1", - "webpack": "^5.97.1", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.2.0", "webpack-merge": "^6.0.1", "yargs": "^17.7.2" }, diff --git a/webpack.config.js b/rspack.config.js similarity index 65% rename from webpack.config.js rename to rspack.config.js index 7047d01fd8..2b1b7db474 100644 --- a/webpack.config.js +++ b/rspack.config.js @@ -1,10 +1,7 @@ import path from "node:path"; -import { EsbuildPlugin } from "esbuild-loader"; -import HtmlWebpackPlugin from "html-webpack-plugin"; -import MiniCssExtractPlugin from "mini-css-extract-plugin"; -import webpack from "webpack"; -import StartupChunkDependenciesPlugin from "webpack/lib/runtime/StartupChunkDependenciesPlugin.js"; -import { normalizeConfigurationWithDefine } from "./build_tools/webpack/configuration_with_define.js"; +import { HtmlRspackPlugin, ProgressPlugin } from "@rspack/core"; +import { normalizeConfigurationWithDefine } from "./build_tools/rspack/configuration_with_define.js"; +import packageJson from "./package.json"; export default (env, args) => { const mode = args.mode === "production" ? "production" : "development"; @@ -23,13 +20,6 @@ export default (env, args) => { splitChunks: { chunks: "all", }, - minimizer: [ - new EsbuildPlugin({ - target: "es2020", - format: "esm", - css: true, - }), - ], }, devtool: "source-map", module: { @@ -37,11 +27,19 @@ export default (env, args) => { // Needed to support Neuroglancer TypeScript sources. { test: /\.tsx?$/, - loader: "esbuild-loader", + loader: "builtin:swc-loader", options: { - // Needed to ensure `import.meta.url` is available. - target: "es2020", + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + env: { + targets: packageJson.browserslist, + }, }, + type: "javascript/auto", }, { test: /\.wasm$/, @@ -64,19 +62,6 @@ export default (env, args) => { filename: "[name][ext]", }, }, - // Necessary to handle CSS files. - { - test: /\.css$/, - use: [ - { - loader: - mode === "production" - ? MiniCssExtractPlugin.loader - : "style-loader", - }, - { loader: "css-loader" }, - ], - }, ], }, devServer: { @@ -89,37 +74,23 @@ export default (env, args) => { hot: false, }, plugins: [ - // Fixes esm output with splitChunks - // https://github.com/webpack/webpack/pull/17015/files - new StartupChunkDependenciesPlugin({ - chunkLoading: "import", - asyncChunkLoading: true, - }), - new webpack.ProgressPlugin(), - ...(mode === "production" - ? [new MiniCssExtractPlugin({ filename: "[name].[chunkhash].css" })] - : []), - new HtmlWebpackPlugin({ - title: "Neuroglancer", - scriptLoading: "module", + new ProgressPlugin(), + new HtmlRspackPlugin({ + title: "neuroglancer", }), ], output: { path: path.resolve(import.meta.dirname, "dist", "client"), filename: "[name].[chunkhash].js", chunkFilename: "[name].[contenthash].js", - chunkLoading: "import", - workerChunkLoading: "import", - chunkFormat: "module", asyncChunks: true, - module: true, clean: true, }, - target: ["es2020", "web"], + target: ["web", "browserslist"], experiments: { - outputModule: true, + css: true, }, - // Additional defines, to be added via `webpack.DefinePlugin`. This is not a + // Additional defines, to be added via `DefinePlugin`. This is not a // standard webpack configuration property, but is handled specially by // `normalizeConfigurationWithDefine`. define: { @@ -146,6 +117,9 @@ export default (env, args) => { // NEUROGLANCER_GOOGLE_TAG_MANAGER: JSON.stringify('GTM-XXXXXX'), }, + watchOptions: { + ignored: /node_modules/, + }, }; return env.NEUROGLANCER_CLI ? config From ed2ab1ac12ef91ebeabcc92c59971eb654bb7f87 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Fri, 8 Nov 2024 16:35:23 -0800 Subject: [PATCH 21/41] fix(position_widget): fix display of playback controls Previously, the playback toggle button in the position widget dropdown did not correctly toggle the display of the playback controls. --- src/navigation_state.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/navigation_state.ts b/src/navigation_state.ts index ca3dfc3e65..f9adcfd613 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -491,11 +491,12 @@ export class CoordinateSpacePlaybackVelocity extends RefCounted { velocities[index] = newVelocity; this.changed.dispatch(); }; - const prevVelocity = getVelocity(); + let prevVelocity = getVelocity(); owner.registerDisposer( this.changed.add(() => { const curVelocity = getVelocity(); if (curVelocity !== prevVelocity) { + prevVelocity = curVelocity; changed.dispatch(); } }), From dd4ffcfdd5afecf9143670f9375333563a334263 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Fri, 8 Nov 2024 16:38:15 -0800 Subject: [PATCH 22/41] fix(DimensionTool): fix text display of position Previously, the position widget did not correctly perform dimension indexing when in single-dimension mode (as used only for the DimensionTool). In particular, it always displayed the position of the first dimension, rather than the dimension actually selected. --- src/widget/position_widget.ts | 65 ++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 7dfb1eb6db..2c143583b8 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -151,6 +151,8 @@ class DimensionWidget { draggingPosition = false; hasFocus = false; + dimensionIndex: number; + constructor( public coordinateSpace: CoordinateSpace, public id: DimensionId, @@ -175,6 +177,7 @@ class DimensionWidget { container.draggable = true; container.tabIndex = -1; } + this.dimensionIndex = initialDimensionIndex; container.appendChild(nameContainer); container.appendChild(scaleElement); nameContainer.appendChild(nameElement); @@ -860,6 +863,7 @@ export class PositionWidget extends RefCounted { widget.maxPositionWidthSeen = maxPositionWidth; } else { widget.coordinateSpace = coordinateSpace; + widget.dimensionIndex = i; } widget.maxPositionWidth = maxPositionWidth; const name = names[i]; @@ -969,12 +973,14 @@ export class PositionWidget extends RefCounted { private updateNameValidity() { const { dimensionWidgetList } = this; - const names = dimensionWidgetList.map((w) => w.nameElement.value); - const rank = names.length; + const names = Array.from(this.position.coordinateSpace.value.names); + for (const widget of dimensionWidgetList) { + names[widget.dimensionIndex] = widget.nameElement.value; + } const isValid = this.combiner.getRenameValidity(names); - for (let i = 0; i < rank; ++i) { - dimensionWidgetList[i].nameElement.dataset.isValid = - isValid[i] === false ? "false" : "true"; + for (const widget of dimensionWidgetList) { + widget.nameElement.dataset.isValid = + isValid[widget.dimensionIndex] === false ? "false" : "true"; } } @@ -1117,15 +1123,13 @@ export class PositionWidget extends RefCounted { private updatePosition() { if (!this.allowFocus) return; - const { dimensionWidgetList } = this; const { position } = this; const { value: voxelCoordinates } = position; const coordinateSpace = position.coordinateSpace.value; if (voxelCoordinates === undefined) return; - const rank = dimensionWidgetList.length; let modified = false; - for (let i = 0; i < rank; ++i) { - const widget = dimensionWidgetList[i]; + for (const widget of this.dimensionWidgetList) { + const { dimensionIndex } = widget; if (!widget.modified) continue; widget.modified = false; modified = true; @@ -1137,11 +1141,11 @@ export class PositionWidget extends RefCounted { Number.isInteger(value) && !valueString.includes(".") && coordinateSpace !== undefined && - !coordinateSpace.bounds.voxelCenterAtIntegerCoordinates[i] + !coordinateSpace.bounds.voxelCenterAtIntegerCoordinates[dimensionIndex] ) { value += 0.5; } - voxelCoordinates[i] = value; + voxelCoordinates[dimensionIndex] = value; } if (modified) { position.value = voxelCoordinates; @@ -1155,7 +1159,10 @@ export class PositionWidget extends RefCounted { position: { coordinateSpace }, } = this; const existing = coordinateSpace.value; - const names = dimensionWidgetList.map((x) => x.nameElement.value); + const names = Array.from(existing.names); + for (const widget of dimensionWidgetList) { + names[widget.dimensionIndex] = widget.nameElement.value; + } if (this.combiner.getRenameValidity(names).includes(false)) return false; const existingNames = existing.names; if (arraysEqual(existingNames, names)) return false; @@ -1174,17 +1181,18 @@ export class PositionWidget extends RefCounted { position: { coordinateSpace }, } = this; const existing = coordinateSpace.value; - const scalesAndUnits = dimensionWidgetList.map((x) => - parseScale(x.scaleElement.value), - ); - if (scalesAndUnits.includes(undefined)) { - return false; - } - const newScales = Float64Array.from(scalesAndUnits, (x) => x!.scale); - const newUnits = Array.from(scalesAndUnits, (x) => x!.unit); const { scales, units } = existing; - if (arraysEqual(scales, newScales) && arraysEqual(units, newUnits)) + const newScales = Float64Array.from(scales); + const newUnits = Array.from(units); + for (const { dimensionIndex, scaleElement } of dimensionWidgetList) { + const result = parseScale(scaleElement.value); + if (result === undefined) return false; + newScales[dimensionIndex] = result.scale; + newUnits[dimensionIndex] = result.unit; + } + if (arraysEqual(scales, newScales) && arraysEqual(units, newUnits)) { return false; + } const timestamps = existing.timestamps.map((t, i) => newScales[i] === scales[i] && newUnits[i] === units[i] ? t : Date.now(), ); @@ -1215,22 +1223,23 @@ export class PositionWidget extends RefCounted { this.updateDimensions(); const { position: { value: voxelCoordinates }, - dimensionWidgetList, } = this; - const rank = dimensionWidgetList.length; if (voxelCoordinates === undefined) { return; } const coordinateSpace = this.coordinateSpace!; const { velocity } = this; - for (let i = 0; i < rank; ++i) { - const widget = dimensionWidgetList[i]; + for (const widget of this.dimensionWidgetList) { + const { dimensionIndex } = widget; const inputElement = widget.coordinate; - const newCoord = Math.floor(voxelCoordinates[i]); + const newCoord = Math.floor(voxelCoordinates[dimensionIndex]); const newValue = newCoord.toString(); updateCoordinateFieldWidth(widget, newValue); inputElement.value = newValue; - const coordinateArray = getCoordinateArray(coordinateSpace, i); + const coordinateArray = getCoordinateArray( + coordinateSpace, + dimensionIndex, + ); let label = ""; if (coordinateArray != null) { const { coordinates } = coordinateArray; @@ -1242,7 +1251,7 @@ export class PositionWidget extends RefCounted { const labelElement = widget.coordinateLabel; labelElement.textContent = label; if (this.showPlayback) { - const velocityInfo = velocity?.value?.[i]; + const velocityInfo = velocity?.value?.[dimensionIndex]; if (velocityInfo !== undefined) { const paused = velocityInfo.paused; widget.playButton.style.display = paused ? "" : "none"; From 15c59331ed3e578eee528db86a777a5ccc83718f Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 26 Nov 2024 15:02:51 -0800 Subject: [PATCH 23/41] fix(display_context): make IntersectionObserver usage more robust Previously, panels that were scrolled out of view were not correctly tracked. --- src/display_context.ts | 47 +++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/src/display_context.ts b/src/display_context.ts index 0438391f57..f3c90ecddc 100644 --- a/src/display_context.ts +++ b/src/display_context.ts @@ -115,7 +115,7 @@ export abstract class RenderedPanel extends RefCounted { renderViewport = new RenderViewport(); - private monitorState: PanelMonitorState = {}; + private monitorState: PanelMonitorState = { isIntersecting: true }; constructor( public context: Borrowed, @@ -386,6 +386,13 @@ interface PanelMonitorState { // detections due to normalization that the browser may do. intersectionObserverMargin?: string; + // Indicates that the element is intersecting the viewport at all. If `true`, + // then the intersection observer margin is set normally to detect any + // changes. If `false`, then the intersection observer margin is set to cover + // the entire viewport in order to detect when the panel becomes visible + // again. + isIntersecting: boolean; + // Indicates that the panel element was added to the resize observer. addedToResizeObserver?: boolean; } @@ -430,21 +437,37 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { this.resizeObserver.observe(element); state.addedToResizeObserver = true; } - const rootRect = this.rootRect!; - const marginTop = rootRect.top - elementClientRect.top; - const marginLeft = rootRect.left - elementClientRect.left; - const marginRight = elementClientRect.right - rootRect.right; - const marginBottom = elementClientRect.bottom - rootRect.bottom; - const margin = `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`; + let margin: string; + if (state.isIntersecting) { + const rootRect = this.rootRect!; + const marginTop = rootRect.top - elementClientRect.top; + const marginLeft = rootRect.left - elementClientRect.left; + const marginRight = elementClientRect.right - rootRect.right; + const marginBottom = elementClientRect.bottom - rootRect.bottom; + margin = `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`; + } else { + margin = ""; + } if (state.intersectionObserverMargin !== margin) { state.intersectionObserverMargin = margin; state.intersectionObserver?.disconnect(); + const thresholds = new Array(101); + for (let i = 0; i <= 100; ++i) { + thresholds[i] = 0.01 * i; + } const intersectionObserver = (state.intersectionObserver = - new IntersectionObserver(this.resizeCallback, { - root: this.container, - rootMargin: margin, - threshold: [0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1], - })); + new IntersectionObserver( + (entries) => { + const lastEntry = entries[entries.length - 1]; + state.isIntersecting = lastEntry.isIntersecting; + this.resizeCallback(); + }, + { + root: this.container, + rootMargin: margin, + threshold: thresholds, + }, + )); intersectionObserver.observe(element); } } From 610965b2a38603d692be42422e23a72609f43110 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 26 Nov 2024 16:12:12 -0800 Subject: [PATCH 24/41] fix(position_widget): fix display of dimension tool during initial load Previously, the position widget displayed "undefined" and other undesirable text until the CoordinateSpace is marked `valid` (i.e. at least one data source loads). --- src/widget/position_widget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 2c143583b8..29943505f3 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -835,7 +835,7 @@ export class PositionWidget extends RefCounted { coordinateSpace: { value: coordinateSpace }, }, } = this; - if (!coordinateSpace.valid) { + if (!coordinateSpace.valid && this.singleDimensionId === undefined) { coordinateSpace = emptyInvalidCoordinateSpace; } this.coordinateSpace = coordinateSpace; From 76fd4b16f978663c37e9ad245b7860bed3ec501b Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 6 Nov 2024 11:08:18 -0800 Subject: [PATCH 25/41] feat(tool palettes): Add support for tool palettes Tool palettes are additional side panels that contain tools added from any number of layers. --- python/neuroglancer/viewer_config_state.py | 3 + python/neuroglancer/viewer_state.py | 77 +- src/layer/index.ts | 6 +- src/layer_group_viewer.ts | 12 +- src/layer_groups_layout.ts | 13 +- src/ui/drag_and_drop.ts | 40 +- src/ui/layer_data_sources_tab.ts | 3 +- src/ui/layer_drag_and_drop.ts | 54 +- src/ui/layer_list_panel.ts | 2 +- src/ui/layer_side_panel.ts | 18 +- src/ui/side_panel.ts | 125 +- src/ui/tool.ts | 352 +++++- src/ui/tool_drag_and_drop.ts | 42 + src/ui/tool_palette.css | 205 +++ src/ui/tool_palette.ts | 1310 ++++++++++++++++++++ src/ui/tool_query.spec.ts | 322 +++++ src/ui/tool_query.ts | 353 ++++++ src/util/dom.ts | 2 +- src/util/drag_and_drop.ts | 36 + src/util/dropdown.ts | 33 + src/util/signal.ts | 11 + src/viewer.ts | 31 +- src/widget/layer_control.ts | 42 +- src/widget/multiline_autocomplete.ts | 14 +- src/widget/position_plot.ts | 1 + src/widget/position_widget.css | 21 + src/widget/position_widget.ts | 230 ++-- src/widget/shader_controls.ts | 60 +- src/widget/text_input.ts | 22 + 29 files changed, 3186 insertions(+), 254 deletions(-) create mode 100644 src/ui/tool_drag_and_drop.ts create mode 100644 src/ui/tool_palette.css create mode 100644 src/ui/tool_palette.ts create mode 100644 src/ui/tool_query.spec.ts create mode 100644 src/ui/tool_query.ts diff --git a/python/neuroglancer/viewer_config_state.py b/python/neuroglancer/viewer_config_state.py index 27bb04d596..ee069dbdae 100644 --- a/python/neuroglancer/viewer_config_state.py +++ b/python/neuroglancer/viewer_config_state.py @@ -334,6 +334,9 @@ class ConfigState(JsonObjectWrapper): show_layer_side_panel_button = showLayerSidePanelButton = wrapped_property( "showLayerSidePanelButton", optional(bool, True) ) + show_tool_palette_button = showToolPaletteButton = wrapped_property( + "showToolPaletteButton", optional(bool, True) + ) show_layer_list_panel_button = showLayerListPanelButton = wrapped_property( "showLayerListPanelButton", optional(bool, True) ) diff --git a/python/neuroglancer/viewer_state.py b/python/neuroglancer/viewer_state.py index 723edb993e..7f10f557e6 100644 --- a/python/neuroglancer/viewer_state.py +++ b/python/neuroglancer/viewer_state.py @@ -152,6 +152,17 @@ def export_tool(tool_class): return tool_class +@export +class LayerTool(Tool): + __slots__ = () + + layer = wrapped_property("layer", optional(str)) + """Name of the layer to which this tool applies. + + Only valid for tools contained within `~ToolPalette.tools`. + """ + + @export_tool class PlacePointTool(Tool): __slots__ = () @@ -177,164 +188,164 @@ class PlaceEllipsoidTool(Tool): @export_tool -class BlendTool(Tool): +class BlendTool(LayerTool): __slots__ = () TOOL_TYPE = "blend" @export_tool -class OpacityTool(Tool): +class OpacityTool(LayerTool): __slots__ = () TOOL_TYPE = "opacity" @export_tool -class VolumeRenderingTool(Tool): +class VolumeRenderingTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRendering" @export_tool -class VolumeRenderingGainTool(Tool): +class VolumeRenderingGainTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRenderingGain" @export_tool -class VolumeRenderingDepthSamplesTool(Tool): +class VolumeRenderingDepthSamplesTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRenderingDepthSamples" @export_tool -class CrossSectionRenderScaleTool(Tool): +class CrossSectionRenderScaleTool(LayerTool): __slots__ = () TOOL_TYPE = "crossSectionRenderScale" @export_tool -class SelectedAlphaTool(Tool): +class SelectedAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "selectedAlpha" @export_tool -class NotSelectedAlphaTool(Tool): +class NotSelectedAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "notSelectedAlpha" @export_tool -class ObjectAlphaTool(Tool): +class ObjectAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "objectAlpha" @export_tool -class HideSegmentZeroTool(Tool): +class HideSegmentZeroTool(LayerTool): __slots__ = () TOOL_TYPE = "hideSegmentZero" @export_tool -class HoverHighlightTool(Tool): +class HoverHighlightTool(LayerTool): __slots__ = () TOOL_TYPE = "hoverHighlight" @export_tool -class BaseSegmentColoringTool(Tool): +class BaseSegmentColoringTool(LayerTool): __slots__ = () TOOL_TYPE = "baseSegmentColoring" @export_tool -class IgnoreNullVisibleSetTool(Tool): +class IgnoreNullVisibleSetTool(LayerTool): __slots__ = () TOOL_TYPE = "ignoreNullVisibleSet" @export_tool -class ColorSeedTool(Tool): +class ColorSeedTool(LayerTool): __slots__ = () TOOL_TYPE = "colorSeed" @export_tool -class SegmentDefaultColorTool(Tool): +class SegmentDefaultColorTool(LayerTool): __slots__ = () TOOL_TYPE = "segmentDefaultColor" @export_tool -class MeshRenderScaleTool(Tool): +class MeshRenderScaleTool(LayerTool): __slots__ = () TOOL_TYPE = "meshRenderScale" @export_tool -class MeshSilhouetteRenderingTool(Tool): +class MeshSilhouetteRenderingTool(LayerTool): __slots__ = () TOOL_TYPE = "meshSilhouetteRendering" @export_tool -class SaturationTool(Tool): +class SaturationTool(LayerTool): __slots__ = () TOOL_TYPE = "saturation" @export_tool -class SkeletonRenderingMode2dTool(Tool): +class SkeletonRenderingMode2dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.mode2d" @export_tool -class SkeletonRenderingMode3dTool(Tool): +class SkeletonRenderingMode3dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.mode3d" @export_tool -class SkeletonRenderingLineWidth2dTool(Tool): +class SkeletonRenderingLineWidth2dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.lineWidth2d" @export_tool -class SkeletonRenderingLineWidth3dTool(Tool): +class SkeletonRenderingLineWidth3dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.lineWidth3d" @export_tool -class ShaderControlTool(Tool): +class ShaderControlTool(LayerTool): __slots__ = () TOOL_TYPE = "shaderControl" control = wrapped_property("control", str) @export_tool -class MergeSegmentsTool(Tool): +class MergeSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "mergeSegments" @export_tool -class SplitSegmentsTool(Tool): +class SplitSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "splitSegments" @export_tool -class SelectSegmentsTool(Tool): +class SelectSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "selectSegments" @export_tool -class DimensionTool(Tool): +class DimensionTool(LayerTool): __slots__ = () TOOL_TYPE = "dimension" dimension = wrapped_property("dimension", str) @@ -342,6 +353,7 @@ class DimensionTool(Tool): @export class SidePanelLocation(JsonObjectWrapper): + __slots__ = () side = wrapped_property("side", optional(str)) visible = wrapped_property("visible", optional(bool)) size = wrapped_property("size", optional(int)) @@ -350,8 +362,16 @@ class SidePanelLocation(JsonObjectWrapper): col = wrapped_property("col", optional(int)) +@export +class ToolPalette(SidePanelLocation): + __slots__ = () + tools = wrapped_property("tools", typed_list(Tool)) + query = wrapped_property("query", optional(str)) + + @export class SelectedLayerState(SidePanelLocation): + __slots__ = () layer = wrapped_property("layer", optional(str)) @@ -1827,6 +1847,9 @@ class ViewerState(JsonObjectWrapper): tool_bindings = toolBindings = wrapped_property( "toolBindings", typed_map(key_type=str, value_type=Tool) ) + tool_palettes = toolPalettes = wrapped_property( + "toolPalettes", typed_map(key_type=str, value_type=ToolPalette) + ) @staticmethod def interpolate(a, b, t): diff --git a/src/layer/index.ts b/src/layer/index.ts index d7b1755d97..95fbf6502a 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -80,7 +80,7 @@ import { TrackableSidePanelLocation, } from "#src/ui/side_panel_location.js"; import type { GlobalToolBinder } from "#src/ui/tool.js"; -import { LocalToolBinder, SelectedLegacyTool } from "#src/ui/tool.js"; +import { LayerToolBinder, SelectedLegacyTool } from "#src/ui/tool.js"; import { gatherUpdate } from "#src/util/array.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; @@ -349,7 +349,7 @@ export class UserLayer extends RefCounted { tabs = this.registerDisposer(new TabSpecification()); panels = new UserLayerSidePanelsState(this); tool = this.registerDisposer(new SelectedLegacyTool(this)); - toolBinder: LocalToolBinder; + toolBinder: LayerToolBinder; dataSourcesChanged = new NullarySignal(); dataSources: LayerDataSource[] = []; @@ -361,7 +361,7 @@ export class UserLayer extends RefCounted { constructor(public managedLayer: Borrowed) { super(); this.toolBinder = this.registerDisposer( - new LocalToolBinder(this, this.manager.root.toolBinder), + new LayerToolBinder(this, this.manager.root.toolBinder), ); this.localCoordinateSpaceCombiner.includeDimensionPredicate = isLocalOrChannelDimension; diff --git a/src/layer_group_viewer.ts b/src/layer_group_viewer.ts index dfca69cc08..c7b195e903 100644 --- a/src/layer_group_viewer.ts +++ b/src/layer_group_viewer.ts @@ -60,11 +60,7 @@ import { registerNested } from "#src/trackable_value.js"; import { ContextMenu } from "#src/ui/context_menu.js"; import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; import { LayerBar } from "#src/ui/layer_bar.js"; -import { - endLayerDrag, - getDropEffectFromModifiers, - startLayerDrag, -} from "#src/ui/layer_drag_and_drop.js"; +import { endLayerDrag, startLayerDrag } from "#src/ui/layer_drag_and_drop.js"; import { setupPositionDropHandlers } from "#src/ui/position_drag_and_drop.js"; import { LocalToolBinder } from "#src/ui/tool.js"; import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; @@ -72,6 +68,7 @@ import type { TrackableRGB } from "#src/util/color.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeChildren } from "#src/util/dom.js"; +import { getDropEffectFromModifiers } from "#src/util/drag_and_drop.js"; import { dispatchEventAction, registerActionListener, @@ -581,6 +578,7 @@ export class LayerGroupViewer extends RefCounted { const layerPanelElement = layerPanel.element; layerPanelElement.addEventListener("dragstart", (event: DragEvent) => { pushDragStatus( + event, layerPanel.element, "drag", "Drag layer group to the left/top/right/bottom edge of a layer group, or to another layer bar/panel (including in another Neuroglancer window)", @@ -606,8 +604,8 @@ export class LayerGroupViewer extends RefCounted { layerPanel.element.style.backgroundColor = ""; }, 0); }); - layerPanel.element.addEventListener("dragend", () => { - popDragStatus(layerPanelElement, "drag"); + layerPanel.element.addEventListener("dragend", (event: DragEvent) => { + popDragStatus(event, layerPanelElement, "drag"); endLayerDrag(); if (dragSource !== undefined && dragSource.viewer === this) { dragSource.disposer(); diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index ca8c0898e3..bfcd190e89 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -475,8 +475,8 @@ function setupDropZone( } dropZone.classList.add("neuroglancer-drag-over"); }); - dropZone.addEventListener("dragleave", () => { - popDragStatus(dropZone, "drop"); + dropZone.addEventListener("dragleave", (event) => { + popDragStatus(event, dropZone, "drop"); dropZone.classList.remove("neuroglancer-drag-over"); }); dropZone.addEventListener("dragover", (event: DragEvent) => { @@ -485,7 +485,7 @@ function setupDropZone( message: string, ) => { if (info.dropEffectMessage) message += ` (${info.dropEffectMessage})`; - pushDragStatus(dropZone, "drop", message); + pushDragStatus(event, dropZone, "drop", message); event.stopPropagation(); event.preventDefault(); }; @@ -511,7 +511,7 @@ function setupDropZone( }); dropZone.addEventListener("drop", (event: DragEvent) => { dropZone.classList.remove("neuroglancer-drag-over"); - popDragStatus(dropZone, "drop"); + popDragStatus(event, dropZone, "drop"); let dropLayers: DropLayers | undefined; let layoutSpec: any; if (hasViewerDrag(event)) { @@ -606,6 +606,7 @@ export class StackLayoutComponent event.preventDefault(); const updateMessage = () => { pushDragStatus( + event, dropZone, "drag", `Drag to resize, current ${ @@ -640,8 +641,8 @@ export class StackLayoutComponent Math.round((1 - firstFraction) * existingFlexSum * 100) / 100; updateMessage(); }, - () => { - popDragStatus(dropZone, "drag"); + (event) => { + popDragStatus(event, dropZone, "drag"); }, ); }); diff --git a/src/ui/drag_and_drop.ts b/src/ui/drag_and_drop.ts index 715e53c590..560418d6e2 100644 --- a/src/ui/drag_and_drop.ts +++ b/src/ui/drag_and_drop.ts @@ -28,6 +28,7 @@ const dragStatusStack: { target: EventTarget; operation: DragStatusType; status: DragStatusRenderer; + leaveHandler?: () => void; }[] = []; function getStatusElement() { @@ -46,9 +47,21 @@ function clearStatus() { } } -function applyStatus(status: DragStatusRenderer) { +function applyStatus(event: MouseEvent, status: DragStatusRenderer) { const element = getStatusElement(); removeChildren(element); + if (event.clientX === 0 && event.clientY === 0) { + // Probably an invalid position due to dragging outside the window. + } else { + if (event.clientX < window.innerWidth / 2) { + element.style.left = "auto"; + element.style.right = "0px"; + } else { + element.style.right = "auto"; + element.style.left = "0px"; + } + } + if (typeof status === "string") { element.appendChild(document.createTextNode(status)); } else { @@ -58,23 +71,32 @@ function applyStatus(status: DragStatusRenderer) { } function removeDragStatus(target: EventTarget, operation: DragStatusType) { - filterArrayInplace( - dragStatusStack, - (entry) => !(entry.target === target && entry.operation === operation), - ); + filterArrayInplace(dragStatusStack, (entry) => { + if (entry.target === target && entry.operation === operation) { + entry.leaveHandler?.(); + return false; + } + return true; + }); } export function pushDragStatus( + event: MouseEvent, target: EventTarget, operation: DragStatusType, status: DragStatusRenderer, + leaveHandler?: () => void, ) { removeDragStatus(target, operation); - dragStatusStack.push({ target, operation, status }); - applyStatus(status); + dragStatusStack.push({ target, operation, status, leaveHandler }); + applyStatus(event, status); } -export function popDragStatus(target: EventTarget, operation: DragStatusType) { +export function popDragStatus( + event: MouseEvent, + target: EventTarget, + operation: DragStatusType, +) { removeDragStatus(target, operation); const entry = dragStatusStack.length === 0 @@ -83,6 +105,6 @@ export function popDragStatus(target: EventTarget, operation: DragStatusType) { if (entry === undefined) { clearStatus(); } else { - applyStatus(entry.status); + applyStatus(event, entry.status); } } diff --git a/src/ui/layer_data_sources_tab.ts b/src/ui/layer_data_sources_tab.ts index 154f4299fe..d3f94ef32a 100644 --- a/src/ui/layer_data_sources_tab.ts +++ b/src/ui/layer_data_sources_tab.ts @@ -52,6 +52,7 @@ import type { MessageList } from "#src/util/message_list.js"; import { MessageSeverity } from "#src/util/message_list.js"; import { makeAddButton } from "#src/widget/add_button.js"; import { CoordinateSpaceTransformWidget } from "#src/widget/coordinate_transform.js"; +import type { Completer } from "#src/widget/multiline_autocomplete.js"; import { AutocompleteTextInput, makeCompletionElementWithDescription, @@ -63,7 +64,7 @@ class SourceUrlAutocomplete extends AutocompleteTextInput { dirty: WatchableValueInterface; constructor(dataSourceView: DataSourceView) { const { manager } = dataSourceView.source.layer; - const sourceCompleter = (value: string, abortSignal: AbortSignal) => + const sourceCompleter: Completer = ({ value }, abortSignal: AbortSignal) => manager.dataSourceProviderRegistry .completeUrl({ url: value, diff --git a/src/ui/layer_drag_and_drop.ts b/src/ui/layer_drag_and_drop.ts index fb6f87d9dc..4c3867e671 100644 --- a/src/ui/layer_drag_and_drop.ts +++ b/src/ui/layer_drag_and_drop.ts @@ -26,6 +26,7 @@ import { decodeParametersFromDragTypeList, encodeParametersAsDragType, getDropEffect, + getDropEffectFromModifiers, setDropEffect, } from "#src/util/drag_and_drop.js"; import { @@ -228,42 +229,6 @@ export class DropLayers { type LayerDropEffect = "none" | "move" | "copy" | "link"; -export function getDropEffectFromModifiers( - event: DragEvent, - defaultDropEffect: DropEffect, - moveAllowed: boolean, -): { dropEffect: DropEffect | "move" | "copy"; dropEffectMessage: string } { - let dropEffect: DropEffect | "move" | "copy"; - if (event.shiftKey) { - dropEffect = "copy"; - } else if (event.ctrlKey && moveAllowed) { - dropEffect = "move"; - } else { - dropEffect = defaultDropEffect; - } - let message = ""; - const addMessage = (msg: string) => { - if (message !== "") { - message += ", "; - } - message += msg; - }; - if (defaultDropEffect !== "none" && dropEffect !== defaultDropEffect) { - if (event.shiftKey) { - addMessage(`release SHIFT to ${defaultDropEffect}`); - } else { - addMessage(`release CONTROL to ${defaultDropEffect}`); - } - } - if (dropEffect !== "copy") { - addMessage("hold SHIFT to copy"); - } - if (dropEffect !== "move" && moveAllowed && defaultDropEffect !== "move") { - addMessage("hold CONTROL to move"); - } - return { dropEffect, dropEffectMessage: message }; -} - export function getLayerDropEffect( event: DragEvent, manager: Borrowed, @@ -523,13 +488,13 @@ export function registerLayerBarDropHandlers( if (update(event, /*updateDropEffect=*/ true) !== undefined) { event.preventDefault(); } else { - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); } }); target.addEventListener("drop", (event: DragEvent) => { event.preventDefault(); panel.dragEnterCount = 0; - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); const dropLayers = update(event, /*updateDropEffect=*/ false)?.dropLayers; panel.dropLayers = undefined; if (dropLayers === undefined) return; @@ -545,7 +510,7 @@ export function registerLayerBarDropHandlers( target.addEventListener("dragover", (event: DragEvent) => { const updateResult = update(event, /*updateDropEffect=*/ true); if (updateResult === undefined) { - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); return; } const { dropLayers, dropEffect, dropEffectMessage } = updateResult; @@ -565,7 +530,7 @@ export function registerLayerBarDropHandlers( if (dropEffectMessage) { message += ` (${dropEffectMessage})`; } - pushDragStatus(panel.element, "drop", message); + pushDragStatus(event, panel.element, "drop", message); event.preventDefault(); event.stopPropagation(); }); @@ -580,6 +545,7 @@ export function registerLayerDragHandlers( element.draggable = true; element.addEventListener("dragstart", (event: DragEvent) => { pushDragStatus( + event, element, "drag", "Drag layer to another layer bar/panel (including in another Neuroglancer window), " + @@ -593,8 +559,8 @@ export function registerLayerDragHandlers( }); event.stopPropagation(); }); - element.addEventListener("dragend", () => { - popDragStatus(element, "drag"); + element.addEventListener("dragend", (event) => { + popDragStatus(event, element, "drag"); // This call to endLayerDrag is a no-op if a drag was completed successfully within the same // browser window, because it will already have been called by the `drop` handler. This call // has an effect only for a cancelled drag or a successful cross-browser window drag. @@ -610,9 +576,9 @@ export function registerLayerBarDragLeaveHandler(panel: LayerBarDropInterface) { panel.element.addEventListener("dragenter", () => { ++panel.dragEnterCount; }); - panel.element.addEventListener("dragleave", () => { + panel.element.addEventListener("dragleave", (event) => { if (--panel.dragEnterCount !== 0) return; - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); const { dropLayers } = panel; if (dropLayers !== undefined) { destroyDropLayers(dropLayers); diff --git a/src/ui/layer_list_panel.ts b/src/ui/layer_list_panel.ts index d3251143b8..5fe9597b48 100644 --- a/src/ui/layer_list_panel.ts +++ b/src/ui/layer_list_panel.ts @@ -72,7 +72,7 @@ export class LayerListPanelState implements Trackable { } } -class LayerVisibilityWidget extends RefCounted { +export class LayerVisibilityWidget extends RefCounted { element = document.createElement("div"); constructor(public layer: ManagedUserLayer) { super(); diff --git a/src/ui/layer_side_panel.ts b/src/ui/layer_side_panel.ts index 56136d6af1..86a1536d3b 100644 --- a/src/ui/layer_side_panel.ts +++ b/src/ui/layer_side_panel.ts @@ -250,8 +250,6 @@ class LayerSidePanel extends SidePanel { handleTabElement: (id: string, element: HTMLElement) => { element.draggable = true; element.addEventListener("dragstart", (event: DragEvent) => { - event.stopPropagation(); - event.dataTransfer!.setData("neuroglancer-side-panel", ""); let message = "Drag tab to dock as new panel to the left/right/top/bottom of another panel"; const hasOtherPanel = panelState.panels.panels.find( @@ -262,7 +260,7 @@ class LayerSidePanel extends SidePanel { layer.managedLayer.name, )} panel`; } - pushDragStatus(element, "drag", message); + pushDragStatus(event, element, "drag", message); this.sidePanelManager.startDrag( { dropAsNewPanel: (location) => { @@ -271,6 +269,10 @@ class LayerSidePanel extends SidePanel { ...location, }); }, + getNewPanelDropEffect: () => ({ + description: "tab", + dropEffect: "move", + }), canDropAsTabs: (target) => { if ( target instanceof LayerSidePanel && @@ -292,8 +294,7 @@ class LayerSidePanel extends SidePanel { ); }); element.addEventListener("dragend", (event: DragEvent) => { - event; - popDragStatus(element, "drag"); + popDragStatus(event, element, "drag"); this.sidePanelManager.endDrag(); }); }, @@ -352,14 +353,15 @@ class LayerSidePanel extends SidePanel { if (!numTabs) return; element.classList.add(DRAG_OVER_CLASSNAME); pushDragStatus( + event, element, "drop", `Move ${numTabs} ${numTabs === 1 ? "tab" : "tabs"} to this panel`, ); event.preventDefault(); }); - element.addEventListener("dragleave", () => { - popDragStatus(element, "drop"); + element.addEventListener("dragleave", (event) => { + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); }); element.addEventListener("dragover", (event) => { @@ -368,7 +370,7 @@ class LayerSidePanel extends SidePanel { event.preventDefault(); }); element.addEventListener("drop", (event) => { - popDragStatus(element, "drop"); + popDragStatus(event, element, "drop"); const { dragSource } = this.sidePanelManager; if (!dragSource?.canDropAsTabs?.(this)) return; element.classList.remove(DRAG_OVER_CLASSNAME); diff --git a/src/ui/side_panel.ts b/src/ui/side_panel.ts index a0e9c285f7..14d97c437a 100644 --- a/src/ui/side_panel.ts +++ b/src/ui/side_panel.ts @@ -18,10 +18,15 @@ import "#src/ui/side_panel.css"; import type { DisplayContext } from "#src/display_context.js"; import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; -import type { Side } from "#src/ui/side_panel_location.js"; +import type { Side, SidePanelLocation } from "#src/ui/side_panel_location.js"; import { TrackableSidePanelLocation } from "#src/ui/side_panel_location.js"; import { RefCounted } from "#src/util/disposable.js"; import { updateChildren } from "#src/util/dom.js"; +import { + getDropEffect, + getDropEffectFromModifiers, + setDropEffect, +} from "#src/util/drag_and_drop.js"; import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Signal } from "#src/util/signal.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; @@ -87,6 +92,11 @@ export class SidePanel extends RefCounted { visibility = new WatchableVisibilityPriority( WatchableVisibilityPriority.VISIBLE, ); + + getDragDropDescription() { + return "side panel"; + } + constructor( public sidePanelManager: SidePanelManager, public location: TrackableSidePanelLocation = new TrackableSidePanelLocation(), @@ -101,26 +111,55 @@ export class SidePanel extends RefCounted { setTimeout(() => { element.style.backgroundColor = ""; }, 0); - pushDragStatus(element, "drag", () => { - return document.createTextNode( - "Drag side panel to move it to the left/right/top/bottom of another panel", - ); - }); + pushDragStatus( + event, + element, + "drag", + `Drag ${this.getDragDropDescription()} to move it to the left/right/top/bottom of another panel`, + ); }); element.addEventListener("dragend", (event: DragEvent) => { - event; this.sidePanelManager.endDrag(); - popDragStatus(element, "drag"); + popDragStatus(event, element, "drag"); }); } + canCopy() { + return false; + } + + copyToNewLocation(location: SidePanelLocation) { + location; + } + makeDragSource(): DragSource { return { - dropAsNewPanel: (location) => { + dropAsNewPanel: (location, dropEffect) => { const oldLocation = this.location.value; - this.location.value = { ...oldLocation, ...location }; + const newLocation: SidePanelLocation = { ...oldLocation, ...location }; + console.log({ oldLocation, newLocation }); + if (dropEffect === "copy") { + this.copyToNewLocation(newLocation); + return; + } + this.location.value = newLocation; this.location.locationChanged.dispatch(); }, + getNewPanelDropEffect: (event) => { + const description = this.getDragDropDescription(); + if (this.canCopy()) { + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ "move", + /*moveAllowed=*/ true, + ); + return { + description, + ...result, + }; + } + return { description, dropEffect: "move" }; + }, }; } @@ -193,7 +232,16 @@ export interface SidePanelDropLocation { export interface DragSource { canDropAsTabs?: (target: SidePanel) => number; dropAsTab?: (target: SidePanel) => void; - dropAsNewPanel: (location: SidePanelDropLocation) => void; + dropAsNewPanel: ( + location: SidePanelDropLocation, + dropEffect: DataTransfer["dropEffect"], + ) => void; + getNewPanelDropEffect: (event: DragEvent) => { + dropEffect: DataTransfer["dropEffect"]; + description: string; + dropEffectMessage?: string; + leaveHandler?: () => void; + }; } export interface RegisteredSidePanel { @@ -307,33 +355,46 @@ export class SidePanelManager extends RefCounted { element.style.position = "relative"; element.style[MARGIN_FOR_SIDE[OPPOSITE_SIDE[zoneSide]]] = `-${size}px`; } + + const update = (event: DragEvent) => { + const { dragSource } = this; + if (dragSource === undefined) return false; + event.preventDefault(); + const { dropEffect, description, dropEffectMessage, leaveHandler } = + dragSource.getNewPanelDropEffect(event); + setDropEffect(event, dropEffect); + let message = `Drop to ${dropEffect} ${description} to new ${zoneFlexDirection}`; + if (dropEffectMessage) message += ` (${dropEffectMessage})`; + pushDragStatus(event, element, "drop", message, leaveHandler); + return true; + }; element.addEventListener("dragenter", (event) => { - if (!this.hasDroppablePanel()) return; + if (!update(event)) return; element.classList.add(DRAG_OVER_CLASSNAME); event.preventDefault(); - pushDragStatus(element, "drop", () => - document.createTextNode(`Drop side panel as new ${zoneFlexDirection}`), - ); }); - element.addEventListener("dragleave", () => { - popDragStatus(element, "drop"); + element.addEventListener("dragleave", (event) => { + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); }); element.addEventListener("dragover", (event) => { - if (!this.hasDroppablePanel()) return; + if (!update(event)) return; event.preventDefault(); }); element.addEventListener("drop", (event) => { const { dragSource } = this; if (dragSource === undefined) return; - popDragStatus(element, "drop"); + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); const flexDirection = FLEX_DIRECTION_FOR_SIDE[side]; - dragSource.dropAsNewPanel({ - side, - row: flexDirection === "column" ? flexIndex : crossIndex, - col: flexDirection === "row" ? flexIndex : crossIndex, - }); + dragSource.dropAsNewPanel( + { + side, + row: flexDirection === "column" ? flexIndex : crossIndex, + col: flexDirection === "row" ? flexIndex : crossIndex, + }, + getDropEffect() ?? "none", + ); this.dragSource = undefined; event.preventDefault(); event.stopPropagation(); @@ -421,6 +482,7 @@ export class SidePanelManager extends RefCounted { const minSize = flexGroup.minSize; const updateMessage = () => { pushDragStatus( + event, gutter, "drag", `Drag to resize, current ${SIZE_FOR_DIRECTION[direction]} is ${flexGroup.crossSize}px`, @@ -436,8 +498,8 @@ export class SidePanelManager extends RefCounted { updateMessage(); this.invalidateLayout(); }, - () => { - popDragStatus(gutter, "drag"); + (event) => { + popDragStatus(event, gutter, "drag"); }, ); }); @@ -479,8 +541,9 @@ export class SidePanelManager extends RefCounted { } if (nextFlexIndex === cells.length) return; const nextCell = cells[nextFlexIndex]; - const updateMessage = () => { + const updateMessage = (event: MouseEvent) => { pushDragStatus( + event, gutter, "drag", `Drag to resize, current ${SIZE_FOR_DIRECTION[direction]} ratio is ` + @@ -488,7 +551,7 @@ export class SidePanelManager extends RefCounted { `${nextCell.registeredPanel.location.value.flex}`, ); }; - updateMessage(); + updateMessage(event); startRelativeMouseDrag( event, (newEvent) => { @@ -519,13 +582,13 @@ export class SidePanelManager extends RefCounted { ...secondLocation, flex: Math.round((1 - firstFraction) * existingFlexSum * 100) / 100, }; - updateMessage(); + updateMessage(newEvent); cell.registeredPanel.location.locationChanged.dispatch(); nextCell.registeredPanel.location.locationChanged.dispatch(); this.invalidateLayout(); }, - () => { - popDragStatus(gutter, "drag"); + (event) => { + popDragStatus(event, gutter, "drag"); }, ); }); diff --git a/src/ui/tool.ts b/src/ui/tool.ts index 9f34b700f1..44bc9d5b22 100644 --- a/src/ui/tool.ts +++ b/src/ui/tool.ts @@ -24,9 +24,19 @@ import { debounce } from "lodash-es"; import type { MouseSelectionState, UserLayer } from "#src/layer/index.js"; import { StatusMessage } from "#src/status.js"; import type { TrackableValueInterface } from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { beginToolDrag, endToolDrag } from "#src/ui/tool_drag_and_drop.js"; +import type { + MultiToolPaletteState, + ToolPalettePanel, +} from "#src/ui/tool_palette.js"; +import type { Query, QueryTerm } from "#src/ui/tool_query.js"; +import { matchesTerms, matchPredicate } from "#src/ui/tool_query.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; +import { getDropEffectFromModifiers } from "#src/util/drag_and_drop.js"; import type { ActionEvent, EventActionMap, @@ -73,7 +83,10 @@ export class ToolActivation extends RefCounted { export abstract class Tool extends RefCounted { changed = new Signal(); + unbound = new Signal(); + keyBinding: string | undefined = undefined; + savedJsonString: string | undefined = undefined; get context() { return this.localBinder.context; @@ -90,6 +103,11 @@ export abstract class Tool extends RefCounted { super(); } abstract activate(activation: ToolActivation): void; + renderInPalette(context: RefCounted): HTMLElement | undefined { + context; + return undefined; + } + abstract toJSON(): any; abstract description: string; unbind() { @@ -97,6 +115,7 @@ export abstract class Tool extends RefCounted { if (keyBinding !== undefined) { this.localBinder.set(keyBinding, undefined); } + this.unbound.dispatch(); } } @@ -157,9 +176,9 @@ export function restoreTool( while (true) { prototype = Object.getPrototypeOf(prototype); if (prototype === null) { - throw new Error(`Invalid tool type: ${JSON.stringify(obj)}.`); + return undefined; } - getter = toolsForPrototype.get(prototype)?.get(type); + getter = toolsForPrototype.get(prototype)?.get(type)?.getter; if (getter !== undefined) break; } return getter(context, obj); @@ -186,13 +205,21 @@ export type ToolGetter = ( options: any, ) => Owned | undefined; +export type ToolLister = ( + context: Context, + onChange?: () => void, +) => any[]; + export type LegacyToolGetter = ( layer: LayerType, options: any, ) => Owned | undefined; const legacyTools = new Map(); -const toolsForPrototype = new Map>(); +const toolsForPrototype = new Map< + object, + Map +>(); export function registerLegacyTool(type: string, getter: LegacyToolGetter) { legacyTools.set(type, getter); @@ -202,6 +229,7 @@ export function registerTool( contextType: AnyConstructor, type: string, getter: ToolGetter, + lister?: ToolLister, ) { const { prototype } = contextType; let tools = toolsForPrototype.get(prototype); @@ -209,7 +237,7 @@ export function registerTool( tools = new Map(); toolsForPrototype.set(prototype, tools); } - tools.set(type, getter); + tools.set(type, { getter, lister }); } export class SelectedLegacyTool @@ -277,7 +305,13 @@ export class GlobalToolBinder extends RefCounted { }, 100), ); - constructor(private inputEventMapBinder: InputEventMapBinder) { + localBinders = new Set(); + localBindersChanged = new Signal(); + + constructor( + private inputEventMapBinder: InputEventMapBinder, + public toolPaletteState: MultiToolPaletteState, + ) { super(); } @@ -285,35 +319,78 @@ export class GlobalToolBinder extends RefCounted { return this.bindings.get(key); } + private deleteBinding(tool: Tool) { + const keyBinding = tool.keyBinding!; + tool.keyBinding = undefined; + this.bindings.delete(keyBinding); + const localToolBinder = tool.localBinder; + localToolBinder.bindings.delete(keyBinding); + const { jsonToKey } = localToolBinder; + const { savedJsonString } = tool; + if (jsonToKey.get(savedJsonString!) === keyBinding) { + jsonToKey.delete(savedJsonString!); + } + this.destroyTool(tool); + } + + private toolJsonMaybeChanged(tool: Tool) { + // Check if tool is still bound. + let { keyBinding } = tool; + if (keyBinding === undefined) return; + let newJson = JSON.stringify(tool.toJSON()); + if (newJson === tool.savedJsonString) return; + + const localToolBinder = tool.localBinder; + localToolBinder.jsonToKey.delete(tool.savedJsonString!); + + // In the case of `DimensionTool`, there may be a chain of bindings that + // have to be updated. + while (true) { + const nextKeyBinding = localToolBinder.jsonToKey.get(newJson); + localToolBinder.jsonToKey.set(newJson, keyBinding!); + tool.savedJsonString = newJson; + keyBinding = nextKeyBinding; + if (keyBinding === undefined) { + // End of chain, all conflicts resolved. + break; + } + tool = localToolBinder.bindings.get(keyBinding)!; + const nextJson = JSON.stringify(tool.toJSON()); + if (nextJson === newJson) { + // End of chain, conflict remains. + this.deleteBinding(tool); + break; + } + newJson = nextJson; + } + localToolBinder.changed.dispatch(); + this.changed.dispatch(); + } + set(key: string, tool: Owned | undefined) { const { bindings } = this; const existingTool = bindings.get(key); if (existingTool !== undefined) { - existingTool.keyBinding = undefined; - bindings.delete(key); - const localToolBinder = existingTool.localBinder; - localToolBinder.bindings.delete(key); - localToolBinder.jsonToKey.delete(JSON.stringify(existingTool.toJSON())); - this.destroyTool(existingTool); - localToolBinder.changed.dispatch(); + this.deleteBinding(existingTool); + existingTool.localBinder.changed.dispatch(); } if (tool !== undefined) { const localToolBinder = tool.localBinder; const json = JSON.stringify(tool.toJSON()); + tool.savedJsonString = json; const existingKey = localToolBinder.jsonToKey.get(json); if (existingKey !== undefined) { const existingTool = localToolBinder.bindings.get(existingKey)!; - existingTool.keyBinding = undefined; - bindings.delete(existingKey); - localToolBinder.bindings.delete(existingKey); - localToolBinder.jsonToKey.delete(json); - this.destroyTool(existingTool); + this.deleteBinding(existingTool); } localToolBinder.bindings.set(key, tool); tool.keyBinding = key; localToolBinder.jsonToKey.set(json, key); bindings.set(key, tool); localToolBinder.changed.dispatch(); + tool.changed.add(() => { + this.toolJsonMaybeChanged(tool); + }); } this.changed.dispatch(); } @@ -395,6 +472,9 @@ export class GlobalToolBinder extends RefCounted { disposed() { this.deactivate_(); super.disposed(); + for (const tool of this.bindings.values()) { + tool.dispose(); + } } deactivate_() { @@ -421,9 +501,17 @@ export class LocalToolBinder< public globalBinder: GlobalToolBinder, ) { super(); + globalBinder.localBinders.add(this); + globalBinder.localBindersChanged.dispatch(); + } + + getSortOrder() { + return Number.NEGATIVE_INFINITY; } disposed() { + this.globalBinder.localBinders.delete(this); + this.globalBinder.localBindersChanged.dispatch(); this.clear(); super.disposed(); } @@ -458,6 +546,14 @@ export class LocalToolBinder< return obj; } + getCommonToolProperties(): any { + return {}; + } + + convertLocalJSONToPaletteJSON(toolJson: any) { + return toolJson; + } + clear() { const { globalBinder, bindings } = this; if (bindings.size !== 0) { @@ -491,12 +587,55 @@ export class LocalToolBinder< } } +export class LayerToolBinder< + LayerType extends UserLayer, +> extends LocalToolBinder { + getCommonToolProperties() { + return { + layer: this.context.managedLayer.name, + layerType: this.context.managedLayer.layer?.type, + }; + } + convertLocalJSONToPaletteJSON(toolJson: any) { + let j = toolJson; + if (typeof j === "string") { + j = { type: j }; + } + return { layer: this.context.managedLayer.name, ...j }; + } + + getSortOrder(): number { + const { managedLayer } = this.context; + managedLayer.manager.layerManager.updateNonArchivedLayerIndices(); + return this.context.managedLayer.nonArchivedLayerIndex; + } +} + +export function updateToolDragDropEffect( + dragSource: ToolDragSource, + dropEffect?: string, + dropSamePalette: boolean = false, +) { + const { paletteState, dragElement } = dragSource; + if (paletteState === undefined || dragElement === undefined) return; + const cssClass = "neuroglancer-tool-to-be-removed"; + if (dropEffect === "move" && dropSamePalette === false) { + dragElement.classList.add(cssClass); + } else { + dragElement.classList.remove(cssClass); + } +} + export class ToolBindingWidget extends RefCounted { element = document.createElement("div"); private toolJsonString: string; constructor( public localBinder: LocalToolBinder, public toolJson: any, + public dragElement: HTMLElement | undefined, + public paletteState: + | { tool: Tool; palette: ToolPalettePanel } + | undefined = undefined, ) { super(); this.toolJsonString = JSON.stringify(toolJson); @@ -517,6 +656,63 @@ export class ToolBindingWidget extends RefCounted { addToolKeyBindHandlers(this, element, (key) => this.localBinder.setJson(key, this.toolJson), ); + if (dragElement !== undefined) { + dragElement.draggable = true; + dragElement.addEventListener("dragstart", (event: DragEvent) => { + pushDragStatus( + event, + dragElement, + "drag", + "Drag tool to another tool palette, " + + "or to the left/top/right/bottom edge of a layer group to create a new tool palette", + ); + beginToolDrag(this); + const { toolPaletteState } = this.localBinder.globalBinder; + const self = this; + toolPaletteState.viewer.sidePanelManager.startDrag( + { + dropAsNewPanel: (location, dropEffect) => { + const palette = toolPaletteState.addNew({ location }); + palette.tools.insert( + this.localBinder.convertLocalJSONToPaletteJSON(toolJson), + ); + if (dropEffect === "move") { + const { paletteState } = this; + if (paletteState?.palette.state.queryDefined.value === false) { + paletteState.palette.state.tools.remove(paletteState.tool); + } + } + }, + getNewPanelDropEffect: (event) => { + const inExplicitPalette = + this.paletteState?.palette.state.queryDefined.value === false; + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ inExplicitPalette ? "move" : "copy", + /*moveAllowed=*/ inExplicitPalette, + ); + updateToolDragDropEffect( + self, + result.dropEffect, + /*dropSamePalette=*/ false, + ); + const leaveHandler = () => { + updateToolDragDropEffect(self); + }; + return { ...result, description: "tool", leaveHandler }; + }, + }, + event, + ); + }); + dragElement.addEventListener("dragend", (event: DragEvent) => { + popDragStatus(event, dragElement, "drag"); + endToolDrag(this); + const { toolPaletteState } = this.localBinder.globalBinder; + toolPaletteState.viewer.sidePanelManager.endDrag(); + event.stopPropagation(); + }); + } } private updateView() { @@ -576,13 +772,22 @@ export function addToolKeyBindHandlers( export function makeToolButton( context: RefCounted, localBinder: LocalToolBinder, - options: { toolJson: any; label?: string; title?: string }, + options: { + toolJson: any; + label?: string; + title?: string; + dragElement?: HTMLElement; + }, ) { const element = document.createElement("div"); element.classList.add("neuroglancer-tool-button"); element.appendChild( context.registerDisposer( - new ToolBindingWidget(localBinder, options.toolJson), + new ToolBindingWidget( + localBinder, + options.toolJson, + options.dragElement ?? element, + ), ).element, ); const labelElement = document.createElement("div"); @@ -633,3 +838,112 @@ export function makeToolActivationStatusMessageWithHeader( content.appendChild(body); return { message, body, header }; } + +function* getToolsFromListerMatchingTerms( + localBinder: LocalToolBinder, + lister: ToolLister, + terms: QueryTerm[], + commonProperties: { [key: string]: string }, + onChange: (() => void) | undefined, +) { + for (const tool of lister(localBinder.context, onChange)) { + if (matchesTerms(tool, terms)) { + yield { + ...localBinder.convertLocalJSONToPaletteJSON(tool), + ...commonProperties, + }; + } + } +} + +function* getToolsMatchingTerms( + localBinder: LocalToolBinder, + terms: QueryTerm[], + onChange?: () => void, +) { + const typePredicate = terms.find( + (term) => term.property === "type", + )?.predicate; + const typeEquals = + typePredicate !== undefined && "equals" in typePredicate + ? typePredicate.equals + : undefined; + const commonProperties = localBinder.getCommonToolProperties(); + for (const term of terms) { + const { property } = term; + if (property in commonProperties) { + if (!matchPredicate(term.predicate, commonProperties[property])) { + return; + } + } + } + const remainingTerms = terms.filter( + (term) => !(term.property in commonProperties) && term.property !== "type", + ); + + const { context } = localBinder; + let prototype = context; + while (true) { + prototype = Object.getPrototypeOf(prototype); + if (prototype === null) { + break; + } + const toolMap = toolsForPrototype.get(prototype); + if (toolMap === undefined) continue; + if (typeEquals !== undefined) { + const lister = toolMap.get(typeEquals)?.lister; + if (lister === undefined) continue; + yield* getToolsFromListerMatchingTerms( + localBinder, + lister, + remainingTerms, + commonProperties, + onChange, + ); + break; + } + for (const [type, { lister }] of toolMap) { + if (lister === undefined) continue; + if (typePredicate !== undefined && !matchPredicate(typePredicate, type)) { + continue; + } + yield* getToolsFromListerMatchingTerms( + localBinder, + lister, + remainingTerms, + commonProperties, + onChange, + ); + } + } +} + +export function getMatchingTools( + globalBinder: GlobalToolBinder, + query: Query, + onChange?: () => void, +): Map { + const matchingTools = new Map(); + + const localBinders = Array.from(globalBinder.localBinders); + localBinders.sort((a, b) => a.getSortOrder() - b.getSortOrder()); + + for (const localBinder of localBinders) { + for (const { include, terms } of query.clauses) { + for (const toolJson of getToolsMatchingTerms( + localBinder, + terms, + onChange, + )) { + const identifier = JSON.stringify(toolJson); + if (include) { + matchingTools.set(identifier, toolJson); + } else { + matchingTools.delete(identifier); + } + } + } + } + + return matchingTools; +} diff --git a/src/ui/tool_drag_and_drop.ts b/src/ui/tool_drag_and_drop.ts new file mode 100644 index 0000000000..baab0c27b1 --- /dev/null +++ b/src/ui/tool_drag_and_drop.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { LocalToolBinder, Tool } from "#src/ui/tool.js"; +import type { ToolPalettePanel } from "#src/ui/tool_palette.js"; + +export interface ToolDragSource { + readonly localBinder: LocalToolBinder; + readonly toolJson: any; + dragElement?: HTMLElement | undefined; + paletteState?: + | { + tool: Tool; + palette: ToolPalettePanel; + } + | undefined; +} + +export let toolDragSource: ToolDragSource | undefined = undefined; + +export function beginToolDrag(source: ToolDragSource) { + toolDragSource = source; +} + +export function endToolDrag(source: ToolDragSource) { + if (toolDragSource === source) { + toolDragSource = undefined; + } +} diff --git a/src/ui/tool_palette.css b/src/ui/tool_palette.css new file mode 100644 index 0000000000..1b414a271f --- /dev/null +++ b/src/ui/tool_palette.css @@ -0,0 +1,205 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.neuroglancer-tool-palette-button-container { + display: inline-flex; + flex-direction: row; +} + +.neuroglancer-tool-palette-button-container { + border-radius: 20%; + border: 1px solid transparent; +} + +.neuroglancer-tool-palette-button-container:hover { + background-color: #484848; +} + +.neuroglancer-tool-palette-button { + position: relative; + display: flex; + flex-direction: row; +} + +.neuroglancer-tool-palette-dropdown { + position: absolute; + z-index: 100; + min-width: min(50vw, 300px); + border: 1px solid #aaa; + background-color: black; + padding: 2px; +} + +.neuroglancer-tool-palette-name { + flex: 1; + background-color: transparent; + border: 0px; + color: white; + outline: 0px; + /* ensure if name gets too long it doesn't push buttons over */ + width: 0px; + min-width: 0px; +} + +.neuroglancer-tool-palette-dropdown > ul { + overflow-y: auto; + padding: 0px; + margin: 0px; +} + +.neuroglancer-tool-palette-dropdown + > ul + > li:not(.neuroglancer-tool-palette-dropdown-separator) { + display: flex; + flex-direction: row; + list-style-type: none; + padding: 2px; + font: 10pt sans-serif; +} + +.neuroglancer-tool-palette-dropdown + > ul + > li:not(.neuroglancer-tool-palette-dropdown-separator):hover { + background-color: #333; +} + +.neuroglancer-tool-palette-dropdown-canned-item { + cursor: pointer; +} + +.neuroglancer-tool-palette-dropdown-separator { + height: 1px; + margin-top: 3px; + margin-bottom: 3px; + padding: 0px; + background-color: #ccc; +} + +.neuroglancer-tool-palette-drop-zone { + display: block; + flex: 1; +} + +.neuroglancer-tool-palette-items { + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0px; + font: 10pt sans-serif; + overflow-y: auto; + overflow-x: hidden; +} + +.neuroglancer-tool-palette-tool-container { + display: grid; + grid-template-columns: auto 1fr; + align-items: center; + padding-top: 2px; + padding-bottom: 2px; +} + +.neuroglancer-tool-palette-tool-container:hover { + background-color: #282828; +} + +.neuroglancer-tool-palette-tool-container + > .neuroglancer-tool-palette-tool-content { + grid-row: 1; + grid-column: 2; +} + +.neuroglancer-tool-palette-tool-container + > .neuroglancer-tool-palette-tool-properties { + grid-row: 2; + grid-column: 1/3; +} + +.neuroglancer-tool-palette-tool-container > .neuroglancer-tool-key-binding { + grid-row: 1; + grid-column: 1; +} + +.neuroglancer-tool-palette-tool-delete { + visibility: hidden; +} + +.neuroglancer-tool-palette-tool-container:hover + > .neuroglancer-tool-palette-tool-delete { + visibility: inherit; +} + +.neuroglancer-tool-palette-layer-group-header { + display: flex; + flex-direction: row; + background-color: #181818; + margin-bottom: 2px; + position: sticky; + top: 0px; + z-index: 1; +} + +.neuroglancer-tool-palette-layer-group:hover + > .neuroglancer-tool-palette-layer-group-header { + background-color: #282828; +} + +.neuroglancer-tool-palette-layer-group { + border-left: 2px solid #181818; +} + +.neuroglancer-tool-palette-layer-group:hover { + border-left: 2px solid #ccc; +} + +.neuroglancer-tool-palette-body { + display: flex; + flex-direction: column; + flex: 1; +} + +.neuroglancer-tool-palette-body .neuroglancer-multiline-autocomplete-dropdown { + z-index: 2; +} + +.neuroglancer-tool-palette-query-errors { + margin: 0px; + padding: 0px; + margin-bottom: 2px; +} + +.neuroglancer-tool-palette-query-errors > li { + list-style-type: none; + padding: 2px; + font: 10pt sans-serif; + color: red; +} + +.neuroglancer-tool-palette-tool-properties { + display: none; + color: #f9f; + font-style: italic; + user-select: text; +} + +.neuroglancer-tool-palette-show-properties + .neuroglancer-tool-palette-tool-properties { + display: block; +} + +.neuroglancer-tool-to-be-removed { + opacity: 50%; +} diff --git a/src/ui/tool_palette.ts b/src/ui/tool_palette.ts new file mode 100644 index 0000000000..8425a95883 --- /dev/null +++ b/src/ui/tool_palette.ts @@ -0,0 +1,1310 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/ui/tool_palette.css"; + +import svg_search from "ikonate/icons/search.svg?raw"; +import svg_tool from "ikonate/icons/tool.svg?raw"; +import { debounce } from "lodash-es"; +import type { UserLayer } from "#src/layer/index.js"; +import { + ElementVisibilityFromTrackableBoolean, + TrackableBooleanCheckbox, +} from "#src/trackable_boolean.js"; +import { + makeCachedDerivedWatchableValue, + makeCachedLazyDerivedWatchableValue, + TrackableValue, + WatchableValue, +} from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import { LayerVisibilityWidget } from "#src/ui/layer_list_panel.js"; +import { LayerNameWidget } from "#src/ui/layer_side_panel.js"; +import type { + RegisteredSidePanel, + SidePanelManager, +} from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; +import { + DEFAULT_SIDE_PANEL_LOCATION, + TrackableSidePanelLocation, +} from "#src/ui/side_panel_location.js"; +import type { Tool } from "#src/ui/tool.js"; +import { + getMatchingTools, + LayerToolBinder, + restoreTool, + ToolBindingWidget, + updateToolDragDropEffect, +} from "#src/ui/tool.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { toolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { + getPropertyNameCompletions, + getPropertyValueCompletions, + getQueryTermToComplete, + parsePartialToolQuery, + parseToolQuery, +} from "#src/ui/tool_query.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { + updateChildren, + removeFromParent, + removeChildren, +} from "#src/util/dom.js"; +import { + getDropEffectFromModifiers, + getDropEffect, + setDropEffect, +} from "#src/util/drag_and_drop.js"; +import { positionRelativeDropdown } from "#src/util/dropdown.js"; +import { + parseArray, + verifyObject, + verifyOptionalObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { CompoundTrackable, getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import type { + CompletionResult, + CompletionWithDescription, +} from "#src/widget/multiline_autocomplete.js"; +import { + AutocompleteTextInput, + makeCompletionElementWithDescription, +} from "#src/widget/multiline_autocomplete.js"; +import { TextInputWidget } from "#src/widget/text_input.js"; + +const DEFAULT_TOOL_PALETTE_PANEL_LOCATION: SidePanelLocation = { + ...DEFAULT_SIDE_PANEL_LOCATION, + side: "right", + row: 0, + visible: true, +}; + +function getToolFromJson(viewer: Viewer, toolJson: unknown): Tool | undefined { + verifyObject(toolJson); + const layerName = verifyOptionalObjectProperty( + toolJson, + "layer", + verifyString, + ); + if (layerName !== undefined) { + const { layer: _ignoredLayer, ...adjustedToolJson } = toolJson as any; + const managedLayer = viewer.layerManager.getLayerByName(layerName); + if (managedLayer === undefined) { + return undefined; + } + const userLayer = managedLayer.layer; + if (userLayer === null) { + return undefined; + } + return restoreTool(userLayer, adjustedToolJson); + } else { + return restoreTool(viewer, toolJson); + } +} + +export class TrackableToolList extends RefCounted implements Trackable { + tools: Tool[] = []; + + changed = new NullarySignal(); + + constructor(private viewer: Viewer) { + super(); + } + + get value() { + return this.tools; + } + + reset() { + const { tools } = this; + if (tools.length === 0) return; + for (const tool of tools) { + tool.dispose(); + } + tools.length = 0; + this.changed.dispatch(); + } + + private makeTool(toolJson: unknown): Tool | undefined { + const tool = getToolFromJson(this.viewer, toolJson); + if (tool === undefined) return undefined; + this.initializeTool(tool); + return tool; + } + + private initializeTool(tool: Tool) { + tool.unbound.add(() => { + this.remove(tool); + }); + } + + restoreState(obj: unknown) { + const tools: Tool[] = []; + this.tools = tools; + parseArray(obj, (j) => { + const tool = this.makeTool(j); + if (tool === undefined) return; + tools.push(tool); + }); + this.changed.dispatch(); + } + + insert( + toolJson: unknown, + before: Tool | undefined = undefined, + ): Tool | undefined { + let insertIndex: number; + const { tools } = this; + if (before === undefined) { + insertIndex = tools.length; + } else { + insertIndex = tools.indexOf(before); + } + const tool = this.makeTool(toolJson); + if (tool === undefined) return undefined; + tools.splice(insertIndex, 0, tool); + this.changed.dispatch(); + return tool; + } + + move(source: Tool, before: Tool | undefined) { + const { tools } = this; + const sourceIndex = tools.indexOf(source); + if (sourceIndex === -1) return false; + let targetIndex: number; + if (before === undefined) { + targetIndex = tools.length; + } else { + targetIndex = tools.indexOf(before); + if (targetIndex === -1) return false; + } + if (targetIndex === sourceIndex) return true; + tools.splice(sourceIndex, 1); + if (targetIndex > sourceIndex) { + --targetIndex; + } + tools.splice(targetIndex, 0, source); + this.changed.dispatch(); + return true; + } + + remove(tool: Tool): boolean { + const { tools } = this; + const index = tools.indexOf(tool); + if (index === -1) return false; + tools.splice(index, 1); + tool.dispose(); + this.changed.dispatch(); + return true; + } + + toJSON() { + const { tools } = this; + if (tools.length === 0) return undefined; + return Array.from(tools, (tool) => { + return tool.localBinder.convertLocalJSONToPaletteJSON(tool.toJSON()); + }); + } + + addTools(newTools: Tool[]) { + for (const tool of newTools) { + this.initializeTool(tool); + } + this.tools.push(...newTools); + this.changed.dispatch(); + } + + disposed() { + super.disposed(); + for (const tool of this.tools) { + tool.dispose(); + } + } +} + +export class ToolPaletteState extends RefCounted implements Trackable { + location = new TrackableSidePanelLocation( + DEFAULT_TOOL_PALETTE_PANEL_LOCATION, + ); + + name = new TrackableValue("", verifyString); + + tools: TrackableToolList; + + query = new TrackableValue("", verifyString); + + parsedQuery = this.registerDisposer( + makeCachedLazyDerivedWatchableValue((query) => { + return parseToolQuery(query); + }, this.query), + ); + + queryDefined; + + private trackable = new CompoundTrackable(); + + get changed() { + return this.trackable.changed; + } + + constructor(public viewer: Viewer) { + super(); + this.tools = this.registerDisposer(new TrackableToolList(viewer)); + this.location.changed.add(this.changed.dispatch); + this.name.changed.add(this.changed.dispatch); + this.trackable.add("tools", this.tools); + this.trackable.add("query", this.query); + this.queryDefined = this.registerDisposer( + makeCachedDerivedWatchableValue( + (value) => value.length === 0, + [this.tools], + ), + ); + } + + restoreState(obj: unknown) { + this.location.restoreState(obj); + this.trackable.restoreState(obj); + if (this.query.value !== "") { + this.tools.reset(); + } + } + + reset() { + this.location.reset(); + this.trackable.reset(); + } + + toJSON() { + return { ...this.location.toJSON(), ...this.trackable.toJSON() }; + } +} + +class RenderedLayerGroup extends RefCounted { + element = document.createElement("div"); + header = document.createElement("div"); + content = document.createElement("div"); + firstTool: Tool | undefined; + constructor(public layer: UserLayer) { + super(); + const { element, header, content } = this; + element.classList.add("neuroglancer-tool-palette-layer-group"); + element.appendChild(header); + element.appendChild(content); + header.classList.add("neuroglancer-tool-palette-layer-group-header"); + content.classList.add("neuroglancer-tool-palette-layer-group-content"); + header.appendChild( + this.registerDisposer(new LayerVisibilityWidget(layer.managedLayer)) + .element, + ); + header.appendChild( + this.registerDisposer(new LayerNameWidget(layer.managedLayer)).element, + ); + } +} + +class QueryResults extends RefCounted { + changed = new NullarySignal(); + + private results: Tool[] = []; + private jsonToTool = new Map(); + + constructor(public state: ToolPaletteState) { + super(); + + this.registerDisposer(state.query.changed.add(this.debouncedUpdateResults)); + this.registerDisposer( + state.viewer.globalToolBinder.localBindersChanged.add( + this.debouncedUpdateResults, + ), + ); + + this.updateResults(); + } + + disposed() { + for (const tool of this.jsonToTool.values()) { + tool.dispose(); + } + super.dispose(); + } + + private debouncedUpdateResults = this.registerCancellable( + debounce(() => { + this.updateResults(); + }), + ); + + private getMatches(): Map | undefined { + let triggered = false; + const onChange = () => { + if (triggered) return; + triggered = true; + this.debouncedUpdateResults(); + }; + const parsedQuery = this.state.parsedQuery.value; + if (parsedQuery === undefined) return undefined; + if (!("query" in parsedQuery)) { + return undefined; + } + const matches = getMatchingTools( + this.state.viewer.globalToolBinder, + parsedQuery.query, + onChange, + ); + return matches; + } + + private updateResults() { + const matches = this.getMatches() ?? new Map(); + const { results, jsonToTool } = this; + const newResults: Tool[] = []; + for (const [key, toolJson] of matches) { + let tool = jsonToTool.get(key); + if (tool === undefined) { + tool = getToolFromJson(this.state.viewer, toolJson); + if (tool === undefined) { + continue; + } + jsonToTool.set(key, tool); + } + newResults.push(tool); + } + + for (const [key, tool] of jsonToTool) { + if (!matches.has(key)) { + tool.dispose(); + jsonToTool.delete(key); + } + } + if (!arraysEqual(results, newResults)) { + this.results = newResults; + this.changed.dispatch(); + } + } + + convertToExplicitPalette() { + this.debouncedUpdateResults.flush(); + this.state.query.value = ""; + this.state.tools.addTools(this.results); + this.results.length = 0; + this.jsonToTool.clear(); + } + + get value() { + return this.results; + } +} + +class RenderedTool extends RefCounted { + layerGroup: RenderedLayerGroup | undefined; + element = document.createElement("label")!; + private context: RefCounted | undefined = undefined; + + constructor( + public tool: Tool, + public palette: ToolPalettePanel, + ) { + super(); + const { element } = this; + element.classList.add("neuroglancer-tool-palette-tool-container"); + element.addEventListener("dblclick", () => { + this.tool.unbind(); + }); + element.append( + this.registerDisposer( + new ToolBindingWidget(tool.localBinder, tool.toJSON(), element, { + tool, + palette, + }), + ).element, + ); + this.updateView(); + this.updateTooltip(); + + this.registerDisposer(tool.changed.add(this.debouncedUpdateTooltip)); + this.registerDisposer( + palette.state.queryDefined.changed.add(this.debouncedUpdateTooltip), + ); + } + + private debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + + private debouncedUpdateTooltip = this.registerCancellable( + animationFrameDebounce(() => this.updateTooltip()), + ); + + private updateTooltip() { + let toolJson = this.tool.toJSON(); + if (typeof toolJson === "string") { + toolJson = { type: toolJson }; + } + let text = Object.entries(toolJson) + .map(([key, value]) => `${key}:${value}`) + .join(" "); + if (!this.palette.state.queryDefined.value) { + text += "\nDrag to move/copy, dblclick to remove"; + } else { + text += "\nDrag to copy to another palette"; + } + this.element.title = text; + } + + private updateView() { + let { context } = this; + const { element } = this; + if (context !== undefined) { + context.dispose(); + element.removeChild(element.lastElementChild as Element); + } + this.context = context = new RefCounted(); + const { tool } = this; + let toolElement = this.tool.renderInPalette(context); + if (toolElement === undefined) { + toolElement = document.createElement("div"); + toolElement.textContent = "Loading..."; + if (tool.localBinder instanceof LayerToolBinder) { + context.registerDisposer( + tool.localBinder.context.managedLayer.layerChanged.add( + this.debouncedUpdateView, + ), + ); + } + } + toolElement.classList.add("neuroglancer-tool-palette-tool-content"); + element.appendChild(toolElement); + } + + disposed() { + this.context?.dispose(); + this.layerGroup?.dispose(); + super.disposed(); + } +} + +export class ToolPalettePanel extends SidePanel { + private itemContainer = document.createElement("div"); + private dropZone = document.createElement("div"); + private renderedTools = new Map(); + private dragState: + | { dragSource: ToolDragSource; ephemeralTool: Tool } + | undefined = undefined; + private dragEnterCount = 0; + private queryResults: QueryResults; + + private clearDragState() { + const { dragState } = this; + if (dragState === undefined) return; + this.dragState = undefined; + this.state.tools.remove(dragState.ephemeralTool); + } + + get hasQuery() { + return this.state.query.value !== ""; + } + + private registerDropHandlers( + element: HTMLElement, + getTool: () => Tool | undefined, + ) { + const isDragSourceSupported = () => { + return ( + toolDragSource?.localBinder.globalBinder === + this.manager.state.viewer.globalToolBinder + ); + }; + + const update = (event: DragEvent, updateDropEffect: boolean) => { + if (!isDragSourceSupported()) { + return undefined; + } + if (this.hasQuery) { + this.clearDragState(); + const otherPalette = toolDragSource?.paletteState?.palette; + if ( + updateDropEffect && + otherPalette !== undefined && + otherPalette !== this + ) { + pushDragStatus( + event, + this.itemContainer, + "drop", + "Tools cannot be dropped into a query-defined palette. To allow dropping tools into this palette, first click the magnifying glass icon in the panel titlebar to convert it to a manually-defined palette.", + ); + } + updateToolDragDropEffect(toolDragSource!, "none", false); + return "none"; + } + if (this.dragState?.dragSource !== toolDragSource) { + this.clearDragState(); + } + let dropEffect: "copy" | "move"; + let message: string = ""; + if (updateDropEffect) { + const explicitPaletteSource = + toolDragSource!.paletteState?.palette.state.queryDefined.value === + false; + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ explicitPaletteSource ? "move" : "copy", + /*moveAllowed=*/ explicitPaletteSource, + ); + dropEffect = result.dropEffect; + setDropEffect(event, dropEffect); + message = `Drop to ${dropEffect} the tool`; + if (result.dropEffectMessage) { + message += ` (${result.dropEffectMessage})`; + } + } else { + dropEffect = getDropEffect() as "copy" | "move"; + } + + const tool = getTool(); + + const samePalette = toolDragSource!.paletteState?.palette === this; + + if (dropEffect === "copy" || !samePalette) { + const { dragState } = this; + if (dragState === undefined) { + const sourceToolJson = + toolDragSource!.localBinder.convertLocalJSONToPaletteJSON( + toolDragSource!.toolJson, + ); + const ephemeralTool = this.state.tools.insert(sourceToolJson, tool); + if (ephemeralTool === undefined) { + // Unexpected failure + console.error("Failed to create tool: ", toolDragSource!.toolJson); + return undefined; + } + this.dragState = { dragSource: toolDragSource!, ephemeralTool }; + } else { + this.state.tools.move(dragState.ephemeralTool, tool); + } + } else { + this.clearDragState(); + this.state.tools.move(toolDragSource!.paletteState!.tool, tool); + } + + if (updateDropEffect) { + const source = toolDragSource!; + const leaveHandler = () => { + updateToolDragDropEffect(source); + }; + pushDragStatus( + event, + this.itemContainer, + "drop", + message, + leaveHandler, + ); + updateToolDragDropEffect(source, dropEffect, samePalette); + } + return dropEffect; + }; + + const handleDragOver = (event: DragEvent) => { + const updateResult = update(event, /*updateDropEffect=*/ true); + if (updateResult === undefined) { + popDragStatus(event, this.itemContainer, "drop"); + return; + } + event.preventDefault(); + event.stopPropagation(); + }; + element.addEventListener("dragover", handleDragOver); + element.addEventListener("dragenter", (event: DragEvent) => { + ++this.dragEnterCount; + handleDragOver(event); + }); + element.addEventListener("dragleave", (event: DragEvent) => { + if (--this.dragEnterCount !== 0) return; + popDragStatus(event, this.itemContainer, "drop"); + this.clearDragState(); + event.stopPropagation(); + }); + element.addEventListener("drop", (event: DragEvent) => { + event.preventDefault(); + this.dragEnterCount = 0; + popDragStatus(event, this.itemContainer, "drop"); + const updateResult = update(event, /*updateDropEffect=*/ false); + if (updateResult === undefined) { + this.clearDragState(); + return; + } + event.stopPropagation(); + // The "ephemeral tool", if any, is no longer ephemeral. + this.dragState = undefined; + if (updateResult === "move") { + const { paletteState } = toolDragSource!; + if (paletteState !== undefined && paletteState.palette !== this) { + paletteState.palette.state.tools.remove(paletteState.tool); + } + } + }); + } + + constructor( + private manager: MultiToolPaletteManager, + sidePanelManager: SidePanelManager, + public state: ToolPaletteState, + ) { + super(sidePanelManager, state.location); + const { titleBar } = this.addTitleBar({}); + titleBar.appendChild( + this.registerDisposer(new PaletteNameWidget(state.name)).element, + ); + this.queryResults = this.registerDisposer(new QueryResults(state)); + const hasQuery = this.registerDisposer( + makeCachedDerivedWatchableValue((value) => value !== "", [state.query]), + ); + const self = this; + const searchButton = this.registerDisposer( + new CheckboxIcon( + { + changed: hasQuery.changed, + get value() { + return hasQuery.value; + }, + set value(newValue: boolean) { + if (newValue === false && hasQuery.value !== false) { + self.queryResults.convertToExplicitPalette(); + } + }, + }, + { + svg: svg_search, + disableTitle: "Convert query results to an explicit tool palette", + }, + ), + ); + titleBar.appendChild(searchButton.element); + this.registerDisposer( + new ElementVisibilityFromTrackableBoolean(hasQuery, searchButton.element), + ); + const deleteButton = makeDeleteButton({ title: "Delete tool palette" }); + deleteButton.addEventListener("click", () => { + state.dispose(); + }); + titleBar.appendChild(deleteButton); + + const body = document.createElement("div"); + body.classList.add("neuroglancer-tool-palette-body"); + const { itemContainer } = this; + itemContainer.classList.add("neuroglancer-tool-palette-items"); + body.appendChild( + this.registerDisposer( + new DependentViewWidget( + self.state.queryDefined, + (hasQuery: boolean, parent, context) => { + if (!hasQuery) return; + parent.appendChild( + context.registerDisposer(new ToolQueryWidget(state)).element, + ); + }, + ), + ).element, + ); + body.appendChild(itemContainer); + this.addBody(body); + + const { dropZone } = this; + dropZone.classList.add("neuroglancer-tool-palette-drop-zone"); + this.registerDropHandlers(dropZone, () => undefined); + const debouncedRender = this.registerCancellable( + animationFrameDebounce(() => this.render()), + ); + this.registerDisposer(this.state.tools.changed.add(debouncedRender)); + this.registerDisposer(this.queryResults.changed.add(debouncedRender)); + this.visibility.changed.add(debouncedRender); + this.render(); + } + + private getRenderedTool(tool: Tool) { + const { renderedTools } = this; + let renderedTool = renderedTools.get(tool); + if (renderedTool === undefined) { + renderedTool = new RenderedTool(tool, this); + this.registerDropHandlers(renderedTool.element, () => tool); + renderedTools.set(tool, renderedTool); + } + return renderedTool; + } + + override getDragDropDescription() { + return "tool palette"; + } + + override canCopy() { + return true; + } + + override copyToNewLocation(location: SidePanelLocation) { + const newPalette = this.manager.state.addNew({ + location: { ...this.state.location.value, ...location }, + name: this.state.name.value, + }); + newPalette.tools.restoreState(this.state.tools.toJSON() ?? []); + newPalette.query.value = this.state.query.value; + } + + render() { + const self = this; + function* getItems() { + const tools = self.state.queryDefined.value + ? self.queryResults.value + : self.state.tools.tools; + const { renderedTools } = self; + const seenTools = new Set(tools); + const numTools = tools.length; + const seenLayerGroups = new Set(); + for (let toolIndex = 0; toolIndex < numTools; ) { + let tool = tools[toolIndex]; + const { localBinder } = tool; + if (localBinder instanceof LayerToolBinder) { + const layer: UserLayer = localBinder.context; + + let renderedTool = self.getRenderedTool(tool); + + let { layerGroup } = renderedTool; + if (seenLayerGroups.has(layerGroup) || layerGroup === undefined) { + layerGroup = new RenderedLayerGroup(layer); + self.registerDropHandlers( + layerGroup.header, + () => layerGroup!.firstTool, + ); + layerGroup.firstTool = tool; + } else { + layerGroup.addRef(); + } + seenLayerGroups.add(layerGroup); + + // Fill layer group. + function* getGroupItems() { + while (true) { + renderedTool.layerGroup?.dispose(); + renderedTool.layerGroup = layerGroup!.addRef(); + yield renderedTool.element; + if ( + ++toolIndex === numTools || + (tool = tools[toolIndex]).localBinder !== localBinder + ) { + break; + } + renderedTool = self.getRenderedTool(tool); + } + } + updateChildren(layerGroup.content, getGroupItems()); + yield layerGroup.element; + layerGroup.dispose(); + } else { + const renderedTool = self.getRenderedTool(tool); + yield renderedTool.element; + ++toolIndex; + } + } + for (const [tool, renderedTool] of renderedTools) { + if (!seenTools.has(tool)) { + renderedTool.dispose(); + renderedTools.delete(tool); + } + } + + yield self.dropZone; + } + updateChildren(this.itemContainer, getItems()); + } + + disposed() {} +} + +class ToolQueryWidget extends RefCounted { + element = document.createElement("div"); + errorsElement = document.createElement("ul"); + constructor(public state: ToolPaletteState) { + super(); + + const textInput = this.registerDisposer( + new AutocompleteTextInput({ + completer: this.completeQuery.bind(this), + }), + ); + textInput.placeholder = "Enter tool query or drag in tools"; + textInput.element.classList.add("neuroglancer-tool-palette-query"); + textInput.value = state.query.value ?? ""; + + this.registerDisposer( + state.parsedQuery.changed.add( + this.registerCancellable(debounce(() => this.updateErrors(), 200)), + ), + ); + this.updateErrors(); + textInput.onCommit.add(() => { + state.query.value = textInput.value; + }); + state.query.changed.add(() => { + textInput.value = state.query.value ?? ""; + }); + const { element, errorsElement } = this; + element.appendChild(textInput.element); + element.appendChild(errorsElement); + errorsElement.classList.add("neuroglancer-tool-palette-query-errors"); + } + + private updateErrors() { + const { errorsElement } = this; + removeChildren(errorsElement); + const query = this.state.parsedQuery.value; + if (query === undefined || !("errors" in query)) return; + for (const error of query.errors) { + const element = document.createElement("li"); + element.textContent = error.message; + errorsElement.appendChild(element); + } + } + + private async completeQuery({ + value, + }: { + value: string; + }): Promise { + const parsed = parsePartialToolQuery(value); + const info = getQueryTermToComplete(parsed); + + const matches = getMatchingTools( + this.state.viewer.globalToolBinder, + info.completionQuery, + ); + + let completions: [string, number][]; + if (info.property === undefined) { + completions = getPropertyNameCompletions( + info.completionQuery, + matches, + info.prefix, + ); + } else { + completions = getPropertyValueCompletions(matches, info.property); + } + const completionEntries: CompletionWithDescription[] = []; + if (info.property === undefined && info.prefix === "") { + if ( + parsed.query.clauses.length > 0 && + parsed.query.clauses[parsed.query.clauses.length - 1].terms.length !== 0 + ) { + completionEntries.push({ + value: "+", + description: "New inclusion clause", + }); + completionEntries.push({ + value: "-", + description: "New exclusion clause", + }); + } + } + + for (const [value, count] of completions) { + completionEntries.push({ + value, + description: `${count} tool${count > 0 ? "s" : ""}`, + }); + } + return { + offset: info.offset, + completions: completionEntries, + makeElement: makeCompletionElementWithDescription, + }; + } +} + +export class MultiToolPaletteState implements Trackable { + changed = new NullarySignal(); + changedShallow = new NullarySignal(); + visibleStateChanged = new NullarySignal(); + palettes = new Set(); + + constructor(public viewer: Viewer) {} + + add(palette: Owned) { + this.palettes.add(palette); + palette.registerDisposer(palette.changed.add(this.changed.dispatch)); + palette.registerDisposer( + palette.location.watchableVisible.changed.add( + this.visibleStateChanged.dispatch, + ), + ); + palette.registerDisposer( + palette.name.changed.add(() => this.checkTitles(palette)), + ); + palette.registerDisposer(() => { + this.palettes.delete(palette); + this.changedShallow.dispatch(); + this.visibleStateChanged.dispatch(); + this.changed.dispatch(); + }); + this.changedShallow.dispatch(); + this.changed.dispatch(); + } + + toJSON() { + const { palettes } = this; + if (palettes.size === 0) { + return undefined; + } + const json: any = {}; + for (const palette of palettes) { + json[palette.name.value] = getCachedJson(palette).value; + } + return json; + } + + reset() { + const { palettes } = this; + if (palettes.size !== 0) { + for (const palette of palettes) { + palette.dispose(); + } + } + } + + restoreState(obj: unknown) { + if (obj === undefined) { + return; + } + verifyObject(obj); + const { viewer } = this; + const names = new Map(); + for (const palette of this.palettes) { + names.set(palette.name.value, palette); + } + for (const [name, json] of Object.entries(obj as object)) { + const existing = names.get(name); + if (existing !== undefined) { + existing.restoreState(json); + continue; + } + const palette = new ToolPaletteState(viewer); + palette.name.value = name; + palette.restoreState(json); + names.set(name, palette); + this.add(palette); + } + } + + addNew( + options: { location?: Partial; name?: string } = {}, + ) { + const palette = new ToolPaletteState(this.viewer); + const { location, name = "Palette" } = options; + palette.name.value = name; + this.checkTitles(palette); + palette.location.value = { + ...DEFAULT_TOOL_PALETTE_PANEL_LOCATION, + ...(location ?? {}), + }; + palette.location.locationChanged.dispatch(); + this.add(palette); + return palette; + } + + // Ensures all palette titles are unique. + private checkingTitles = false; + private checkTitles(changedPalette: ToolPaletteState) { + if (this.checkingTitles) return; + try { + this.checkingTitles = true; + const titles = new Set(); + for (const palette of this.palettes) { + if (palette === changedPalette) continue; + titles.add(palette.name.value); + } + const title = changedPalette.name.value; + if (!titles.has(title)) return; + let suffix = 0; + while (true) { + const modifiedTitle = title + ++suffix; + if (!titles.has(modifiedTitle)) { + changedPalette.name.value = modifiedTitle; + return; + } + } + } finally { + this.checkingTitles = false; + } + } +} + +export class MultiToolPaletteManager extends RefCounted { + private panels = new Map(); + constructor( + private sidePanelManager: SidePanelManager, + public state: MultiToolPaletteState, + ) { + super(); + const debouncedUpdatePanels = this.registerCancellable( + animationFrameDebounce(() => this.updatePanels()), + ); + this.registerDisposer(this.state.changedShallow.add(debouncedUpdatePanels)); + this.updatePanels(); + } + + private updatePanels() { + const { panels } = this; + const { palettes } = this.state; + for (const [palette, panel] of panels) { + if (!palettes.has(palette)) { + this.sidePanelManager.unregisterPanel(panel); + panels.delete(palette); + } + } + + for (const palette of palettes) { + if (!panels.has(palette)) { + const panel = { + location: palette.location, + makePanel: () => + new ToolPalettePanel(this, this.sidePanelManager, palette), + }; + panels.set(palette, panel); + this.sidePanelManager.registerPanel(panel); + } + } + } + + disposed() { + super.disposed(); + for (const panel of this.panels.values()) { + this.sidePanelManager.unregisterPanel(panel); + } + } +} + +export class PaletteNameWidget extends TextInputWidget { + constructor(public name: TrackableValue) { + super(name); + const { element } = this; + element.classList.add("neuroglancer-tool-palette-name"); + element.title = "Rename tool palette"; + } +} + +export class PaletteListDropdownItem extends RefCounted { + element = document.createElement("li"); + constructor(public state: ToolPaletteState) { + super(); + const { element } = this; + element.appendChild( + this.registerDisposer( + new TrackableBooleanCheckbox(state.location.watchableVisible, { + enableTitle: "Show tool palette", + disableTitle: "Hide tool palette", + }), + ).element, + ); + element.appendChild( + this.registerDisposer(new PaletteNameWidget(state.name)).element, + ); + const deleteButton = makeDeleteButton({ title: "Delete tool palette" }); + deleteButton.addEventListener("click", () => { + state.dispose(); + }); + element.appendChild(deleteButton); + } +} + +interface CannedPalette { + name: string; + description?: string; + query: string; +} + +class PaletteListCannedDropdownItem { + element = document.createElement("li"); + constructor( + public state: MultiToolPaletteState, + public palette: CannedPalette, + ) { + const { element } = this; + element.classList.add("neuroglancer-tool-palette-dropdown-canned-item"); + element.textContent = palette.description ?? palette.name; + element.addEventListener("click", () => { + const newPalette = state.addNew({ name: palette.name }); + newPalette.query.value = palette.query; + }); + } +} + +export const CANNED_PALETTES: CannedPalette[] = [ + { name: "Palette", description: "New empty palette", query: "" }, + { name: "All controls", query: "+" }, + { name: "Shader controls", query: "type:shaderControl" }, +]; + +export class MultiToolPaletteDropdown extends RefCounted { + element = document.createElement("div"); + itemContainer = document.createElement("ul"); + items = new Map(); + cannedItems = new Map(); + cannedItemSeparator = document.createElement("li"); + constructor(private state: MultiToolPaletteState) { + super(); + const { element, itemContainer, cannedItemSeparator } = this; + element.classList.add("neuroglancer-tool-palette-dropdown"); + + cannedItemSeparator.classList.add( + "neuroglancer-tool-palette-dropdown-separator", + ); + + element.appendChild(itemContainer); + const debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + this.registerDisposer(this.state.changedShallow.add(debouncedUpdateView)); + this.updateView(); + } + + private updateView() { + const self = this; + function* getItems() { + const { palettes } = self.state; + const seenQueries = new Set(); + const { items } = self; + for (const palette of palettes) { + let item = items.get(palette); + if (item === undefined) { + item = new PaletteListDropdownItem(palette); + items.set(palette, item); + } + seenQueries.add(palette.query.value); + yield item.element; + } + let firstCannedItem = true; + const { cannedItems } = self; + for (const palette of CANNED_PALETTES) { + if (palette.query !== "" && seenQueries.has(palette.query)) { + continue; + } + let item = cannedItems.get(palette); + if (item === undefined) { + item = new PaletteListCannedDropdownItem(self.state, palette); + cannedItems.set(palette, item); + } + if (firstCannedItem) { + firstCannedItem = false; + if (palettes.size !== 0) { + yield self.cannedItemSeparator; + } + } + yield item.element; + } + for (const [palette, item] of items) { + if (!palettes.has(palette)) { + items.delete(palette); + item.dispose(); + } + } + } + updateChildren(this.itemContainer, getItems()); + } + + disposed() { + super.disposed(); + removeFromParent(this.element); + } +} + +export class MultiToolPaletteDropdownButton extends RefCounted { + countElement = document.createElement("div"); + dropdownVisible = new WatchableValue(false); + dropdown: MultiToolPaletteDropdown | undefined; + element = document.createElement("div"); + constructor(private state: MultiToolPaletteState) { + super(); + const { element, countElement } = this; + + const checkbox = this.registerDisposer( + new CheckboxIcon(this.dropdownVisible, { + svg: svg_tool, + enableTitle: "Show tool palette list (control+click to create new)", + disableTitle: "Hide tool palette list", + backgroundScheme: "dark", + }), + ).element; + element.appendChild(checkbox); + element.classList.add("neuroglancer-tool-palette-button"); + element.classList.add("neuroglancer-sticky-focus"); + element.tabIndex = -1; + + const debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + this.registerDisposer(state.changedShallow.add(debouncedUpdateView)); + this.registerDisposer(state.visibleStateChanged.add(debouncedUpdateView)); + + element.addEventListener("focusout", (event) => { + const { relatedTarget } = event; + if (relatedTarget instanceof Node && !element.contains(relatedTarget)) { + this.dropdownVisible.value = false; + } + }); + checkbox.insertAdjacentElement("afterbegin", countElement); + this.dropdownVisible.changed.add(() => { + const visible = this.dropdownVisible.value; + if (!visible) { + this.dropdown?.dispose(); + this.dropdown = undefined; + } else { + if (this.dropdown === undefined) { + this.dropdown = new MultiToolPaletteDropdown(this.state); + this.element.appendChild(this.dropdown.element); + positionRelativeDropdown(this.dropdown.element, this.element); + } + } + }); + this.updateView(); + } + + private updateView() { + const totalPalettes = this.state.palettes.size; + let visiblePalettes = 0; + for (const palette of this.state.palettes) { + if (palette.location.visible) ++visiblePalettes; + } + this.countElement.textContent = + visiblePalettes < totalPalettes + ? `${visiblePalettes}/${totalPalettes}` + : ""; + } + + disposed() { + this.dropdown?.dispose(); + } +} diff --git a/src/ui/tool_query.spec.ts b/src/ui/tool_query.spec.ts new file mode 100644 index 0000000000..3960bfca62 --- /dev/null +++ b/src/ui/tool_query.spec.ts @@ -0,0 +1,322 @@ +import { describe, test, expect } from "vitest"; +import { + getCompletionOffset, + getQueryTermToComplete, + parsePartialToolQuery, + parseToolQuery, +} from "#src/ui/tool_query.js"; + +describe("parseQuery", () => { + test("simple term", () => { + expect(parseToolQuery("type:shaderControl")).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 18, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 0, + "end": 18, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("multiple terms", () => { + expect(parseToolQuery("+type:shaderControl layer:image")) + .toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 31, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 1, + "end": 19, + }, + }, + { + "predicate": { + "equals": "image", + }, + "property": "layer", + "range": { + "begin": 20, + "end": 31, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("multiple clauses", () => { + expect(parseToolQuery("+type:shaderControl -layer:image")) + .toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 19, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 1, + "end": 19, + }, + }, + ], + }, + { + "include": false, + "range": { + "begin": 20, + "end": 32, + }, + "terms": [ + { + "predicate": { + "equals": "image", + }, + "property": "layer", + "range": { + "begin": 21, + "end": 32, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("quoted value", () => { + expect(parseToolQuery(`type:"shaderControl"`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 20, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 0, + "end": 20, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("regexp value", () => { + expect(parseToolQuery(`type:/shaderControl/`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 20, + }, + "terms": [ + { + "predicate": { + "regexp": /shaderControl/i, + }, + "property": "type", + "range": { + "begin": 0, + "end": 20, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("invalid term", () => { + expect(parseToolQuery(`a`)).toMatchInlineSnapshot(` + { + "errors": [ + { + "message": "Invalid clause/term", + "range": { + "begin": 0, + "end": 1, + }, + }, + ], + } + `); + }); + + test("empty clause", () => { + expect(parseToolQuery(`+`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 1, + }, + "terms": [], + }, + ], + }, + } + `); + }); + + test("duplicate property", () => { + expect(parseToolQuery("type:shaderControl type:shaderControl")) + .toMatchInlineSnapshot(` + { + "errors": [ + { + "message": "Property "type" cannot be constrained by more than one term in a clause", + "range": { + "begin": 19, + "end": 23, + }, + }, + ], + } + `); + }); +}); + +describe("getCompletionOffset", () => { + test("property value", () => { + expect( + getCompletionOffset(parsePartialToolQuery("layerType:im")), + ).toMatchInlineSnapshot(`0`); + }); +}); + +describe("getQueryTermToComplete", () => { + test("property value", () => { + expect(getQueryTermToComplete(parsePartialToolQuery("layerType:im"))) + .toMatchInlineSnapshot(` + { + "completionQuery": { + "clauses": [ + { + "include": true, + "range": { + "begin": -1, + "end": -1, + }, + "terms": [ + { + "predicate": { + "regexp": /\\^im/, + }, + "property": "layerType", + "range": { + "begin": -1, + "end": -1, + }, + }, + ], + }, + ], + }, + "include": true, + "offset": 10, + "prefix": "im", + "property": "layerType", + } + `); + }); + + test("property name after existing term", () => { + expect(getQueryTermToComplete(parsePartialToolQuery("layerType:image j"))) + .toMatchInlineSnapshot(` + { + "completionQuery": { + "clauses": [ + { + "include": true, + "range": { + "begin": -1, + "end": -1, + }, + "terms": [ + { + "predicate": { + "equals": "image", + }, + "property": "layerType", + "range": { + "begin": 0, + "end": 15, + }, + }, + ], + }, + ], + }, + "include": true, + "offset": 16, + "prefix": "j", + "property": undefined, + } + `); + }); +}); diff --git a/src/ui/tool_query.ts b/src/ui/tool_query.ts new file mode 100644 index 0000000000..6443895124 --- /dev/null +++ b/src/ui/tool_query.ts @@ -0,0 +1,353 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { escapeRegExp } from "lodash-es"; +import { defaultStringCompare } from "#src/util/string.js"; + +export type PropertyPredicate = { equals: string } | { regexp: RegExp }; + +export interface QueryRange { + begin: number; + end: number; +} + +export interface QueryTerm { + // Start offset in query string; + range: QueryRange; + property: string; + predicate: PropertyPredicate; +} + +// A clause specifies a conjunction (AND) of terms. All tools matching the +// clause are either included or excluded from the overall results. +export interface QueryClause { + // Indicates if this clause is an inclusion or an exclusion. + include: boolean; + range: QueryRange; + terms: QueryTerm[]; +} + +// A query specifies an ordered list of inclusion/exclusion clauses. +export interface Query { + clauses: QueryClause[]; +} + +export interface ParseError { + range: QueryRange; + message: string; +} + +const TOKEN_PATTERN = + /^(\s*)(?:(\+|-)|([a-zA-Z]+):(?:("(?:[^"\\]|\\.)*")|([^\s"/][^\s"]*)|\/((?:[^/\\]|\\.)*)\/)(?=$|\s))/; + +export interface PartialQuery { + raw: string; + query: Query; + errors: ParseError[]; + endOffset: number; +} + +export function parsePartialToolQuery(query: string): PartialQuery { + let offset = 0; + const raw = query; + + const parsedQuery: Query = { clauses: [] }; + let currentClause: QueryClause | undefined; + + const errors: ParseError[] = []; + + const endClause = () => { + if (currentClause === undefined) return; + if (currentClause.terms.length === 0) { + if (currentClause.include === false) { + errors.push({ + range: { begin: currentClause.range.begin, end: offset }, + message: "Exclusion clause must have at least one term", + }); + } + currentClause.range.end = offset; + parsedQuery.clauses.push(currentClause); + } else { + currentClause.range.end = + currentClause.terms[currentClause.terms.length - 1].range.end; + parsedQuery.clauses.push(currentClause); + } + }; + + for (let nextOffset: number; true; offset = nextOffset) { + // Parse include/exclude token. + const tokenMatch = query.match(TOKEN_PATTERN); + + if (tokenMatch === null) { + break; + } + + const matchLength = tokenMatch[0].length; + nextOffset = offset + matchLength; + query = query.substring(matchLength); + + const skipLength = tokenMatch[1].length; + + const includeExclude = tokenMatch[2]; + if (includeExclude !== undefined) { + // New clause + endClause(); + currentClause = { + range: { begin: offset + skipLength, end: -1 }, + include: includeExclude === "+", + terms: [], + }; + continue; + } + + const propertyName = tokenMatch[3]; + if (currentClause === undefined) { + currentClause = { + range: { begin: offset + skipLength, end: -1 }, + include: true, + terms: [], + }; + } else { + // Check that property is not already present in this clause. + if ( + currentClause.terms.find((term) => term.property === propertyName) !== + undefined + ) { + errors.push({ + range: { + begin: offset + skipLength, + end: offset + skipLength + propertyName.length, + }, + message: `Property ${JSON.stringify(propertyName)} cannot be constrained by more than one term in a clause`, + }); + } + } + + let predicate: PropertyPredicate; + + const quoted = tokenMatch[4]; + if (quoted !== undefined) { + predicate = { equals: JSON.parse(quoted) }; + } else { + const unquoted = tokenMatch[5]; + if (unquoted !== undefined) { + predicate = { equals: unquoted }; + } else { + try { + const regexp = new RegExp(tokenMatch[6], "i"); + predicate = { regexp }; + } catch (e) { + errors.push({ + range: { + begin: offset + skipLength + propertyName.length + 2, + end: nextOffset - 1, + }, + message: (e as SyntaxError).message, + }); + predicate = { equals: "" }; + } + } + } + + currentClause.terms.push({ + range: { begin: offset + skipLength, end: nextOffset }, + property: propertyName, + predicate, + }); + continue; + } + + endClause(); + + // Skip whitespace before ending parsing. + { + const m = query.match(/^\s*/); + if (m !== null) { + offset += m[0].length; + } + } + + return { raw, query: parsedQuery, errors, endOffset: offset }; +} + +export function parseToolQuery( + query: string, +): { query: Query } | { errors: ParseError[] } { + const result = parsePartialToolQuery(query); + if (result.endOffset !== query.length) { + result.errors.push({ + range: { begin: result.endOffset, end: query.length }, + message: "Invalid clause/term", + }); + } + if (result.errors.length > 0) { + return { errors: result.errors }; + } + return { query: result.query }; +} + +export function matchPredicate(predicate: PropertyPredicate, value: string) { + if ("equals" in predicate) { + return predicate.equals === value; + } else { + return value.match(predicate.regexp) !== null; + } +} + +export function matchesTerms(toolJson: any, terms: QueryTerm[]) { + for (const term of terms) { + const value = toolJson[term.property]; + if (typeof value !== "string") return false; + if (!matchPredicate(term.predicate, value)) return false; + } + return true; +} + +export interface QueryCompletion { + offset: number; + prefix: string; + property?: string; + include: boolean; + completionQuery: Query; +} + +export function getCompletionOffset(query: PartialQuery): number { + const { clauses } = query.query; + if (query.endOffset === query.raw.length && clauses.length !== 0) { + const { range, terms } = clauses[clauses.length - 1]; + if (range.end === query.endOffset && terms.length !== 0) { + const lastTerm = terms[terms.length - 1]; + // Remove last term since it will be completed. + terms.length = terms.length - 1; + return lastTerm.range.begin; + } + } + + return query.endOffset; +} + +const PARTIAL_TERM_PATTERN = /^([a-zA-Z]+):/; + +export function getQueryTermToComplete(query: PartialQuery): QueryCompletion { + const termOffset = getCompletionOffset(query); + let prefix = query.raw.substring(termOffset); + let property: string | undefined; + const m = prefix.match(PARTIAL_TERM_PATTERN); + + const include = + query.query.clauses.length == 0 || + query.query.clauses[query.query.clauses.length - 1].include; + let offset: number; + if (m === null) { + offset = termOffset; + } else { + offset = termOffset + m[1].length + 1; + property = m[1]; + prefix = prefix.substring(m[1].length + 1); + } + + const completionQuery: Query = { clauses: [] }; + + const { clauses } = query.query; + const currentTerms: QueryTerm[] = []; + if (clauses.length !== 0) { + currentTerms.push(...clauses[clauses.length - 1].terms); + } + if (property !== undefined) { + currentTerms.push({ + property, + predicate: { regexp: new RegExp("^" + escapeRegExp(prefix)) }, + range: { begin: -1, end: -1 }, + }); + } + + if (include) { + completionQuery.clauses.push({ + include: true, + terms: currentTerms, + range: { begin: -1, end: -1 }, + }); + + // All other clauses are inverted + for (let i = 0, numClauses = clauses.length - 1; i < numClauses; ++i) { + const clause = clauses[i]; + completionQuery.clauses.push({ + include: !clause.include, + terms: clause.terms, + range: clause.range, + }); + } + } else { + for (let i = 0, numClauses = clauses.length - 1; i < numClauses; ++i) { + const clause = clauses[i]; + let terms = clause.terms; + if (clause.include) { + terms = [...terms, ...currentTerms]; + } + completionQuery.clauses.push({ + include: clause.include, + terms, + range: clause.range, + }); + } + } + return { offset, prefix, property, include, completionQuery }; +} + +function getSortedCompletions(values: Map) { + const result = Array.from(values); + result.sort((a, b) => defaultStringCompare(a[0], b[0])); + return result; +} + +export function getPropertyNameCompletions( + completionQuery: Query, + matches: Map, + prefix: string, +) { + const existingPropertyNames = new Set( + Array.from(completionQuery.clauses[0].terms, (term) => term.property), + ); + const properties = new Map(); + for (const match of matches.values()) { + for (const property in match) { + if (!property.startsWith(prefix) || existingPropertyNames.has(property)) { + continue; + } + const value = property + ":"; + const existing = properties.get(value) ?? 0; + properties.set(value, existing + 1); + } + } + return getSortedCompletions(properties); +} + +export function getPropertyValueCompletions( + matches: Map, + property: string, +) { + const values = new Map(); + for (const match of matches.values()) { + const value = "" + match[property]; + const existing = values.get(value) ?? 0; + values.set(value, existing + 1); + } + return getSortedCompletions(values); +} + +export const INCLUDE_EVERYTHING_QUERY: Query = { + clauses: [{ include: true, terms: [], range: { begin: -1, end: -1 } }], +}; diff --git a/src/util/dom.ts b/src/util/dom.ts index 6a522923cd..b318034594 100644 --- a/src/util/dom.ts +++ b/src/util/dom.ts @@ -73,7 +73,7 @@ export function isInputTextTarget(target: EventTarget | null) { ) { return true; } - return false; + return target.closest(".neuroglancer-sticky-focus") !== null; } export function measureElementClone(element: HTMLElement) { diff --git a/src/util/drag_and_drop.ts b/src/util/drag_and_drop.ts index 5006c6fd4e..edf78c82cf 100644 --- a/src/util/drag_and_drop.ts +++ b/src/util/drag_and_drop.ts @@ -109,3 +109,39 @@ export function preventDrag(element: HTMLElement) { event.preventDefault(); }); } + +export function getDropEffectFromModifiers( + event: DragEvent, + defaultDropEffect: DropEffect, + moveAllowed: boolean, +): { dropEffect: DropEffect | "move" | "copy"; dropEffectMessage: string } { + let dropEffect: DropEffect | "move" | "copy"; + if (event.shiftKey) { + dropEffect = "copy"; + } else if (event.ctrlKey && moveAllowed) { + dropEffect = "move"; + } else { + dropEffect = defaultDropEffect; + } + let message = ""; + const addMessage = (msg: string) => { + if (message !== "") { + message += ", "; + } + message += msg; + }; + if (defaultDropEffect !== "none" && dropEffect !== defaultDropEffect) { + if (event.shiftKey) { + addMessage(`release SHIFT to ${defaultDropEffect}`); + } else { + addMessage(`release CONTROL to ${defaultDropEffect}`); + } + } + if (dropEffect !== "copy") { + addMessage("hold SHIFT to copy"); + } + if (dropEffect !== "move" && moveAllowed && defaultDropEffect !== "move") { + addMessage("hold CONTROL to move"); + } + return { dropEffect, dropEffectMessage: message }; +} diff --git a/src/util/dropdown.ts b/src/util/dropdown.ts index c79ca8a473..662b5312bb 100644 --- a/src/util/dropdown.ts +++ b/src/util/dropdown.ts @@ -62,6 +62,7 @@ export function positionDropdown( const distanceToBottom = viewportHeight - rect.bottom - bottomMargin; dropdownElement.style.left = `${rect.left}px`; dropdownElement.style.width = `${rect.width}px`; + dropdownElement.style.maxWidth = `${rect.width}px`; if (distanceToTop > distanceToBottom * 3) { dropdownElement.style.top = ""; dropdownElement.style.bottom = `${viewportHeight - rect.top}px`; @@ -77,3 +78,35 @@ export function positionDropdown( } } } + +export function positionRelativeDropdown( + dropdown: HTMLElement, + parent: HTMLElement, +) { + const rect = parent.getBoundingClientRect(); + const topMargin = 6; + const bottomMargin = 6; + + const { clientHeight: viewportWidth, clientWidth: viewportHeight } = + dropdown.ownerDocument!.documentElement!; + const distanceToTop = rect.top - topMargin; + const distanceToBottom = viewportHeight - rect.bottom - bottomMargin; + + if (rect.left < viewportWidth - rect.right) { + dropdown.style.left = "0px"; + dropdown.style.right = ""; + } else { + dropdown.style.right = "0px"; + dropdown.style.left = ""; + } + dropdown.style.maxWidth = `${rect.width}px`; + if (distanceToTop > distanceToBottom * 3) { + dropdown.style.top = ""; + dropdown.style.bottom = `${viewportHeight - rect.top}px`; + dropdown.style.maxHeight = distanceToTop + "px"; + } else { + dropdown.style.top = `${rect.bottom}px`; + dropdown.style.bottom = ""; + dropdown.style.maxHeight = distanceToBottom + "px"; + } +} diff --git a/src/util/signal.ts b/src/util/signal.ts index 52ca03c34b..4a7031e013 100644 --- a/src/util/signal.ts +++ b/src/util/signal.ts @@ -61,6 +61,15 @@ export class Signal void> { }; } + addOnce(handler: Callable): void { + const { handlers } = this; + function onceWrapper(...args: any) { + handlers.delete(onceWrapper as any); + handler(...args); + } + handlers.add(onceWrapper as any); + } + /** * Remove a handler function. If `dispatch` is currently be called and the new handler has not * yet been called, then it will not be called. @@ -117,6 +126,7 @@ export class NullarySignal extends Signal<() => void> {} export interface ReadonlySignal { readonly count: number; add(handler: Callable): () => void; + addOnce(handler: Callable): void; remove(handler: Callable): boolean; } @@ -127,6 +137,7 @@ export const neverSignal: NullaryReadonlySignal = { add(_handler: any) { return () => {}; }, + addOnce(_handler: any) {}, remove(_handler: any) { return false; }, diff --git a/src/viewer.ts b/src/viewer.ts index 73a72f171a..3a6ebf1f8d 100644 --- a/src/viewer.ts +++ b/src/viewer.ts @@ -94,6 +94,11 @@ import { SidePanelManager } from "#src/ui/side_panel.js"; import { StateEditorDialog } from "#src/ui/state_editor.js"; import { StatisticsDisplayState, StatisticsPanel } from "#src/ui/statistics.js"; import { GlobalToolBinder, LocalToolBinder } from "#src/ui/tool.js"; +import { + MultiToolPaletteDropdownButton, + MultiToolPaletteManager, + MultiToolPaletteState, +} from "#src/ui/tool_palette.js"; import { ViewerSettingsPanel, ViewerSettingsPanelState, @@ -212,6 +217,7 @@ export const VIEWER_TOP_ROW_CONFIG_OPTIONS = [ "showHelpButton", "showSettingsButton", "showEditStateButton", + "showToolPaletteButton", "showLayerListPanelButton", "showSelectionPanelButton", "showLayerSidePanelButton", @@ -328,6 +334,7 @@ class TrackableViewerState extends CompoundTrackable { this.add("partialViewport", viewer.partialViewport); this.add("selectedStateServer", viewer.selectedStateServer); this.add("toolBindings", viewer.toolBinder); + this.add("toolPalettes", viewer.toolPalettes); } restoreState(obj: any) { @@ -768,6 +775,20 @@ export class Viewer extends RefCounted implements ViewerState { topRow.appendChild(stateShare.element); } + { + const button = this.registerDisposer( + new MultiToolPaletteDropdownButton(this.toolPalettes), + ).element; + + this.registerDisposer( + new ElementVisibilityFromTrackableBoolean( + this.uiControlVisibility.showToolPaletteButton, + button, + ), + ); + topRow.appendChild(button); + } + { const { layerListPanelState } = this; const button = this.registerDisposer( @@ -988,6 +1009,10 @@ export class Viewer extends RefCounted implements ViewerState { }), ); + this.registerDisposer( + new MultiToolPaletteManager(this.sidePanelManager, this.toolPalettes), + ); + const updateVisibility = () => { const shouldBeVisible = this.visibility.visible; if (shouldBeVisible !== this.visible) { @@ -1119,8 +1144,10 @@ export class Viewer extends RefCounted implements ViewerState { ); }; - private globalToolBinder = this.registerDisposer( - new GlobalToolBinder(this.toolInputEventMapBinder), + public toolPalettes = new MultiToolPaletteState(this); + + public globalToolBinder = this.registerDisposer( + new GlobalToolBinder(this.toolInputEventMapBinder, this.toolPalettes), ); public toolBinder = this.registerDisposer( diff --git a/src/widget/layer_control.ts b/src/widget/layer_control.ts index d1c14a06f5..7497ee3006 100644 --- a/src/widget/layer_control.ts +++ b/src/widget/layer_control.ts @@ -100,6 +100,13 @@ function makeControl( visibility, }); controlElement.classList.add("neuroglancer-layer-control-control"); + + // Disable drag and drop on the control itself to avoid interference. + controlElement.draggable = true; + controlElement.addEventListener("dragstart", (event) => { + event.stopPropagation(); + event.preventDefault(); + }); controlContainer.appendChild(controlElement); return { controlContainer, @@ -119,7 +126,13 @@ export class LayerControlTool< ) { super(layer); } + + isLoading() { + return false; + } + activate(activation: ToolActivation) { + if (this.isLoading()) return; const { options } = this; const { layer } = this; const { isValid } = options; @@ -136,6 +149,19 @@ export class LayerControlTool< body.appendChild(controlContainer); options.activateTool(activation, control); } + renderInPalette(context: RefCounted) { + if (this.isLoading()) return undefined; + const { controlContainer } = makeControl( + context, + this.layer, + this.options, + new WatchableVisibilityPriority(WatchableVisibilityPriority.VISIBLE), + ); + controlContainer.classList.add( + "neuroglancer-layer-options-control-container", + ); + return controlContainer; + } get description() { const { options } = this; return options.toolDescription ?? options.label; @@ -162,7 +188,11 @@ function makeLayerControlToOptionsTab( ); label.prepend( context.registerDisposer( - new ToolBindingWidget(layer.toolBinder, options.toolJson), + new ToolBindingWidget( + layer.toolBinder, + options.toolJson, + controlContainer, + ), ).element, ); return controlContainer; @@ -202,5 +232,15 @@ export function registerLayerControl( layerType, toolId, (layer) => new LayerControlTool(layer, options), + (layer, onChange) => { + const isValid = options.isValid?.(layer); + if (isValid !== undefined && onChange !== undefined) { + isValid.changed.addOnce(onChange); + } + if (options.isValid?.(layer).value === false) { + return []; + } + return [{ type: toolId }]; + }, ); } diff --git a/src/widget/multiline_autocomplete.ts b/src/widget/multiline_autocomplete.ts index 5917b3cf82..1b412098eb 100644 --- a/src/widget/multiline_autocomplete.ts +++ b/src/widget/multiline_autocomplete.ts @@ -94,8 +94,12 @@ const keyMap = EventActionMap.fromObject({ escape: { action: "cancel", preventDefault: false, stopPropagation: false }, }); +export interface CompletionRequest { + value: string; + selectionRange?: { begin: number; end: number } | undefined; +} export type Completer = ( - value: string, + request: CompletionRequest, abortSignal: AbortSignal, ) => Promise | null; @@ -228,7 +232,13 @@ export class AutocompleteTextInput extends RefCounted { const abortController = (this.activeCompletionAbortController = new AbortController()); const activeCompletionPromise = (this.activeCompletionPromise = - this.completer(this.value, abortController.signal)); + this.completer( + { + value: this.value, + selectionRange: this.getSelectionRange(), + }, + abortController.signal, + )); if (activeCompletionPromise !== null) { activeCompletionPromise.then((completionResult) => { if (this.activeCompletionPromise === activeCompletionPromise) { diff --git a/src/widget/position_plot.ts b/src/widget/position_plot.ts index 95e339d87d..960c05c80c 100644 --- a/src/widget/position_plot.ts +++ b/src/widget/position_plot.ts @@ -177,6 +177,7 @@ export class PositionPlot extends RefCounted { this.visible = false; return; } + this.element.style.display = ""; this.visible = true; const { lowerBound, upperBound } = normalizedDimensionBounds; diff --git a/src/widget/position_widget.css b/src/widget/position_widget.css index 24eb022c1f..388fdfd8c0 100644 --- a/src/widget/position_widget.css +++ b/src/widget/position_widget.css @@ -226,8 +226,29 @@ interferes with our click handling. Setting `pointer-events: none;` avoids that height: 12px; } +.neuroglancer-position-tool-in-palette { + display: grid; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-position-widget { + grid-row: 1; + grid-column: 1; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-position-dimension-plot { + grid-row: 2; + grid-column: 1 / 10; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-checkbox-icon { + grid-row: 1; + grid-column: 9; +} + .neuroglancer-position-tool { background-color: #474747; + display: flex; + flex-direction: row; } .neuroglancer-position-dimension-playback-header { diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 29943505f3..79f324d2ba 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -24,6 +24,7 @@ import type { CoordinateSpace, CoordinateSpaceCombiner, DimensionId, + TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; import { clampAndRoundCoordinateToVoxelCenter, @@ -44,6 +45,7 @@ import { makeCachedDerivedWatchableValue, WatchableValue, } from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; import type { LocalToolBinder, ToolActivation } from "#src/ui/tool.js"; import { makeToolActivationStatusMessage, @@ -51,6 +53,8 @@ import { registerTool, Tool, } from "#src/ui/tool.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { beginToolDrag, endToolDrag } from "#src/ui/tool_drag_and_drop.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import { arraysEqual, binarySearch } from "#src/util/array.js"; import { setClipboard } from "#src/util/clipboard.js"; @@ -233,15 +237,17 @@ class DimensionWidget { ); if (allowFocus) { - nameContainer.addEventListener("dblclick", () => { + nameContainer.addEventListener("dblclick", (event) => { nameElement.disabled = false; nameElement.focus(); nameElement.select(); + event.stopPropagation(); }); - scaleContainer.addEventListener("dblclick", () => { + scaleContainer.addEventListener("dblclick", (event) => { scaleElement.disabled = false; scaleElement.focus(); scaleElement.select(); + event.stopPropagation(); }); coordinate.addEventListener("focus", () => { coordinate.select(); @@ -296,6 +302,7 @@ export class PositionWidget extends RefCounted { private getToolBinder: (() => LocalToolBinder | undefined) | undefined; private allowFocus: boolean; private showPlayback: boolean; + private showDropdown: boolean; private dimensionWidgets = new Map(); private dimensionWidgetList: DimensionWidget[] = []; @@ -473,11 +480,11 @@ export class PositionWidget extends RefCounted { dropdown.appendChild(entryElement); entries.push({ entryElement, coordinateElement, labelElement }); } - // const dropdownOwner = widget.dropdownOwner!; } private openDropdown(widget: DimensionWidget) { if (widget.dropdownOwner !== undefined) return; + if (!this.showDropdown) return; const dimensionIndex = this.getDimensionIndex(widget.id); if (dimensionIndex === -1) return; this.closeDropdown(); @@ -594,13 +601,43 @@ export class PositionWidget extends RefCounted { coordinateSpace, id, initialDimensionIndex, - { allowFocus: this.allowFocus, showPlayback: this.showPlayback }, + { + allowFocus: this.allowFocus, + showPlayback: this.showPlayback, + }, ); + let toolDragSource: ToolDragSource | undefined; + const localBinder = this.getToolBinder?.(); + if (localBinder !== undefined) { + const self = this; + toolDragSource = { + localBinder, + get toolJson() { + return { + type: DIMENSION_TOOL_ID, + dimension: + self.position.coordinateSpace.value.names[ + self.getDimensionIndex(id) + ], + }; + }, + }; + } if (this.singleDimensionId === undefined) { widget.container.addEventListener("dragstart", (event: DragEvent) => { this.dragSource = widget; event.stopPropagation(); event.dataTransfer!.setData("neuroglancer-dimension", ""); + pushDragStatus( + event, + widget.container, + "drag", + "Drag to reorder dimensions, to an existing tool palette, or to the " + + "left/right/top/bottom of another panel to create a new tool palette", + ); + if (toolDragSource !== undefined) { + beginToolDrag(toolDragSource); + } }); widget.container.addEventListener("dragenter", (event: DragEvent) => { const { dragSource } = this; @@ -613,10 +650,13 @@ export class PositionWidget extends RefCounted { this.reorderDimensionTo(targetIndex, sourceIndex); }); widget.container.addEventListener("dragend", (event: DragEvent) => { - event; if (this.dragSource === widget) { this.dragSource = undefined; } + popDragStatus(event, widget.container, "drag"); + if (toolDragSource !== undefined) { + endToolDrag(toolDragSource); + } }); } if (this.allowFocus) { @@ -999,6 +1039,7 @@ export class PositionWidget extends RefCounted { getToolBinder = undefined, allowFocus = true, showPlayback = true, + showDropdown = true, }: { copyButton?: boolean; velocity?: CoordinateSpacePlaybackVelocity; @@ -1006,6 +1047,7 @@ export class PositionWidget extends RefCounted { getToolBinder?: (() => LocalToolBinder | undefined) | undefined; allowFocus?: boolean; showPlayback?: boolean; + showDropdown?: boolean; } = {}, ) { super(); @@ -1015,6 +1057,7 @@ export class PositionWidget extends RefCounted { this.getToolBinder = getToolBinder; this.allowFocus = allowFocus; this.showPlayback = showPlayback; + this.showDropdown = showDropdown; this.registerDisposer( position.coordinateSpace.changed.add( this.registerCancellable( @@ -1340,8 +1383,58 @@ class DimensionTool extends Tool { activate(activation: ToolActivation) { const { viewer } = this; const { content } = makeToolActivationStatusMessage(activation); - content.classList.add("neuroglancer-position-tool"); + const { positionWidget } = this.makeTool( + activation, + content, + /*inPalette=*/ false, + ); activation.bindInputEventMap(TOOL_INPUT_EVENT_MAP); + activation.bindAction( + "adjust-position-via-wheel", + (actionEvent) => { + actionEvent.stopPropagation(); + const event = actionEvent.detail; + const { deltaY } = event; + if (deltaY === 0) { + return; + } + positionWidget.adjustDimensionPosition( + this.dimensionId, + Math.sign(deltaY), + ); + }, + ); + activation.bindAction( + "adjust-velocity-via-wheel", + (actionEvent) => { + actionEvent.stopPropagation(); + const factor = getWheelZoomAmount(actionEvent.detail); + viewer.velocity.multiplyVelocity(this.dimensionId, factor); + }, + ); + activation.bindAction("toggle-playback", (event) => { + event.stopPropagation(); + viewer.velocity.togglePlayback(this.dimensionId); + }); + } + + renderInPalette(context: RefCounted) { + const content = document.createElement("div"); + this.makeTool(context, content, /*inPalette=*/ true); + return content; + } + + private makeTool( + activation: RefCounted, + content: HTMLElement, + inPalette: boolean, + ) { + const { viewer } = this; + if (inPalette) { + content.classList.add("neuroglancer-position-tool-in-palette"); + } else { + content.classList.add("neuroglancer-position-tool"); + } const positionWidget = new PositionWidget( viewer.position, viewer.coordinateSpaceCombiner, @@ -1349,8 +1442,9 @@ class DimensionTool extends Tool { velocity: viewer.velocity, singleDimensionId: this.dimensionId, copyButton: false, - allowFocus: false, + allowFocus: inPalette, showPlayback: false, + showDropdown: false, }, ); positionWidget.element.style.userSelect = "none"; @@ -1360,21 +1454,6 @@ class DimensionTool extends Tool { ); plot.element.style.flex = "1"; content.appendChild(plot.element); - activation.bindAction( - "adjust-position-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const event = actionEvent.detail; - const { deltaY } = event; - if (deltaY === 0) { - return; - } - positionWidget.adjustDimensionPosition( - this.dimensionId, - Math.sign(deltaY), - ); - }, - ); const watchableVelocity = this.velocity.dimensionVelocity( activation, @@ -1478,50 +1557,39 @@ class DimensionTool extends Tool { }), ).element, ); + return { positionWidget }; + } - activation.bindAction( - "adjust-velocity-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const factor = getWheelZoomAmount(actionEvent.detail); - viewer.velocity.multiplyVelocity(this.dimensionId, factor); - }, - ); - activation.bindAction("toggle-playback", (event) => { - event.stopPropagation(); - viewer.velocity.togglePlayback(this.dimensionId); - }); + private savedDimensionName: string = ""; + + get dimensionName(): string | undefined { + const { dimensionId } = this; + const coordinateSpace = this.coordinateSpace.value; + const i = coordinateSpace.ids.indexOf(dimensionId); + if (i === -1) return undefined; + return coordinateSpace.names[i]; } get description() { return `dim ${this.dimensionName}`; } - dimensionIndex: number; - dimensionName: string; - constructor( public viewer: SupportsDimensionTool, public dimensionId: DimensionId, ) { super(viewer.toolBinder); - const coordinateSpace = this.coordinateSpace.value; - const i = (this.dimensionIndex = coordinateSpace.ids.indexOf(dimensionId)); - this.dimensionName = coordinateSpace.names[i]; + this.savedDimensionName = this.dimensionName!; this.registerDisposer( this.coordinateSpace.changed.add(() => { - const coordinateSpace = this.coordinateSpace.value; - const i = (this.dimensionIndex = - this.coordinateSpace.value.ids.indexOf(dimensionId)); - if (i === -1) { + const dimensionName = this.dimensionName; + if (dimensionName === undefined) { this.unbind(); return; } - const newName = coordinateSpace.names[i]; - if (this.dimensionName !== newName) { - this.dimensionName = newName; - this.changed.dispatch(); - } + if (dimensionName === this.savedDimensionName) return; + this.savedDimensionName = dimensionName; + this.changed.dispatch(); }), ); } @@ -1544,34 +1612,56 @@ function makeDimensionTool(viewer: SupportsDimensionTool, obj: unknown) { return new DimensionTool(viewer, coordinateSpace.ids[dimensionIndex]); } +function listDimensionTools( + coordinateSpace: TrackableCoordinateSpace, + onChange?: () => void, +) { + if (onChange !== undefined) { + coordinateSpace.changed.addOnce(onChange); + } + return coordinateSpace.value.names.map((name) => ({ + type: DIMENSION_TOOL_ID, + dimension: name, + })); +} + export function registerDimensionToolForViewer(contextType: typeof Viewer) { - registerTool(contextType, DIMENSION_TOOL_ID, (viewer, obj) => - makeDimensionTool( - { - position: viewer.position, - velocity: viewer.velocity, - coordinateSpaceCombiner: - viewer.layerSpecification.coordinateSpaceCombiner, - toolBinder: viewer.toolBinder, - }, - obj, - ), + registerTool( + contextType, + DIMENSION_TOOL_ID, + (viewer, obj) => + makeDimensionTool( + { + position: viewer.position, + velocity: viewer.velocity, + coordinateSpaceCombiner: + viewer.layerSpecification.coordinateSpaceCombiner, + toolBinder: viewer.toolBinder, + }, + obj, + ), + (viewer, onChange) => listDimensionTools(viewer.coordinateSpace, onChange), ); } export function registerDimensionToolForUserLayer( contextType: typeof UserLayer, ) { - registerTool(contextType, DIMENSION_TOOL_ID, (layer, obj) => - makeDimensionTool( - { - position: layer.localPosition, - velocity: layer.localVelocity, - coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, - toolBinder: layer.toolBinder, - }, - obj, - ), + registerTool( + contextType, + DIMENSION_TOOL_ID, + (layer, obj) => + makeDimensionTool( + { + position: layer.localPosition, + velocity: layer.localVelocity, + coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, + toolBinder: layer.toolBinder, + }, + obj, + ), + (layer, onChange) => + listDimensionTools(layer.localCoordinateSpace, onChange), ); } diff --git a/src/widget/shader_controls.ts b/src/widget/shader_controls.ts index f9a3921430..c3cfd523f0 100644 --- a/src/widget/shader_controls.ts +++ b/src/widget/shader_controls.ts @@ -17,7 +17,6 @@ import { debounce } from "lodash-es"; import type { DisplayContext } from "#src/display_context.js"; import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; -import type { ToolActivation } from "#src/ui/tool.js"; import { registerTool } from "#src/ui/tool.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeChildren } from "#src/util/dom.js"; @@ -246,26 +245,27 @@ class ShaderControlTool extends LayerControlTool { control, ), ); + const debounceCheckValidity = this.registerCancellable( + debounce(() => { + if ( + layerShaderControls.shaderControlState.state.get(control) === + undefined + ) { + this.unbind(); + } + }), + ); this.registerDisposer( layerShaderControls.shaderControlState.controls.changed.add( - this.registerCancellable( - debounce(() => { - if ( - layerShaderControls.shaderControlState.state.get(control) === - undefined - ) { - this.unbind(); - } - }), - ), + debounceCheckValidity, ), ); } - activate(activation: ToolActivation) { + + isLoading() { const { shaderControlState } = this.layerShaderControls; const controlState = shaderControlState.state.get(this.control); - if (controlState === undefined) return; - super.activate(activation); + return controlState === undefined; } } @@ -274,12 +274,28 @@ export function registerLayerShaderControlsTool( getter: (layer: LayerType) => LayerShaderControls, toolId: string = SHADER_CONTROL_TOOL_ID, ) { - registerTool(layerType, toolId, (layer, options) => { - const control = verifyObjectProperty( - options, - CONTROL_JSON_KEY, - verifyString, - ); - return new ShaderControlTool(layer, getter(layer), toolId, control); - }); + registerTool( + layerType, + toolId, + (layer, options) => { + const control = verifyObjectProperty( + options, + CONTROL_JSON_KEY, + verifyString, + ); + return new ShaderControlTool(layer, getter(layer), toolId, control); + }, + (layer, onChange) => { + const layerShaderControls = getter(layer); + const { shaderControlState } = layerShaderControls; + if (onChange !== undefined) { + shaderControlState.controls.changed.addOnce(onChange); + } + const map = shaderControlState.state; + return Array.from(map.keys(), (key) => ({ + type: SHADER_CONTROL_TOOL_ID, + [CONTROL_JSON_KEY]: key, + })); + }, + ); } diff --git a/src/widget/text_input.ts b/src/widget/text_input.ts index 322bc485d2..1f3775aa91 100644 --- a/src/widget/text_input.ts +++ b/src/widget/text_input.ts @@ -17,6 +17,15 @@ import type { TrackableValueInterface } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeFromParent } from "#src/util/dom.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import { + KeyboardEventBinder, + registerActionListener, +} from "#src/util/keyboard_bindings.js"; + +const inputEventMap = EventActionMap.fromObject({ + escape: { action: "cancel" }, +}); export class TextInputWidget extends RefCounted { element = document.createElement("input"); @@ -25,7 +34,20 @@ export class TextInputWidget extends RefCounted { this.registerDisposer(model.changed.add(() => this.updateView())); const { element } = this; element.type = "text"; + element.spellcheck = false; + element.autocomplete = "off"; + const keyboardHandler = this.registerDisposer( + new KeyboardEventBinder(element, inputEventMap), + ); + keyboardHandler.allShortcutsAreGlobal = true; + registerActionListener(element, "cancel", (event) => { + this.updateView(); + element.blur(); + event.stopPropagation(); + event.preventDefault(); + }); this.registerEventListener(element, "change", () => this.updateModel()); + this.registerEventListener(element, "blur", () => this.updateModel()); this.updateView(); } From a4404b92e9cf518c0615d32aae8be8aeb0ceb028 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 12 Dec 2024 21:31:11 -0800 Subject: [PATCH 26/41] fix(png): fix multi-channel png decoding Fixes https://github.com/google/tensorstore/issues/209. --- python/tests/n5_test.py | 2 - python/tests/precomputed_test.py | 93 ++++++++++++++++++++++++++++++++ src/sliceview/png/index.ts | 10 +++- 3 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 python/tests/precomputed_test.py diff --git a/python/tests/n5_test.py b/python/tests/n5_test.py index 9281302087..d9432b46a1 100644 --- a/python/tests/n5_test.py +++ b/python/tests/n5_test.py @@ -19,8 +19,6 @@ import numpy as np import pytest -TEST_DATA_DIR = pathlib.Path(__file__).parent.parent / "testdata" - @pytest.mark.parametrize( "spec", diff --git a/python/tests/precomputed_test.py b/python/tests/precomputed_test.py new file mode 100644 index 0000000000..53e9f6040e --- /dev/null +++ b/python/tests/precomputed_test.py @@ -0,0 +1,93 @@ +# @license +# Copyright 2023 Google Inc. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests the n5 datasource.""" + +import pathlib + +import neuroglancer +import numpy as np +import pytest + + +@pytest.mark.parametrize( + "spec", + [ + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "png", "chunk_size": [8, 9, 1]}, + "dtype": "uint8", + "schema": {"domain": {"shape": [10, 20, 5, num_channels]}}, + } + for num_channels in [1, 2, 3, 4] + ] + + [ + # Currently TensorStore does not support uint16 with more than one channel. + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "png"}, + "dtype": "uint16", + "schema": {"domain": {"shape": [10, 20, 5, 1]}}, + } + ] + + [ + # Due to a tensorstore bug (https://github.com/google/neuroglancer/issues/677) + # the block shape must be square. + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "jpeg", "chunk_size": [10, 10, 1]}, + "dtype": "uint8", + "schema": {"domain": {"shape": [10, 20, 1, num_channels]}}, + } + for num_channels in [1, 3] + ], + ids=str, +) +def test_precomputed(tempdir_server: tuple[pathlib.Path, str], webdriver, spec): + import tensorstore as ts + + tmp_path, server_url = tempdir_server + + full_spec = { + "kvstore": { + "driver": "file", + "path": str(tmp_path), + } + } + full_spec.update(spec) + + store = ts.open(full_spec, create=True).result() + + a = np.arange(np.prod(store.shape), dtype=store.dtype.numpy_dtype).reshape( + store.shape + ) + + store[...] = a + + with webdriver.viewer.txn() as s: + s.layers.append( + name="a", + layer=neuroglancer.ImageLayer(source=f"precomputed://{server_url}"), + ) + + if store.shape[-1] == 1: + # Neuroglancer elides the channel dimension if there is only 1 channel + store = store[..., 0] + + vol = webdriver.viewer.volume("a").result() + b = vol.read().result() + + if spec["scale_metadata"]["encoding"] == "jpeg": + np.testing.assert_allclose(store.read().result(), b, atol=4, rtol=0) + else: + np.testing.assert_equal(store.read().result(), b) diff --git a/src/sliceview/png/index.ts b/src/sliceview/png/index.ts index c138aca232..19f039657e 100644 --- a/src/sliceview/png/index.ts +++ b/src/sliceview/png/index.ts @@ -15,6 +15,7 @@ */ import type { DecodedImage } from "#src/async_computation/decode_png_request.js"; +import { transposeArray2d } from "#src/util/array.js"; const libraryEnv = { emscripten_notify_memory_growth: () => {}, @@ -160,7 +161,7 @@ function readHeader(buffer: Uint8Array): { `png: invalid bit depth for grayscale + alpha channel colorspace. Got: ${bitDepth}`, ); } - numChannels = 4; + numChannels = 2; } else { throw new Error(`png: Invalid color space: ${colorSpace}`); } @@ -232,11 +233,16 @@ export async function decompressPng( // Likewise, we reference memory.buffer instead of heap.buffer // because memory growth during decompress could have detached // the buffer. - const image = new Uint8Array( + let image = new Uint8Array( (m.exports.memory as WebAssembly.Memory).buffer, imagePtr, nbytes, ); + + if (numChannels !== 1) { + image = transposeArray2d(image, sx * sy, numChannels); + } + // copy the array so it can be memory managed by JS // and we can free the emscripten buffer return { From 21653432ecff8b734bd707eaea27aa90a0654fb3 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 18 Dec 2024 21:42:09 -0800 Subject: [PATCH 27/41] chore: vendor glsl-editor/glsl.js as codemirror-glsl.ts This avoids pulling in unnecessary transitive dependencies, and avoids issues the vite dev-server has with transitive CommonJS dependencies. --- package-lock.json | 400 +++-------------------------- package.json | 1 - src/third_party/codemirror-glsl.ts | 260 +++++++++++++++++++ src/widget/shader_code_widget.ts | 2 +- typings/glsl-editor.d.ts | 24 -- typings/index.d.ts | 1 - 6 files changed, 293 insertions(+), 395 deletions(-) create mode 100644 src/third_party/codemirror-glsl.ts delete mode 100644 typings/glsl-editor.d.ts diff --git a/package-lock.json b/package-lock.json index a05f03f685..1ee22589e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -3958,29 +3957,6 @@ "node": ">=8" } }, - "node_modules/brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -4053,18 +4029,13 @@ "node": ">=8.0.0" } }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true }, "node_modules/bundle-name": { "version": "4.1.0", @@ -4728,20 +4699,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/condense-newlines": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", @@ -4799,11 +4756,6 @@ "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -4832,7 +4784,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/crc-32": { "version": "1.2.2", @@ -5346,14 +5299,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -5534,11 +5479,6 @@ "optional": true, "peer": true }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -5818,6 +5758,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -6296,6 +6237,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -6341,14 +6283,6 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -6546,29 +6480,6 @@ "node >=0.6.0" ] }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6905,6 +6816,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7192,26 +7104,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glsl-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", - "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", - "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7293,14 +7185,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -7377,6 +7261,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7681,12 +7566,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/insert-css": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", - "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -7840,6 +7721,7 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -8243,7 +8125,8 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -8891,22 +8774,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9008,6 +8875,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9718,7 +9586,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "2.0.0", @@ -9981,7 +9850,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/progress": { "version": "2.0.3", @@ -10122,28 +9992,6 @@ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "dev": true }, - "node_modules/quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10198,6 +10046,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10211,12 +10060,14 @@ "node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/readdir-glob": { "version": "1.1.3", @@ -10436,6 +10287,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -11003,11 +10855,6 @@ "node": ">=0.10.0" } }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11338,145 +11185,6 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" - }, - "node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -11524,6 +11232,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -11531,7 +11240,8 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/string-width": { "version": "5.1.2", @@ -11724,6 +11434,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -11861,36 +11572,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -12681,11 +12362,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -12871,7 +12547,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -13470,11 +13147,6 @@ } } }, - "node_modules/vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -14191,14 +13863,6 @@ "node": ">=0.1" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index d555bc463e..0261183b82 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", diff --git a/src/third_party/codemirror-glsl.ts b/src/third_party/codemirror-glsl.ts new file mode 100644 index 0000000000..22271a5e6a --- /dev/null +++ b/src/third_party/codemirror-glsl.ts @@ -0,0 +1,260 @@ +// The following code is derived from https://github.com/hughsk/glsl-editor by +// Hugh Kennedy , subject to the license listed below. +// +// This is a conversion of the original CommonJS module to TypeScript and ESM format. +// +// This software is released under the MIT license: +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import type CodeMirrorModule from "codemirror"; +import type { EditorConfiguration, Mode, StringStream } from "codemirror"; + +interface Tokenize { + (stream: StringStream, state: State): string; +} + +interface State { + tokenize: Tokenize | null; + context: Context; + indented: number; + startOfLine: boolean; +} + +class Context { + constructor( + public indented: number, + public column: number, + public type: string, + public align: boolean | null, + public prev: Context | undefined = undefined, + ) {} +} + +function glslMode(config: EditorConfiguration, parserConfig: any): Mode { + const indentUnit = config.indentUnit!, + keywords = parserConfig.keywords || words(glslKeywords), + builtins = parserConfig.builtins || words(glslBuiltins), + blockKeywords = + parserConfig.blockKeywords || + words("case do else for if switch while struct"), + atoms = parserConfig.atoms || words("null"), + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings; + const isOperatorChar = /[+\-*&%=<>!?|/]/; + + let curPunc; + + function tokenBase(stream: StringStream, state: State): string { + const ch = stream.next()!; + if (hooks[ch]) { + const result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[[\]{}(),;:.]/.test(ch)) { + curPunc = ch; + return "bracket"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (ch == "#") { + stream.eatWhile(/[\S]+/); + stream.eatWhile(/[\s]+/); + stream.eatWhile(/[\S]+/); + stream.eatWhile(/[\s]+/); + return "comment"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w$_]/); + const cur = stream.current(); + if (Object.hasOwn(keywords, cur)) { + if (Object.hasOwn(blockKeywords, cur)) curPunc = "newstatement"; + return "keyword"; + } + if (Object.hasOwn(builtins, cur)) { + return "builtin"; + } + if (Object.hasOwn(atoms, cur)) return "atom"; + return "word"; + } + + function tokenString(quote: string): Tokenize { + return function (stream: StringStream, state: State) { + let escaped = false, + next, + end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream: StringStream, state: State): string { + let maybeEnd = false, + ch; + while ((ch = stream.next())) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = ch == "*"; + } + return "comment"; + } + + function pushContext(state: State, col: number, type: string) { + return (state.context = new Context( + state.indented, + col, + type, + null, + state.context, + )); + } + function popContext(state: State): Context { + const t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return (state.context = state.context.prev!); + } + + // Interface + + return { + startState: function (basecolumn?: number): State { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true, + }; + }, + + token: function (stream: StringStream, state: State) { + let ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + const style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") + popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } else if (curPunc == ctx.type) popContext(state); + else if ( + ctx.type == "}" || + ctx.type == "top" || + (ctx.type == "statement" && curPunc == "newstatement") + ) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function (state: State, textAfter: string) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + const firstChar = textAfter && textAfter.charAt(0), + ctx = state.context, + closing = firstChar == ctx.type; + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + }; +} + +function words(str: string): Record { + const obj: Record = {}, + words = str.split(" "); + for (let i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; +} + +const glslKeywords = + "attribute const uniform varying break continue " + + "do for while if else in out inout float int void bool true false " + + "lowp mediump highp precision invariant discard return mat2 mat3 " + + "mat4 vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 sampler2D " + + "samplerCube struct gl_FragCoord gl_FragColor"; +const glslBuiltins = + "radians degrees sin cos tan asin acos atan pow " + + "exp log exp2 log2 sqrt inversesqrt abs sign floor ceil fract mod " + + "min max clamp mix step smoothstep length distance dot cross " + + "normalize faceforward reflect refract matrixCompMult lessThan " + + "lessThanEqual greaterThan greaterThanEqual equal notEqual any all " + + "not dFdx dFdy fwidth texture2D texture2DProj texture2DLod " + + "texture2DProjLod textureCube textureCubeLod require export"; + +function cppHook(stream: any, state: any) { + if (!state.startOfLine) return false; + stream.skipToEnd(); + return "meta"; +} + +export default function (CodeMirror: typeof CodeMirrorModule) { + CodeMirror.defineMode("glsl", glslMode); + + CodeMirror.defineMIME("text/x-glsl", { + name: "glsl", + keywords: words(glslKeywords), + builtins: words(glslBuiltins), + blockKeywords: words("case do else for if switch while struct"), + atoms: words("null"), + hooks: { "#": cppHook }, + } as any); +} diff --git a/src/widget/shader_code_widget.ts b/src/widget/shader_code_widget.ts index c86fae81cf..df08d64f1a 100644 --- a/src/widget/shader_code_widget.ts +++ b/src/widget/shader_code_widget.ts @@ -20,8 +20,8 @@ import "codemirror/lib/codemirror.css"; import "codemirror/addon/lint/lint.css"; import CodeMirror from "codemirror"; -import glslCodeMirror from "glsl-editor/glsl.js"; import { debounce } from "lodash-es"; +import glslCodeMirror from "#src/third_party/codemirror-glsl.js"; import type { WatchableValue } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeFromParent } from "#src/util/dom.js"; diff --git a/typings/glsl-editor.d.ts b/typings/glsl-editor.d.ts deleted file mode 100644 index c32e7ba06d..0000000000 --- a/typings/glsl-editor.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Basic typings for glsl-editor package. - */ -declare module "glsl-editor/glsl.js" { - import CodeMirror from "codemirror"; - const f: (codeMirror: typeof CodeMirror) => void; - export default f; -} diff --git a/typings/index.d.ts b/typings/index.d.ts index b1018d0087..792d3785ed 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,3 +1,2 @@ /// -/// /// From 3d2f93d4894df5ab731dfca406248ff3a0011364 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 18 Dec 2024 21:45:05 -0800 Subject: [PATCH 28/41] fix(examples/vite): fix vite example when using a real Neuroglancer install The vite examples previously worked only when using a symlinked Neuroglancer (as in the tests used in this repo), but not when the Neuroglancer dependency was installed normally. The vite dev server special-cases symlinked dependencies in a way that made its optimizeDeps step work when Neuroglancer is symlinked in `node_modules` but not otherwise. Additional optimizeDeps options have now been added to the vite example configs to ensure the build works when Neuroglancer is installed as a normal dependency. Fixes https://github.com/google/neuroglancer/issues/683 --- build_tools/after-version-change.ts | 15 +- build_tools/build-package.ts | 1 + .../parcel-project-built/package-lock.json | 1 - .../parcel-project-source/package-lock.json | 336 +------------- .../rsbuild-project-built/package-lock.json | 1 - .../rsbuild-project-source/package-lock.json | 336 +------------- .../rspack-project-built/package-lock.json | 75 +--- .../rspack/rspack-project-built/package.json | 3 +- .../rspack-project-source/package-lock.json | 410 ++---------------- .../rspack/rspack-project-source/package.json | 3 +- .../vite/vite-project-built/package-lock.json | 1 - .../vite/vite-project-built/vite.config.ts | 22 +- .../vite-project-source/package-lock.json | 336 +------------- .../vite/vite-project-source/vite.config.ts | 26 +- .../webpack-project-built/package-lock.json | 73 ---- .../webpack-project-built/package.json | 1 - .../webpack-project-source/package-lock.json | 392 +---------------- .../webpack-project-source/package.json | 1 - package.json | 4 +- 19 files changed, 186 insertions(+), 1851 deletions(-) diff --git a/build_tools/after-version-change.ts b/build_tools/after-version-change.ts index 67d88c04c5..7bb68f47f1 100644 --- a/build_tools/after-version-change.ts +++ b/build_tools/after-version-change.ts @@ -28,8 +28,17 @@ await Promise.all( await execFileAsync("npm", ["install", "--no-audit", "--no-fund"], { cwd: exampleDir, }); - await execFileAsync("git", ["add", "package-lock.json"], { - cwd: exampleDir, - }); }), ); + +await execFileAsync( + "git", + [ + "add", + ...(await glob("examples/*/*/package-lock.json", { + absolute: false, + cwd: rootDir, + })), + ], + { cwd: rootDir }, +); diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts index ef2203902f..f95d924f98 100644 --- a/build_tools/build-package.ts +++ b/build_tools/build-package.ts @@ -122,6 +122,7 @@ async function buildPackage(options: { const { postpack } = packageJson["scripts"]; delete packageJson["scripts"]; packageJson["scripts"] = { postpack }; + packageJson["files"] = ["lib/**/*"]; } else { delete packageJson["private"]; packageJson["scripts"] = {}; diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 9c5b0cc6e7..52fdcccb14 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -25,7 +25,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index abc7f2f934..8142ea13f6 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -24,7 +24,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -2092,27 +2091,6 @@ "node": ">=8" } }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" @@ -2158,16 +2136,12 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", @@ -2482,19 +2456,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -2519,12 +2480,9 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "../../../node_modules/crc-32": { @@ -3000,6 +2958,7 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -3114,10 +3073,6 @@ "optional": true, "peer": true }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" @@ -3648,6 +3603,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -3959,6 +3915,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3971,13 +3928,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -4104,27 +4054,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -4442,6 +4371,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4739,23 +4669,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -4849,13 +4762,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -4921,6 +4827,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5348,12 +5255,9 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, "../../../node_modules/internal-slot": { "version": "1.0.6", "dev": true, @@ -5440,6 +5344,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -5668,6 +5573,7 @@ }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -6149,20 +6055,6 @@ "node": ">=12" } }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -6231,6 +6123,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6683,6 +6576,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -6912,6 +6806,7 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "../../../node_modules/progress": { @@ -7115,26 +7010,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -7152,6 +7027,7 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -7165,10 +7041,12 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/readdir-glob": { @@ -7314,6 +7192,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7694,10 +7573,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -7871,132 +7746,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -8020,6 +7769,7 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8027,6 +7777,7 @@ }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/string-width": { @@ -8206,6 +7957,7 @@ }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8320,32 +8072,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -8974,10 +8700,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -9131,6 +8853,7 @@ }, "../../../node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "../../../node_modules/uuid": { @@ -9358,10 +9081,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -9889,13 +9608,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, diff --git a/examples/rsbuild/rsbuild-project-built/package-lock.json b/examples/rsbuild/rsbuild-project-built/package-lock.json index 854ddfff09..b73b7b5a55 100644 --- a/examples/rsbuild/rsbuild-project-built/package-lock.json +++ b/examples/rsbuild/rsbuild-project-built/package-lock.json @@ -23,7 +23,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json index 944fb1ebee..cd2de996d0 100644 --- a/examples/rsbuild/rsbuild-project-source/package-lock.json +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -22,7 +22,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -2090,27 +2089,6 @@ "node": ">=8" } }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" @@ -2156,16 +2134,12 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", @@ -2480,19 +2454,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -2517,12 +2478,9 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "../../../node_modules/crc-32": { @@ -2998,6 +2956,7 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -3112,10 +3071,6 @@ "optional": true, "peer": true }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" @@ -3646,6 +3601,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -3957,6 +3913,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3969,13 +3926,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -4102,27 +4052,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -4440,6 +4369,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4737,23 +4667,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -4847,13 +4760,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -4919,6 +4825,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5346,12 +5253,9 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, "../../../node_modules/internal-slot": { "version": "1.0.6", "dev": true, @@ -5438,6 +5342,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -5666,6 +5571,7 @@ }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -6147,20 +6053,6 @@ "node": ">=12" } }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -6229,6 +6121,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6681,6 +6574,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -6910,6 +6804,7 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "../../../node_modules/progress": { @@ -7113,26 +7008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -7150,6 +7025,7 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -7163,10 +7039,12 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/readdir-glob": { @@ -7312,6 +7190,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7692,10 +7571,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -7869,132 +7744,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -8018,6 +7767,7 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8025,6 +7775,7 @@ }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/string-width": { @@ -8204,6 +7955,7 @@ }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8318,32 +8070,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -8972,10 +8698,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -9129,6 +8851,7 @@ }, "../../../node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "../../../node_modules/uuid": { @@ -9356,10 +9079,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -9887,13 +9606,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, diff --git a/examples/rspack/rspack-project-built/package-lock.json b/examples/rspack/rspack-project-built/package-lock.json index 85c7f27965..b55a287ff8 100644 --- a/examples/rspack/rspack-project-built/package-lock.json +++ b/examples/rspack/rspack-project-built/package-lock.json @@ -13,8 +13,7 @@ }, "devDependencies": { "@rspack/cli": "^1.1.5", - "@rspack/core": "^1.1.5", - "svg-inline-loader": "^0.8.2" + "@rspack/core": "^1.1.5" } }, "../../../dist/package": { @@ -25,7 +24,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -1031,14 +1029,6 @@ "dev": true, "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -1634,14 +1624,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -2502,17 +2484,6 @@ "optional": true, "peer": true }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/launch-editor": { "version": "2.6.1", "dev": true, @@ -2532,19 +2503,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/lodash": { "version": "4.17.21", "dev": true, @@ -2670,14 +2628,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -2765,14 +2715,6 @@ "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -3397,11 +3339,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sirv": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", @@ -3652,16 +3589,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/rspack/rspack-project-built/package.json b/examples/rspack/rspack-project-built/package.json index f684132e6a..37c4e18ffb 100644 --- a/examples/rspack/rspack-project-built/package.json +++ b/examples/rspack/rspack-project-built/package.json @@ -18,8 +18,7 @@ "license": "Apache-2.0", "devDependencies": { "@rspack/cli": "^1.1.5", - "@rspack/core": "^1.1.5", - "svg-inline-loader": "^0.8.2" + "@rspack/core": "^1.1.5" }, "type": "module" } diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json index 0c002d5fba..064914d4c2 100644 --- a/examples/rspack/rspack-project-source/package-lock.json +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -13,8 +13,7 @@ }, "devDependencies": { "@rspack/cli": "^1.1.5", - "@rspack/core": "^1.1.5", - "svg-inline-loader": "^0.8.2" + "@rspack/core": "^1.1.5" } }, "../../..": { @@ -24,7 +23,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -2092,27 +2090,6 @@ "node": ">=8" } }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" @@ -2158,16 +2135,12 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", @@ -2482,19 +2455,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -2519,12 +2479,9 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "../../../node_modules/crc-32": { @@ -3000,6 +2957,7 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -3114,10 +3072,6 @@ "optional": true, "peer": true }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" @@ -3648,6 +3602,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -3959,6 +3914,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3971,13 +3927,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -4104,27 +4053,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -4442,6 +4370,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4739,23 +4668,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -4849,13 +4761,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -4921,6 +4826,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5348,12 +5254,9 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, "../../../node_modules/internal-slot": { "version": "1.0.6", "dev": true, @@ -5440,6 +5343,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -5668,6 +5572,7 @@ }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -6149,20 +6054,6 @@ "node": ">=12" } }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -6231,6 +6122,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6683,6 +6575,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -6912,6 +6805,7 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "../../../node_modules/progress": { @@ -7115,26 +7009,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -7152,6 +7026,7 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -7165,10 +7040,12 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/readdir-glob": { @@ -7314,6 +7191,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7694,10 +7572,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -7871,132 +7745,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -8020,6 +7768,7 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8027,6 +7776,7 @@ }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/string-width": { @@ -8206,6 +7956,7 @@ }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8320,32 +8071,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -8974,10 +8699,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -9131,6 +8852,7 @@ }, "../../../node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "../../../node_modules/uuid": { @@ -9358,10 +9080,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -9889,13 +9607,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -10939,14 +10650,6 @@ "dev": true, "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -11514,14 +11217,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "dev": true, @@ -12370,17 +12065,6 @@ "optional": true, "peer": true }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/launch-editor": { "version": "2.6.1", "dev": true, @@ -12400,19 +12084,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/lodash": { "version": "4.17.21", "dev": true, @@ -12529,14 +12200,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -12624,14 +12287,6 @@ "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -13239,11 +12894,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sirv": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", @@ -13493,16 +13143,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/rspack/rspack-project-source/package.json b/examples/rspack/rspack-project-source/package.json index 127b2d94c7..615515febd 100644 --- a/examples/rspack/rspack-project-source/package.json +++ b/examples/rspack/rspack-project-source/package.json @@ -18,8 +18,7 @@ "license": "Apache-2.0", "devDependencies": { "@rspack/cli": "^1.1.5", - "@rspack/core": "^1.1.5", - "svg-inline-loader": "^0.8.2" + "@rspack/core": "^1.1.5" }, "type": "module" } diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index e89e5092aa..4ce8cdcdc4 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -23,7 +23,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", diff --git a/examples/vite/vite-project-built/vite.config.ts b/examples/vite/vite-project-built/vite.config.ts index b8be9b45a4..1ae991fa49 100644 --- a/examples/vite/vite-project-built/vite.config.ts +++ b/examples/vite/vite-project-built/vite.config.ts @@ -23,8 +23,28 @@ export default defineConfig({ fs: { // Allow serving files from parent neuroglancer project, due to the local // path reference. This would not be needed for projects that depend on - // Neuroglancer normally. + // Neuroglancer normally, or when using pnpm rather than npm. allow: ["../../.."], }, }, + optimizeDeps: { + // Neuroglancer is incompatible with Vite's optimizeDeps step used for the + // dev server due to its use of `new URL` syntax (not supported by esbuild). + exclude: ["neuroglancer"], + // Some of Neuroglancer's dependencies are CommonJS modules for which the + // optimizeDeps step is mandatory. + // + // There does not seem to be a way to avoid having to specify all of these + // explicitly. + include: [ + "neuroglancer > codemirror", + "neuroglancer > codemirror/mode/javascript/javascript.js", + "neuroglancer > codemirror/addon/fold/foldcode.js", + "neuroglancer > codemirror/addon/fold/foldgutter.js", + "neuroglancer > codemirror/addon/fold/brace-fold.js", + "neuroglancer > codemirror/addon/lint/lint.js", + "neuroglancer > core-js/actual/symbol/dispose.js", + "neuroglancer > core-js/actual/symbol/async-dispose.js", + ], + }, }); diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index e9a3982270..b9561fd2cc 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -22,7 +22,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -1554,27 +1553,6 @@ "node": ">=8" } }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" @@ -1620,16 +1598,12 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", @@ -1944,19 +1918,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -1981,12 +1942,9 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "../../../node_modules/crc-32": { @@ -2462,6 +2420,7 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -2576,10 +2535,6 @@ "optional": true, "peer": true }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" @@ -2758,6 +2713,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -3069,6 +3025,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3081,13 +3038,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -3214,27 +3164,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -3538,6 +3467,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3835,23 +3765,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -3945,13 +3858,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -4017,6 +3923,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4444,12 +4351,9 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, "../../../node_modules/internal-slot": { "version": "1.0.6", "dev": true, @@ -4536,6 +4440,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -4764,6 +4669,7 @@ }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -5245,20 +5151,6 @@ "node": ">=12" } }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -5327,6 +5219,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5779,6 +5672,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -6006,6 +5900,7 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "../../../node_modules/progress": { @@ -6209,26 +6104,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -6246,6 +6121,7 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -6259,10 +6135,12 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/readdir-glob": { @@ -6408,6 +6286,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -6784,10 +6663,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -6960,132 +6835,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -7109,6 +6858,7 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -7116,6 +6866,7 @@ }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/string-width": { @@ -7295,6 +7046,7 @@ }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7409,32 +7161,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -7711,10 +7437,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -7868,6 +7590,7 @@ }, "../../../node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "../../../node_modules/uuid": { @@ -8092,10 +7815,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -8623,13 +8342,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, diff --git a/examples/vite/vite-project-source/vite.config.ts b/examples/vite/vite-project-source/vite.config.ts index b8be9b45a4..2ae4893af1 100644 --- a/examples/vite/vite-project-source/vite.config.ts +++ b/examples/vite/vite-project-source/vite.config.ts @@ -11,6 +11,10 @@ export default defineConfig({ "neuroglancer/datasource/precomputed:enabled", ], }, + esbuild: { + // Needed to acommodate decorator usage in Neuroglancer TypeScript sources. + target: "es2022", + }, worker: { // Required due to use of dynamic imports in Neuroglancer. format: "es", @@ -23,8 +27,28 @@ export default defineConfig({ fs: { // Allow serving files from parent neuroglancer project, due to the local // path reference. This would not be needed for projects that depend on - // Neuroglancer normally. + // Neuroglancer normally, or when using pnpm rather than npm. allow: ["../../.."], }, }, + optimizeDeps: { + // Neuroglancer is incompatible with Vite's optimizeDeps step used for the + // dev server due to its use of `new URL` syntax (not supported by esbuild). + exclude: ["neuroglancer"], + // Some of Neuroglancer's dependencies are CommonJS modules for which the + // optimizeDeps step is mandatory. + // + // There does not seem to be a way to avoid having to specify all of these + // explicitly. + include: [ + "neuroglancer > codemirror", + "neuroglancer > codemirror/mode/javascript/javascript.js", + "neuroglancer > codemirror/addon/fold/foldcode.js", + "neuroglancer > codemirror/addon/fold/foldgutter.js", + "neuroglancer > codemirror/addon/fold/brace-fold.js", + "neuroglancer > codemirror/addon/lint/lint.js", + "neuroglancer > core-js/actual/symbol/dispose.js", + "neuroglancer > core-js/actual/symbol/async-dispose.js", + ], + }, }); diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index ae56c53956..fa88b0bb71 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -15,7 +15,6 @@ "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" @@ -29,7 +28,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -736,14 +734,6 @@ "dev": true, "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -1350,14 +1340,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "dev": true, @@ -2308,17 +2290,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -2344,19 +2315,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -2506,14 +2464,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -2625,14 +2575,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -3439,11 +3381,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sockjs": { "version": "0.3.24", "dev": true, @@ -3697,16 +3634,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/webpack/webpack-project-built/package.json b/examples/webpack/webpack-project-built/package.json index 8daf28813b..a56db8a6ec 100644 --- a/examples/webpack/webpack-project-built/package.json +++ b/examples/webpack/webpack-project-built/package.json @@ -20,7 +20,6 @@ "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 8efbe2fb5e..39f771cc94 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -16,7 +16,6 @@ "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" @@ -29,7 +28,6 @@ "codemirror": "^5.61.1", "core-js": "^3.39.0", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", @@ -2097,27 +2095,6 @@ "node": ">=8" } }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" @@ -2163,16 +2140,12 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", @@ -2487,19 +2460,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -2524,12 +2484,9 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", + "dev": true, "license": "MIT" }, "../../../node_modules/crc-32": { @@ -3005,6 +2962,7 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -3119,10 +3077,6 @@ "optional": true, "peer": true }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" @@ -3653,6 +3607,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -3964,6 +3919,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3976,13 +3932,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -4109,27 +4058,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -4447,6 +4375,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4744,23 +4673,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -4854,13 +4766,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -4926,6 +4831,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5353,12 +5259,9 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, "../../../node_modules/internal-slot": { "version": "1.0.6", "dev": true, @@ -5445,6 +5348,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -5673,6 +5577,7 @@ }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -6154,20 +6059,6 @@ "node": ">=12" } }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -6236,6 +6127,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6688,6 +6580,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -6917,6 +6810,7 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "../../../node_modules/progress": { @@ -7120,26 +7014,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -7157,6 +7031,7 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -7170,10 +7045,12 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/readdir-glob": { @@ -7319,6 +7196,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7699,10 +7577,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -7876,132 +7750,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -8025,6 +7773,7 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8032,6 +7781,7 @@ }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "dev": true, "license": "MIT" }, "../../../node_modules/string-width": { @@ -8211,6 +7961,7 @@ }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8325,32 +8076,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, "../../../node_modules/tinybench": { "version": "2.6.0", "dev": true, @@ -8979,10 +8704,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -9136,6 +8857,7 @@ }, "../../../node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "../../../node_modules/uuid": { @@ -9363,10 +9085,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -9894,13 +9612,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -12717,17 +12428,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -12753,19 +12453,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -12912,14 +12599,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -13031,14 +12710,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -13865,11 +13536,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sockjs": { "version": "0.3.24", "dev": true, @@ -14128,16 +13794,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/webpack/webpack-project-source/package.json b/examples/webpack/webpack-project-source/package.json index 3be4ac1393..910d2524ea 100644 --- a/examples/webpack/webpack-project-source/package.json +++ b/examples/webpack/webpack-project-source/package.json @@ -19,7 +19,6 @@ "devDependencies": { "css-loader": "^7.1.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", "webpack": "^5.93.0", diff --git a/package.json b/package.json index 0261183b82..235bf26fbb 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,9 @@ "@puppeteer/browsers": ">=2" }, "files": [ - "lib/**/*" + "src/**/*", + "typings/**/*", + "tsconfig.json" ], "private": true, "type": "module", From 5898236dbc127b46ea280fc75c9e37bcee03a49b Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 19 Dec 2024 12:30:22 -0800 Subject: [PATCH 29/41] chore(nguath_server): update deps --- ngauth_server/.gitignore | 1 + ngauth_server/go.mod | 6 +++--- ngauth_server/go.sum | 12 ++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ngauth_server/.gitignore b/ngauth_server/.gitignore index 6ea7ac4955..56c6e9f6d7 100644 --- a/ngauth_server/.gitignore +++ b/ngauth_server/.gitignore @@ -1,2 +1,3 @@ .envrc /secrets +/ngauth diff --git a/ngauth_server/go.mod b/ngauth_server/go.mod index 600017f987..a9b29cac17 100644 --- a/ngauth_server/go.mod +++ b/ngauth_server/go.mod @@ -22,9 +22,9 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/grpc v1.56.3 // indirect ) diff --git a/ngauth_server/go.sum b/ngauth_server/go.sum index 54f4b5e72d..dc233604da 100644 --- a/ngauth_server/go.sum +++ b/ngauth_server/go.sum @@ -79,8 +79,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= @@ -91,13 +91,13 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= From 9d3a6180f4652560fd12a2761e32144afb3bd7f3 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 19 Dec 2024 21:12:07 -0800 Subject: [PATCH 30/41] Revamp file-based data access - New datasource URL syntax based on ZEP 8 proposal (https://github.com/zarr-developers/zeps/pull/48) - Support for ZIP archives --- .github/workflows/build.yml | 14 +- .github/workflows/build_preview.yml | 2 +- .prettierignore | 5 +- build_tools/build-package.ts | 1 + build_tools/update-conditions.ts | 164 +- build_tools/vitest/build_fake_gcs_server.ts | 57 + build_tools/vitest/fake_ngauth_server.ts | 98 + .../polyfill-browser-globals-in-node.ts | 16 + build_tools/vitest/setup-crypto.ts | 7 - build_tools/vitest/test_data_server.ts | 51 + eslint.config.js | 1 + .../parcel-project-built/package-lock.json | 5 +- .../parcel-project-source/package-lock.json | 590 ++- .../rsbuild-project-built/package-lock.json | 5 +- .../rsbuild-project-source/package-lock.json | 590 ++- .../rspack-project-built/package-lock.json | 5 +- .../rspack-project-source/package-lock.json | 590 ++- .../vite/vite-project-built/package-lock.json | 5 +- .../vite-project-source/package-lock.json | 590 ++- .../webpack-project-built/package-lock.json | 5 +- .../webpack-project-source/package-lock.json | 590 ++- package-lock.json | 4234 +++++++++++------ package.json | 227 +- pyproject.toml | 1 + python/neuroglancer/write_annotations.py | 4 +- python/tests/on_demand_mesh_generator_test.py | 2 +- python/tests/zarr_test.py | 4 +- setup.py | 2 +- src/annotation/backend.ts | 12 +- src/async_computation/request.ts | 12 +- src/chunk_manager/backend.ts | 11 +- src/chunk_manager/frontend.ts | 21 +- src/chunk_manager/generic_file_source.ts | 306 +- src/chunk_worker.bundle.js | 2 + src/credentials_provider/default_manager.ts | 22 +- src/credentials_provider/http_request.ts | 36 +- src/credentials_provider/index.ts | 80 +- .../interactive_credentials_provider.ts | 7 +- src/credentials_provider/oauth2.ts | 83 +- src/credentials_provider/shared.ts | 58 +- src/credentials_provider/shared_common.ts | 2 + .../shared_counterpart.ts | 72 +- src/data_management_context.ts | 79 + src/datasource/boss/api.ts | 4 +- src/datasource/boss/backend.ts | 14 +- src/datasource/boss/credentials_provider.ts | 24 +- src/datasource/boss/frontend.ts | 118 +- .../boss/register_credentials_provider.ts | 4 +- src/datasource/boss/register_default.ts | 5 +- src/datasource/brainmaps/api.ts | 23 +- src/datasource/brainmaps/backend.ts | 182 +- src/datasource/brainmaps/frontend.ts | 283 +- .../register_credentials_provider.ts | 4 +- src/datasource/brainmaps/register_default.ts | 19 +- src/datasource/deepzoom/backend.ts | 143 +- src/datasource/deepzoom/frontend.ts | 165 +- src/datasource/deepzoom/register_default.ts | 17 +- src/datasource/default_provider.ts | 53 +- src/datasource/dvid/api.ts | 4 +- src/datasource/dvid/backend.ts | 14 +- src/datasource/dvid/credentials_provider.ts | 16 +- src/datasource/dvid/frontend.ts | 65 +- .../dvid/register_credentials_provider.ts | 4 +- src/datasource/dvid/register_default.ts | 5 +- src/datasource/enabled_frontend_modules.ts | 3 +- src/datasource/graphene/backend.ts | 216 +- src/datasource/graphene/base.ts | 14 + src/datasource/graphene/frontend.ts | 355 +- src/datasource/graphene/register_default.ts | 5 +- src/datasource/index.ts | 673 ++- src/datasource/kvstore_completions.ts | 141 + src/datasource/local.ts | 132 + src/datasource/n5/backend.ts | 54 +- src/datasource/n5/frontend.ts | 435 +- src/datasource/n5/register_default.ts | 17 +- src/datasource/nggraph/frontend.ts | 49 +- src/datasource/nggraph/register_default.ts | 2 +- src/datasource/nifti/backend.ts | 347 +- src/datasource/nifti/frontend.ts | 148 +- src/datasource/nifti/register_default.ts | 17 +- src/datasource/obj/backend.ts | 28 +- src/datasource/obj/frontend.ts | 34 +- src/datasource/obj/register_default.ts | 10 +- src/datasource/precomputed/backend.ts | 657 +-- src/datasource/precomputed/frontend.ts | 560 ++- .../precomputed/register_default.ts | 16 +- src/datasource/precomputed/sharded.ts | 312 ++ src/datasource/python/backend.ts | 14 +- src/datasource/python/frontend.ts | 50 +- src/datasource/python/register_default.ts | 20 + src/datasource/render/backend.ts | 20 +- src/datasource/render/frontend.ts | 70 +- src/datasource/render/register_default.ts | 2 +- src/datasource/state_share.ts | 34 +- src/datasource/vtk/backend.ts | 69 +- src/datasource/vtk/frontend.ts | 33 +- src/datasource/vtk/register_default.ts | 10 +- src/datasource/zarr/backend.ts | 23 +- src/datasource/zarr/codec/blosc/decode.ts | 4 +- src/datasource/zarr/codec/bytes/decode.ts | 4 +- src/datasource/zarr/codec/crc32c/decode.ts | 8 +- src/datasource/zarr/codec/decode.ts | 24 +- src/datasource/zarr/codec/gzip/decode.ts | 8 +- .../zarr/codec/sharding_indexed/decode.ts | 177 +- .../zarr/codec/sharding_indexed/resolve.ts | 5 +- src/datasource/zarr/codec/transpose/decode.ts | 4 +- src/datasource/zarr/codec/zstd/decode.ts | 4 +- src/datasource/zarr/frontend.ts | 259 +- src/datasource/zarr/ome.ts | 2 +- src/datasource/zarr/register_default.ts | 26 +- src/kvstore/auto_detect.ts | 332 ++ src/kvstore/backend.ts | 147 + src/kvstore/byte_range/file_handle.ts | 94 + src/kvstore/byte_range/index.ts | 75 + src/kvstore/byte_range/register.ts | 41 + src/kvstore/chunk_source_frontend.ts | 55 + src/kvstore/context.ts | 138 + src/kvstore/enabled_backend_modules.ts | 9 + src/kvstore/enabled_frontend_modules.ts | 11 + src/kvstore/frontend.ts | 151 + src/kvstore/gcs/index.ts | 150 + src/kvstore/gcs/register.ts | 45 + src/kvstore/gzip/file_handle.ts | 235 + src/kvstore/gzip/index.ts | 96 + src/kvstore/gzip/register.ts | 50 + src/kvstore/http/html_directory_listing.ts | 114 + src/kvstore/http/index.ts | 95 + src/kvstore/http/read.ts | 282 ++ src/kvstore/http/register.ts | 49 + src/kvstore/index.ts | 255 +- .../middleauth/credentials_provider.ts | 37 +- src/kvstore/middleauth/register.ts | 74 + .../register_credentials_provider.ts | 10 +- src/{datasource => kvstore}/ngauth/README.md | 0 .../ngauth/credentials_provider.ts | 72 +- src/kvstore/ngauth/register.ts | 84 + .../ngauth/register_credentials_provider.ts | 8 +- src/kvstore/register.ts | 74 + src/kvstore/s3/index.ts | 78 + src/kvstore/s3/list.ts | 77 + src/kvstore/s3/register.ts | 46 + src/kvstore/shared_common.ts | 21 + src/kvstore/special/index.ts | 175 - src/kvstore/url.ts | 200 + src/kvstore/zip/auto_detect.ts | 46 + src/kvstore/zip/backend.ts | 255 + src/kvstore/zip/frontend.ts | 40 + src/kvstore/zip/metadata.ts | 658 +++ src/kvstore/zip/register_backend.ts | 43 + src/kvstore/zip/register_frontend.ts | 46 + src/layer/annotation/index.ts | 2 +- src/layer/index.ts | 6 +- src/layer/layer_data_source.ts | 28 +- src/layer/segmentation/index.ts | 2 +- src/main.bundle.js | 1 + src/main_module.ts | 2 + src/main_python.ts | 28 +- src/mesh/backend.ts | 15 +- src/python_integration/prefetch.ts | 10 +- src/python_integration/volume.ts | 4 +- src/single_mesh/backend.ts | 128 +- src/single_mesh/frontend.ts | 68 +- src/sliceview/backend.ts | 4 +- .../backend_chunk_decoders/bossNpz.ts | 4 +- .../compressed_segmentation.ts | 4 +- .../backend_chunk_decoders/compresso.ts | 6 +- src/sliceview/backend_chunk_decoders/index.ts | 2 +- src/sliceview/backend_chunk_decoders/jpeg.ts | 6 +- src/sliceview/backend_chunk_decoders/jxl.ts | 6 +- .../backend_chunk_decoders/ndstoreNpz.ts | 4 +- src/sliceview/backend_chunk_decoders/png.ts | 6 +- .../backend_chunk_decoders/postprocess.ts | 6 +- src/sliceview/backend_chunk_decoders/raw.ts | 6 +- .../encode.benchmark.ts | 7 +- src/sliceview/frontend.ts | 5 +- src/status.css | 1 + src/status.ts | 10 + src/ui/default_viewer_setup.ts | 2 +- src/ui/layer_data_sources_tab.css | 10 + src/ui/layer_data_sources_tab.ts | 78 +- src/ui/url_hash_binding.ts | 17 +- src/util/abort.ts | 30 +- src/util/array.ts | 10 +- src/util/byte_range_http_requests.ts | 43 - src/util/completion.ts | 6 + src/util/error.ts | 16 + src/util/gcs_bucket_listing.ts | 88 - src/util/google_oauth2.ts | 30 +- src/util/gzip.ts | 29 +- src/util/hash.ts | 53 + src/util/http_path_completion.ts | 195 - src/util/http_request.ts | 43 +- src/util/memoize.ts | 106 + src/util/npy.spec.ts | 2 + src/util/progress_listener.ts | 177 + src/util/s3.ts | 42 - src/util/s3_bucket_listing.ts | 88 - src/util/special_protocol_request.ts | 176 - src/util/uint64.ts | 4 + src/util/zorder.spec.ts | 8 +- src/util/zorder.ts | 72 +- src/viewer.ts | 96 +- src/webgl/context.ts | 10 +- src/widget/multiline_autocomplete.css | 23 +- src/widget/multiline_autocomplete.ts | 146 +- src/widget/progress_listener.ts | 47 + src/worker_rpc.ts | 99 +- .../64x64x64-raw-uint64-segmentation.dat | Bin .../compressed_segmentation}/README.md | 0 .../{ => codec/npy}/generate_npy_examples.py | 0 .../{ => codec/npy}/npy_test.float32-be.npy | Bin .../{ => codec/npy}/npy_test.float32-le.npy | Bin .../{ => codec/npy}/npy_test.float32.json | 0 .../{ => codec/npy}/npy_test.uint16-be.npy | Bin .../{ => codec/npy}/npy_test.uint16-le.npy | Bin testdata/{ => codec/npy}/npy_test.uint16.json | 0 .../{ => codec/npy}/npy_test.uint32-be.npy | Bin .../{ => codec/npy}/npy_test.uint32-le.npy | Bin testdata/{ => codec/npy}/npy_test.uint32.json | 0 .../{ => codec/npy}/npy_test.uint64-be.npy | Bin .../{ => codec/npy}/npy_test.uint64-le.npy | Bin testdata/{ => codec/npy}/npy_test.uint64.json | 0 testdata/{ => codec/npy}/npy_test.uint8.json | 0 testdata/{ => codec/npy}/npy_test.uint8.npy | Bin .../deepzoom/14122_mPPC_BDA_s186.dzi | 4 + testdata/datasource/n5/generate_n5.py | 69 + .../attributes.json | 1 + .../s0/attributes.json | 1 + .../s1/attributes.json | 1 + .../s2/attributes.json | 1 + .../attributes.json | 1 + .../s0/attributes.json | 1 + .../s1/attributes.json | 1 + .../s2/attributes.json | 1 + testdata/datasource/nifti/README.md | 35 + .../datasource/nifti/example_nifti2.nii.gz | Bin 0 -> 21160 bytes testdata/datasource/nifti/standard.nii | Bin 0 -> 492 bytes testdata/datasource/nifti/standard.nii.gz | Bin 0 -> 143 bytes .../precomputed/generate_precomputed.py | 46 + .../datasource/precomputed/one_channel/info | 1 + .../datasource/precomputed/two_channels/info | 1 + .../zarr/ome_zarr/generate_ome_zarr.py | 57 + .../datasource/zarr/ome_zarr/simple_0.4.zip | Bin 0 -> 8237 bytes .../zarr/ome_zarr/simple_0.4/.zattrs | 80 + .../zarr/ome_zarr/simple_0.4/.zgroup | 3 + .../zarr/ome_zarr/simple_0.4/.zmetadata | 202 + .../zarr/ome_zarr/simple_0.4/scale0/.zattrs | 6 + .../zarr/ome_zarr/simple_0.4/scale0/.zgroup | 3 + .../ome_zarr/simple_0.4/scale0/image/.zarray | 1 + .../zarr/ome_zarr/simple_0.4/scale0/image/0/0 | Bin 0 -> 140 bytes .../zarr/ome_zarr/simple_0.4/scale1/.zattrs | 6 + .../zarr/ome_zarr/simple_0.4/scale1/.zgroup | 3 + .../ome_zarr/simple_0.4/scale1/image/.zarray | 1 + .../zarr/ome_zarr/simple_0.4/scale1/image/0/0 | Bin 0 -> 66 bytes .../zarr/ome_zarr/simple_0.4/scale2/.zattrs | 6 + .../zarr/ome_zarr/simple_0.4/scale2/.zgroup | 3 + .../ome_zarr/simple_0.4/scale2/image/.zarray | 1 + .../zarr/ome_zarr/simple_0.4/scale2/image/0/0 | Bin 0 -> 24 bytes .../ome_zarr/simple_0.5/scale0/image/c/0/0 | Bin 0 -> 200 bytes .../simple_0.5/scale0/image/zarr.json | 1 + .../zarr/ome_zarr/simple_0.5/scale0/zarr.json | 11 + .../ome_zarr/simple_0.5/scale1/image/c/0/0 | Bin 0 -> 50 bytes .../simple_0.5/scale1/image/zarr.json | 1 + .../zarr/ome_zarr/simple_0.5/scale1/zarr.json | 11 + .../ome_zarr/simple_0.5/scale2/image/c/0/0 | Bin 0 -> 8 bytes .../simple_0.5/scale2/image/zarr.json | 1 + .../zarr/ome_zarr/simple_0.5/scale2/zarr.json | 11 + .../zarr/ome_zarr/simple_0.5/zarr.json | 254 + .../from_zarr-python/data.zarr/.zattrs | 0 .../from_zarr-python/data.zarr/.zgroup | 0 .../from_zarr-python/data.zarr/.zmetadata | 0 .../data.zarr/1d.chunked.i2/.zarray | 0 .../data.zarr/1d.chunked.i2/0 | Bin .../data.zarr/1d.chunked.i2/1 | Bin .../data.zarr/1d.chunked.ragged.i2/.zarray | 0 .../data.zarr/1d.chunked.ragged.i2/0 | Bin .../data.zarr/1d.chunked.ragged.i2/1 | Bin .../data.zarr/1d.chunked.ragged.i2/2 | Bin .../data.zarr/1d.contiguous.S7/.zarray | 0 .../data.zarr/1d.contiguous.S7/0 | Bin .../data.zarr/1d.contiguous.U13.be/.zarray | 0 .../data.zarr/1d.contiguous.U13.be/0 | Bin .../data.zarr/1d.contiguous.U13.le/.zarray | 0 .../data.zarr/1d.contiguous.U13.le/0 | Bin .../data.zarr/1d.contiguous.U7/.zarray | 0 .../data.zarr/1d.contiguous.U7/0 | Bin .../data.zarr/1d.contiguous.b1/.zarray | 0 .../data.zarr/1d.contiguous.b1/0 | Bin .../data.zarr/1d.contiguous.blosc.i2/.zarray | 0 .../data.zarr/1d.contiguous.blosc.i2/0 | Bin .../data.zarr/1d.contiguous.f4.be/.zarray | 0 .../data.zarr/1d.contiguous.f4.be/0 | Bin .../data.zarr/1d.contiguous.f4.le/.zarray | 0 .../data.zarr/1d.contiguous.f4.le/0 | Bin .../data.zarr/1d.contiguous.f8/.zarray | 0 .../data.zarr/1d.contiguous.f8/0 | Bin .../data.zarr/1d.contiguous.i4/.zarray | 0 .../data.zarr/1d.contiguous.i4/0 | Bin .../data.zarr/1d.contiguous.lz4.i2/.zarray | 0 .../data.zarr/1d.contiguous.lz4.i2/0 | Bin .../data.zarr/1d.contiguous.raw.i2/.zarray | 0 .../data.zarr/1d.contiguous.raw.i2/0 | Bin .../data.zarr/1d.contiguous.u1/.zarray | 0 .../data.zarr/1d.contiguous.u1/0 | Bin .../data.zarr/1d.contiguous.zlib.i2/.zarray | 0 .../data.zarr/1d.contiguous.zlib.i2/0 | Bin .../data.zarr/1d.contiguous.zstd.i2/.zarray | 0 .../data.zarr/1d.contiguous.zstd.i2/0 | Bin .../data.zarr/2d.chunked.U7/.zarray | 0 .../data.zarr/2d.chunked.U7/0.0 | Bin .../data.zarr/2d.chunked.U7/0.1 | Bin .../data.zarr/2d.chunked.U7/1.0 | Bin .../data.zarr/2d.chunked.U7/1.1 | Bin .../data.zarr/2d.chunked.i2/.zarray | 0 .../data.zarr/2d.chunked.i2/0.0 | Bin .../data.zarr/2d.chunked.i2/0.1 | Bin .../data.zarr/2d.chunked.i2/1.0 | Bin .../data.zarr/2d.chunked.i2/1.1 | Bin .../data.zarr/2d.chunked.ragged.i2/.zarray | 0 .../data.zarr/2d.chunked.ragged.i2/0.0 | Bin .../data.zarr/2d.chunked.ragged.i2/0.1 | Bin .../data.zarr/2d.chunked.ragged.i2/1.0 | Bin .../data.zarr/2d.chunked.ragged.i2/1.1 | Bin .../data.zarr/2d.contiguous.i2/.zarray | 0 .../data.zarr/2d.contiguous.i2/0.0 | Bin .../data.zarr/3d.chunked.O/.zarray | 0 .../data.zarr/3d.chunked.O/0.0.0 | Bin .../data.zarr/3d.chunked.O/0.1.0 | Bin .../data.zarr/3d.chunked.O/1.0.0 | Bin .../data.zarr/3d.chunked.O/1.1.0 | Bin .../data.zarr/3d.chunked.i2/.zarray | 0 .../data.zarr/3d.chunked.i2/0.0.0 | Bin .../data.zarr/3d.chunked.i2/0.0.1 | Bin .../data.zarr/3d.chunked.i2/0.0.2 | Bin .../data.zarr/3d.chunked.i2/0.1.0 | Bin .../data.zarr/3d.chunked.i2/0.1.1 | Bin .../data.zarr/3d.chunked.i2/0.1.2 | Bin .../data.zarr/3d.chunked.i2/0.2.0 | Bin .../data.zarr/3d.chunked.i2/0.2.1 | Bin .../data.zarr/3d.chunked.i2/0.2.2 | Bin .../data.zarr/3d.chunked.i2/1.0.0 | Bin .../data.zarr/3d.chunked.i2/1.0.1 | Bin .../data.zarr/3d.chunked.i2/1.0.2 | Bin .../data.zarr/3d.chunked.i2/1.1.0 | Bin .../data.zarr/3d.chunked.i2/1.1.1 | Bin .../data.zarr/3d.chunked.i2/1.1.2 | Bin .../data.zarr/3d.chunked.i2/1.2.0 | Bin .../data.zarr/3d.chunked.i2/1.2.1 | Bin .../data.zarr/3d.chunked.i2/1.2.2 | Bin .../data.zarr/3d.chunked.i2/2.0.0 | Bin .../data.zarr/3d.chunked.i2/2.0.1 | Bin .../data.zarr/3d.chunked.i2/2.0.2 | Bin .../data.zarr/3d.chunked.i2/2.1.0 | Bin .../data.zarr/3d.chunked.i2/2.1.1 | Bin .../data.zarr/3d.chunked.i2/2.1.2 | Bin .../data.zarr/3d.chunked.i2/2.2.0 | Bin .../data.zarr/3d.chunked.i2/2.2.1 | Bin .../data.zarr/3d.chunked.i2/2.2.2 | Bin .../data.zarr/3d.chunked.mixed.i2.C/.zarray | 0 .../data.zarr/3d.chunked.mixed.i2.C/0.0.0 | Bin .../data.zarr/3d.chunked.mixed.i2.C/0.0.1 | Bin .../data.zarr/3d.chunked.mixed.i2.C/0.0.2 | Bin .../data.zarr/3d.chunked.mixed.i2.F/.zarray | 0 .../data.zarr/3d.chunked.mixed.i2.F/0.0.0 | Bin .../data.zarr/3d.chunked.mixed.i2.F/0.0.1 | Bin .../data.zarr/3d.chunked.mixed.i2.F/0.0.2 | Bin .../data.zarr/3d.contiguous.i2/.zarray | 0 .../data.zarr/3d.contiguous.i2/0.0.0 | Bin .../zarr_v2/from_zarr-python/generate-v2.py | 0 .../zarr/zarr_v3/examples/generate_zarr_v3.py | 31 + .../zarr/zarr_v3/examples/single_res/c/0/0 | Bin 0 -> 40 bytes .../zarr/zarr_v3/examples/single_res/c/0/1 | Bin 0 -> 40 bytes .../zarr/zarr_v3/examples/single_res/c/1/0 | Bin 0 -> 40 bytes .../zarr/zarr_v3/examples/single_res/c/1/1 | Bin 0 -> 40 bytes .../zarr_v3/examples/single_res/zarr.json | 1 + .../1d.chunked.compressed.sharded.i2/c/0 | Bin .../1d.chunked.compressed.sharded.i2/c/1 | Bin .../zarr.json | 0 .../c/0 | Bin .../zarr.json | 0 .../from_zarrita/data.zarr/1d.chunked.i2/c/0 | Bin .../from_zarrita/data.zarr/1d.chunked.i2/c/1 | Bin .../data.zarr/1d.chunked.i2/zarr.json | 0 .../data.zarr/1d.chunked.ragged.i2/c/0 | Bin .../data.zarr/1d.chunked.ragged.i2/c/1 | Bin .../data.zarr/1d.chunked.ragged.i2/c/2 | Bin .../data.zarr/1d.chunked.ragged.i2/zarr.json | 0 .../data.zarr/1d.contiguous.b1/c/0 | Bin .../data.zarr/1d.contiguous.b1/zarr.json | 0 .../data.zarr/1d.contiguous.blosc.i2/c/0 | Bin .../1d.contiguous.blosc.i2/zarr.json | 0 .../1d.contiguous.compressed.sharded.b1/c/0 | Bin .../zarr.json | 0 .../1d.contiguous.compressed.sharded.f4/c/0 | Bin .../zarr.json | 0 .../1d.contiguous.compressed.sharded.f8/c/0 | Bin .../zarr.json | 0 .../1d.contiguous.compressed.sharded.i2/c/0 | Bin .../zarr.json | 0 .../1d.contiguous.compressed.sharded.i4/c/0 | Bin .../zarr.json | 0 .../1d.contiguous.compressed.sharded.u1/c/0 | Bin .../zarr.json | 0 .../data.zarr/1d.contiguous.f4.be/c/0 | Bin .../data.zarr/1d.contiguous.f4.be/zarr.json | 0 .../data.zarr/1d.contiguous.f4.le/c/0 | Bin .../data.zarr/1d.contiguous.f4.le/zarr.json | 0 .../data.zarr/1d.contiguous.f8/c/0 | Bin .../data.zarr/1d.contiguous.f8/zarr.json | 0 .../data.zarr/1d.contiguous.gzip.i2/c/0 | Bin .../data.zarr/1d.contiguous.gzip.i2/zarr.json | 0 .../data.zarr/1d.contiguous.i4/c/0 | Bin .../data.zarr/1d.contiguous.i4/zarr.json | 0 .../data.zarr/1d.contiguous.raw.i2/c/0 | Bin .../data.zarr/1d.contiguous.raw.i2/zarr.json | 0 .../data.zarr/1d.contiguous.u1/c/0 | Bin .../data.zarr/1d.contiguous.u1/zarr.json | 0 .../c/0/0 | Bin .../c/0/1 | Bin .../c/1/0 | Bin .../c/1/1 | Bin .../zarr.json | 0 .../2d.chunked.compressed.sharded.i2/c/0/0 | Bin .../2d.chunked.compressed.sharded.i2/c/0/1 | Bin .../2d.chunked.compressed.sharded.i2/c/1/0 | Bin .../2d.chunked.compressed.sharded.i2/c/1/1 | Bin .../zarr.json | 0 .../data.zarr/2d.chunked.i2/c/0/0 | Bin .../data.zarr/2d.chunked.i2/c/0/1 | Bin .../data.zarr/2d.chunked.i2/c/1/0 | Bin .../data.zarr/2d.chunked.i2/c/1/1 | Bin .../data.zarr/2d.chunked.i2/zarr.json | 0 .../c/0/0 | Bin .../c/0/1 | Bin .../c/1/0 | Bin .../c/1/1 | Bin .../zarr.json | 0 .../data.zarr/2d.chunked.ragged.i2/c/0/0 | Bin .../data.zarr/2d.chunked.ragged.i2/c/0/1 | Bin .../data.zarr/2d.chunked.ragged.i2/c/1/0 | Bin .../data.zarr/2d.chunked.ragged.i2/c/1/1 | Bin .../data.zarr/2d.chunked.ragged.i2/zarr.json | 0 .../2d.contiguous.compressed.sharded.i2/c/0/0 | Bin .../zarr.json | 0 .../data.zarr/2d.contiguous.i2/c/0/0 | Bin .../data.zarr/2d.contiguous.i2/zarr.json | 0 .../3d.chunked.compressed.sharded.i2/c/0/0/0 | Bin .../3d.chunked.compressed.sharded.i2/c/0/0/1 | Bin .../3d.chunked.compressed.sharded.i2/c/0/1/0 | Bin .../3d.chunked.compressed.sharded.i2/c/0/1/1 | Bin .../3d.chunked.compressed.sharded.i2/c/1/0/0 | Bin .../3d.chunked.compressed.sharded.i2/c/1/0/1 | Bin .../3d.chunked.compressed.sharded.i2/c/1/1/0 | Bin .../3d.chunked.compressed.sharded.i2/c/1/1/1 | Bin .../zarr.json | 0 .../data.zarr/3d.chunked.i2/c/0/0/1 | Bin .../data.zarr/3d.chunked.i2/c/0/0/2 | Bin .../data.zarr/3d.chunked.i2/c/0/1/0 | Bin .../data.zarr/3d.chunked.i2/c/0/1/1 | Bin .../data.zarr/3d.chunked.i2/c/0/1/2 | Bin .../data.zarr/3d.chunked.i2/c/0/2/0 | Bin .../data.zarr/3d.chunked.i2/c/0/2/1 | Bin .../data.zarr/3d.chunked.i2/c/0/2/2 | Bin .../data.zarr/3d.chunked.i2/c/1/0/0 | Bin .../data.zarr/3d.chunked.i2/c/1/0/1 | Bin .../data.zarr/3d.chunked.i2/c/1/0/2 | Bin .../data.zarr/3d.chunked.i2/c/1/1/0 | Bin .../data.zarr/3d.chunked.i2/c/1/1/1 | Bin .../data.zarr/3d.chunked.i2/c/1/1/2 | Bin .../data.zarr/3d.chunked.i2/c/1/2/0 | Bin .../data.zarr/3d.chunked.i2/c/1/2/1 | Bin .../data.zarr/3d.chunked.i2/c/1/2/2 | Bin .../data.zarr/3d.chunked.i2/c/2/0/0 | Bin .../data.zarr/3d.chunked.i2/c/2/0/1 | Bin .../data.zarr/3d.chunked.i2/c/2/0/2 | Bin .../data.zarr/3d.chunked.i2/c/2/1/0 | Bin .../data.zarr/3d.chunked.i2/c/2/1/1 | Bin .../data.zarr/3d.chunked.i2/c/2/1/2 | Bin .../data.zarr/3d.chunked.i2/c/2/2/0 | Bin .../data.zarr/3d.chunked.i2/c/2/2/1 | Bin .../data.zarr/3d.chunked.i2/c/2/2/2 | Bin .../data.zarr/3d.chunked.i2/zarr.json | 0 .../c/0/0/0 | Bin .../zarr.json | 0 .../data.zarr/3d.chunked.mixed.i2.C/c/0/0/0 | Bin .../data.zarr/3d.chunked.mixed.i2.C/c/0/0/1 | Bin .../data.zarr/3d.chunked.mixed.i2.C/c/0/0/2 | Bin .../data.zarr/3d.chunked.mixed.i2.C/zarr.json | 0 .../data.zarr/3d.chunked.mixed.i2.F/c/0/0/0 | Bin .../data.zarr/3d.chunked.mixed.i2.F/c/0/0/1 | Bin .../data.zarr/3d.chunked.mixed.i2.F/c/0/0/2 | Bin .../data.zarr/3d.chunked.mixed.i2.F/zarr.json | 0 .../c/0/0/0 | Bin .../zarr.json | 0 .../data.zarr/3d.contiguous.i2/c/0/0/0 | Bin .../data.zarr/3d.contiguous.i2/zarr.json | 0 .../zarr_v3/from_zarrita/data.zarr/zarr.json | 0 .../zarr}/zarr_v3/from_zarrita/generate-v3.py | 0 testdata/kvstore/files/# | 0 testdata/kvstore/files/a | 1 + testdata/kvstore/files/b | 1 + testdata/kvstore/files/baz/x | 0 testdata/kvstore/files/c | 1 + testdata/kvstore/files/empty | 0 testdata/kvstore/gzip/simple.txt | 1 + testdata/kvstore/gzip/simple.txt.gz | Bin 0 -> 36 bytes testdata/kvstore/zip/files.zip | Bin 0 -> 963 bytes testdata/kvstore/zip/from-yauzl/README.txt | 25 + ...er not a zip file or file is truncated.zip | Bin 0 -> 308 bytes ... not a zip file or file is truncated_1.zip | 0 ... not a zip file or file is truncated_2.zip | Bin 0 -> 309 bytes ... mismatch for stored file 2147483647 5.zip | Bin 0 -> 308 bytes ...zip64 extended information extra field.zip | Bin 0 -> 244 bytes ...length exceeds extra field buffer size.zip | Bin 0 -> 308 bytes ...verflows file bounds 63 2147483647 308.zip | Bin 0 -> 308 bytes ...ectory file header signature 0x1014b50.zip | Bin 0 -> 308 bytes ... local file header signature 0x3034b50.zip | Bin 0 -> 308 bytes ... of central directory record signature.zip | Bin 0 -> 98 bytes ...les are not supported this is volume 1.zip | Bin 0 -> 308 bytes .../strong encryption is not supported.zip | Bin 0 -> 194 bytes .../unsupported compression method 1.zip | Bin 0 -> 308 bytes ...field does not include compressed size.zip | Bin 0 -> 244 bytes ...oes not include relative header offset.zip | Bin 0 -> 244 bytes ...eld does not include uncompressed size.zip | Bin 0 -> 244 bytes .../from-yauzl/success/cygwin-info-zip.zip | Bin 0 -> 308 bytes .../zip/from-yauzl/success/deflate.zip | Bin 0 -> 2993 bytes .../zip/from-yauzl/success/directories.zip | Bin 0 -> 428 bytes .../kvstore/zip/from-yauzl/success/empty.zip | Bin 0 -> 22 bytes .../zip/from-yauzl/success/linux-info-zip.zip | Bin 0 -> 308 bytes .../from-yauzl/success/sloppy-filenames.zip | Bin 0 -> 308 bytes .../success/unicode-path-extra-field.zip | Bin 0 -> 225 bytes .../zip/from-yauzl/success/unicode.zip | Bin 0 -> 1012 bytes .../zip/from-yauzl/success/unix-epoch.zip | Bin 0 -> 178 bytes .../zip/from-yauzl/success/windows-7-zip.zip | Bin 0 -> 276 bytes .../success/windows-compressed-folder.zip | Bin 0 -> 204 bytes .../kvstore/zip/from-yauzl/success/zip64.zip | Bin 0 -> 400 bytes {python/testdata => testdata}/mesh/simple1 | Bin {python/testdata => testdata}/mesh/simple2 | Bin tests/datasource/completion.spec.ts | 133 + tests/datasource/deepzoom.browser_test.ts | 21 + .../datasource/metadata_snapshot_test_util.ts | 42 + .../deepzoom/14122_mPPC_BDA_s186.dzi.snapshot | 1181 +++++ .../n5_viewer_multiscale_deprecated.snapshot | 194 + .../n5/n5_viewer_multiscale_modern.snapshot | 194 + .../nifti/example_nifti2.nii.gz.snapshot | 213 + .../nifti/standard.nii.gz.snapshot | 156 + .../nifti/standard.nii.snapshot | 156 + .../precomputed/one_channel.snapshot | 266 ++ .../precomputed/two_channels.snapshot | 315 ++ .../zarr/ome_zarr_simple_0.4.snapshot | 208 + .../zarr/ome_zarr_simple_0.4.zip.snapshot | 208 + .../zarr/ome_zarr_simple_0.5.snapshot | 208 + .../zarr/zarr_v3_examples_single_res.snapshot | 120 + tests/datasource/n5.browser_test.ts | 24 + tests/datasource/nifti.browser_test.ts | 26 + tests/datasource/precomputed.browser_test.ts | 21 + tests/datasource/suggest_name.spec.ts | 31 + tests/datasource/test_util.ts | 184 + tests/datasource/zarr.browser_test.ts | 27 + tests/fixtures/clear_cookies.ts | 31 + tests/fixtures/datasource_provider.ts | 35 + tests/fixtures/fake_gcs_server.ts | 120 + tests/fixtures/fake_s3_server.ts | 137 + tests/fixtures/fixture.ts | 54 + tests/fixtures/gl_browser.ts | 26 + tests/fixtures/gl_node.ts | 27 + tests/fixtures/http_server.ts | 50 + tests/fixtures/msw_browser.ts | 21 + tests/fixtures/msw_node.ts | 18 + tests/fixtures/shared_kvstore_context.ts | 50 + tests/fixtures/status_message_observer.ts | 89 + tests/fixtures/temp_directory.ts | 34 + tests/kvstore/gcs.spec.ts | 47 + tests/kvstore/gzip.spec.ts | 36 + tests/kvstore/http.spec.ts | 25 + tests/kvstore/ngauth.browser_test.ts | 142 + tests/kvstore/s3.spec.ts | 47 + tests/kvstore/test_data.ts | 56 + tests/kvstore/test_util.ts | 213 + tests/kvstore/url.spec.ts | 182 + tests/kvstore/zip.spec.ts | 177 + tests/util/clear_cookies.ts | 26 + tests/util/msw_request_log.ts | 128 + tsconfig.json | 1 - vitest.workspace.ts | 43 +- 585 files changed, 21362 insertions(+), 6782 deletions(-) create mode 100644 build_tools/vitest/build_fake_gcs_server.ts create mode 100644 build_tools/vitest/fake_ngauth_server.ts create mode 100644 build_tools/vitest/polyfill-browser-globals-in-node.ts delete mode 100644 build_tools/vitest/setup-crypto.ts create mode 100644 build_tools/vitest/test_data_server.ts create mode 100644 src/data_management_context.ts create mode 100644 src/datasource/kvstore_completions.ts create mode 100644 src/datasource/local.ts create mode 100644 src/datasource/precomputed/sharded.ts create mode 100644 src/datasource/python/register_default.ts create mode 100644 src/kvstore/auto_detect.ts create mode 100644 src/kvstore/backend.ts create mode 100644 src/kvstore/byte_range/file_handle.ts create mode 100644 src/kvstore/byte_range/index.ts create mode 100644 src/kvstore/byte_range/register.ts create mode 100644 src/kvstore/chunk_source_frontend.ts create mode 100644 src/kvstore/context.ts create mode 100644 src/kvstore/enabled_backend_modules.ts create mode 100644 src/kvstore/enabled_frontend_modules.ts create mode 100644 src/kvstore/frontend.ts create mode 100644 src/kvstore/gcs/index.ts create mode 100644 src/kvstore/gcs/register.ts create mode 100644 src/kvstore/gzip/file_handle.ts create mode 100644 src/kvstore/gzip/index.ts create mode 100644 src/kvstore/gzip/register.ts create mode 100644 src/kvstore/http/html_directory_listing.ts create mode 100644 src/kvstore/http/index.ts create mode 100644 src/kvstore/http/read.ts create mode 100644 src/kvstore/http/register.ts rename src/{datasource => kvstore}/middleauth/credentials_provider.ts (84%) create mode 100644 src/kvstore/middleauth/register.ts rename src/{datasource => kvstore}/middleauth/register_credentials_provider.ts (75%) rename src/{datasource => kvstore}/ngauth/README.md (100%) rename src/{datasource => kvstore}/ngauth/credentials_provider.ts (71%) create mode 100644 src/kvstore/ngauth/register.ts rename src/{datasource => kvstore}/ngauth/register_credentials_provider.ts (83%) create mode 100644 src/kvstore/register.ts create mode 100644 src/kvstore/s3/index.ts create mode 100644 src/kvstore/s3/list.ts create mode 100644 src/kvstore/s3/register.ts create mode 100644 src/kvstore/shared_common.ts delete mode 100644 src/kvstore/special/index.ts create mode 100644 src/kvstore/url.ts create mode 100644 src/kvstore/zip/auto_detect.ts create mode 100644 src/kvstore/zip/backend.ts create mode 100644 src/kvstore/zip/frontend.ts create mode 100644 src/kvstore/zip/metadata.ts create mode 100644 src/kvstore/zip/register_backend.ts create mode 100644 src/kvstore/zip/register_frontend.ts delete mode 100644 src/util/byte_range_http_requests.ts delete mode 100644 src/util/gcs_bucket_listing.ts delete mode 100644 src/util/http_path_completion.ts create mode 100644 src/util/progress_listener.ts delete mode 100644 src/util/s3.ts delete mode 100644 src/util/s3_bucket_listing.ts delete mode 100644 src/util/special_protocol_request.ts create mode 100644 src/widget/progress_listener.ts rename testdata/{ => codec/compressed_segmentation}/64x64x64-raw-uint64-segmentation.dat (100%) rename testdata/{ => codec/compressed_segmentation}/README.md (100%) rename testdata/{ => codec/npy}/generate_npy_examples.py (100%) rename testdata/{ => codec/npy}/npy_test.float32-be.npy (100%) rename testdata/{ => codec/npy}/npy_test.float32-le.npy (100%) rename testdata/{ => codec/npy}/npy_test.float32.json (100%) rename testdata/{ => codec/npy}/npy_test.uint16-be.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint16-le.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint16.json (100%) rename testdata/{ => codec/npy}/npy_test.uint32-be.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint32-le.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint32.json (100%) rename testdata/{ => codec/npy}/npy_test.uint64-be.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint64-le.npy (100%) rename testdata/{ => codec/npy}/npy_test.uint64.json (100%) rename testdata/{ => codec/npy}/npy_test.uint8.json (100%) rename testdata/{ => codec/npy}/npy_test.uint8.npy (100%) create mode 100644 testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi create mode 100755 testdata/datasource/n5/generate_n5.py create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json create mode 100644 testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json create mode 100644 testdata/datasource/nifti/README.md create mode 100644 testdata/datasource/nifti/example_nifti2.nii.gz create mode 100644 testdata/datasource/nifti/standard.nii create mode 100644 testdata/datasource/nifti/standard.nii.gz create mode 100755 testdata/datasource/precomputed/generate_precomputed.py create mode 100644 testdata/datasource/precomputed/one_channel/info create mode 100644 testdata/datasource/precomputed/two_channels/info create mode 100755 testdata/datasource/zarr/ome_zarr/generate_ome_zarr.py create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4.zip create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale0/.zattrs create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale0/.zgroup create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale0/image/.zarray create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale0/image/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale1/.zattrs create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale1/.zgroup create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale1/image/.zarray create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale1/image/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale2/.zattrs create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale2/.zgroup create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale2/image/.zarray create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.4/scale2/image/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale0/image/c/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale0/image/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale0/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale1/image/c/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale1/image/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale1/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale2/image/c/0/0 create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale2/image/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/scale2/zarr.json create mode 100644 testdata/datasource/zarr/ome_zarr/simple_0.5/zarr.json rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/.zattrs (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/.zgroup (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/.zmetadata (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.i2/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.ragged.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.ragged.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.ragged.i2/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.chunked.ragged.i2/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.S7/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.S7/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U13.be/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U13.be/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U13.le/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U13.le/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U7/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.U7/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.b1/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.b1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.blosc.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.blosc.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f4.be/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f4.be/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f4.le/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f4.le/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f8/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.f8/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.i4/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.i4/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.lz4.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.lz4.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.raw.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.raw.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.u1/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.u1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.zlib.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.zlib.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.zstd.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/1d.contiguous.zstd.i2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.U7/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.U7/0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.U7/0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.U7/1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.U7/1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.i2/0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.i2/0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.i2/1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.i2/1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.ragged.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.ragged.i2/0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.ragged.i2/0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.ragged.i2/1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.chunked.ragged.i2/1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.contiguous.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/2d.contiguous.i2/0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.O/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.O/0.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.O/0.1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.O/1.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.O/1.1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.0.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.1.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.2.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.2.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/0.2.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.0.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.1.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.2.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.2.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/1.2.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.0.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.1.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.1.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.1.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.2.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.2.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.i2/2.2.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.C/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.C/0.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.C/0.0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.C/0.0.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.F/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.F/0.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.F/0.0.1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.chunked.mixed.i2.F/0.0.2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.contiguous.i2/.zarray (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/data.zarr/3d.contiguous.i2/0.0.0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v2/from_zarr-python/generate-v2.py (100%) create mode 100755 testdata/datasource/zarr/zarr_v3/examples/generate_zarr_v3.py create mode 100644 testdata/datasource/zarr/zarr_v3/examples/single_res/c/0/0 create mode 100644 testdata/datasource/zarr/zarr_v3/examples/single_res/c/0/1 create mode 100644 testdata/datasource/zarr/zarr_v3/examples/single_res/c/1/0 create mode 100644 testdata/datasource/zarr/zarr_v3/examples/single_res/c/1/1 create mode 100644 testdata/datasource/zarr/zarr_v3/examples/single_res/zarr.json rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.compressed.sharded.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.compressed.sharded.i2/c/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.filled.compressed.sharded.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.filled.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.i2/c/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.ragged.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.ragged.i2/c/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.ragged.i2/c/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.chunked.ragged.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.b1/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.b1/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.blosc.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.blosc.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.b1/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.b1/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.f4/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.f4/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.f8/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.f8/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.i4/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.i4/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.u1/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.compressed.sharded.u1/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f4.be/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f4.be/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f4.le/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f4.le/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f8/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.f8/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.gzip.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.gzip.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.i4/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.i4/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.raw.i2/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.raw.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.u1/c/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/1d.contiguous.u1/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.filled.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.filled.i2/c/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.filled.i2/c/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.filled.i2/c/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.filled.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.i2/c/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.i2/c/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.i2/c/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.i2/c/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.i2/c/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.i2/c/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.compressed.sharded.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.compressed.sharded.i2/c/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.compressed.sharded.i2/c/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.compressed.sharded.i2/c/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.i2/c/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.i2/c/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.i2/c/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.chunked.ragged.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.contiguous.compressed.sharded.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.contiguous.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.contiguous.i2/c/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/2d.contiguous.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/0/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/0/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/0/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/1/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/1/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/1/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/c/1/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/0/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/1/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/2/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/0/2/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/0/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/1/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/2/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/1/2/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/0/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/1/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/1/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/1/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/2/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/2/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/c/2/2/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.compressed.sharded.i2/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.C/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.C/c/0/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.C/c/0/0/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.C/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.F/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.F/c/0/0/1 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.F/c/0/0/2 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.chunked.mixed.i2.F/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.contiguous.compressed.sharded.i2/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.contiguous.compressed.sharded.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.contiguous.i2/c/0/0/0 (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/3d.contiguous.i2/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/data.zarr/zarr.json (100%) rename {python/testdata => testdata/datasource/zarr}/zarr_v3/from_zarrita/generate-v3.py (100%) create mode 100644 testdata/kvstore/files/# create mode 100644 testdata/kvstore/files/a create mode 100644 testdata/kvstore/files/b create mode 100644 testdata/kvstore/files/baz/x create mode 100644 testdata/kvstore/files/c create mode 100644 testdata/kvstore/files/empty create mode 100644 testdata/kvstore/gzip/simple.txt create mode 100644 testdata/kvstore/gzip/simple.txt.gz create mode 100644 testdata/kvstore/zip/files.zip create mode 100644 testdata/kvstore/zip/from-yauzl/README.txt create mode 100644 testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_1.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/expected zip64 extended information extra field.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/invalid central directory file header signature 0x1014b50.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/unsupported compression method 1.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include compressed size.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include relative header offset.zip create mode 100644 testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include uncompressed size.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/cygwin-info-zip.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/deflate.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/directories.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/empty.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/linux-info-zip.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/unicode.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip create mode 100755 testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip create mode 100755 testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip create mode 100644 testdata/kvstore/zip/from-yauzl/success/zip64.zip rename {python/testdata => testdata}/mesh/simple1 (100%) rename {python/testdata => testdata}/mesh/simple2 (100%) create mode 100644 tests/datasource/completion.spec.ts create mode 100644 tests/datasource/deepzoom.browser_test.ts create mode 100644 tests/datasource/metadata_snapshot_test_util.ts create mode 100644 tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot create mode 100644 tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot create mode 100644 tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot create mode 100644 tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot create mode 100644 tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot create mode 100644 tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot create mode 100644 tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot create mode 100644 tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot create mode 100644 tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot create mode 100644 tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.zip.snapshot create mode 100644 tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot create mode 100644 tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot create mode 100644 tests/datasource/n5.browser_test.ts create mode 100644 tests/datasource/nifti.browser_test.ts create mode 100644 tests/datasource/precomputed.browser_test.ts create mode 100644 tests/datasource/suggest_name.spec.ts create mode 100644 tests/datasource/test_util.ts create mode 100644 tests/datasource/zarr.browser_test.ts create mode 100644 tests/fixtures/clear_cookies.ts create mode 100644 tests/fixtures/datasource_provider.ts create mode 100644 tests/fixtures/fake_gcs_server.ts create mode 100644 tests/fixtures/fake_s3_server.ts create mode 100644 tests/fixtures/fixture.ts create mode 100644 tests/fixtures/gl_browser.ts create mode 100644 tests/fixtures/gl_node.ts create mode 100644 tests/fixtures/http_server.ts create mode 100644 tests/fixtures/msw_browser.ts create mode 100644 tests/fixtures/msw_node.ts create mode 100644 tests/fixtures/shared_kvstore_context.ts create mode 100644 tests/fixtures/status_message_observer.ts create mode 100644 tests/fixtures/temp_directory.ts create mode 100644 tests/kvstore/gcs.spec.ts create mode 100644 tests/kvstore/gzip.spec.ts create mode 100644 tests/kvstore/http.spec.ts create mode 100644 tests/kvstore/ngauth.browser_test.ts create mode 100644 tests/kvstore/s3.spec.ts create mode 100644 tests/kvstore/test_data.ts create mode 100644 tests/kvstore/test_util.ts create mode 100644 tests/kvstore/url.spec.ts create mode 100644 tests/kvstore/zip.spec.ts create mode 100644 tests/util/clear_cookies.ts create mode 100644 tests/util/msw_request_log.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c732e3257..e76f8eafa8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,11 +31,16 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x cache: "npm" cache-dependency-path: | package-lock.json examples/**/package-lock.json + # go needed for fake_gcs_server used by the javascript tests + - name: Setup go + uses: actions/setup-go@v5 + with: + go-version: "stable" - run: npm install - run: npm run format:fix - name: Check for dirty working directory @@ -54,7 +59,6 @@ jobs: - run: npm run build-package - run: npm publish --dry-run working-directory: dist/package - - uses: ./.github/actions/setup-firefox - name: Run JavaScript tests (including WebGL) run: npm test if: ${{ runner.os != 'macOS' }} @@ -99,7 +103,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -146,7 +150,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x cache: "npm" - name: Set up Python uses: actions/setup-python@v5 @@ -221,7 +225,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x registry-url: "https://registry.npmjs.org" - uses: actions/download-artifact@v4 with: diff --git a/.github/workflows/build_preview.yml b/.github/workflows/build_preview.yml index 9dcac7d1e1..7a6c997612 100644 --- a/.github/workflows/build_preview.yml +++ b/.github/workflows/build_preview.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: node-version: - - "20.x" + - "22.x" runs-on: ubuntu-latest steps: diff --git a/.prettierignore b/.prettierignore index 42541345da..1a4619071f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,12 @@ /templates/ /python/ /third_party/jpgjs/jpg.js -/testdata/*.json +/testdata/**/*.json +zarr.json .parcel-cache dist /lib /docs/_build/ /.ruff_cache +package.json +package-lock.json diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts index f95d924f98..7a2133f807 100644 --- a/build_tools/build-package.ts +++ b/build_tools/build-package.ts @@ -71,6 +71,7 @@ async function buildPackage(options: { outbase: srcDir, bundle: false, outdir: libDir, + target: "es2022", }); let compilerOptionsFromConfigFile: ts.CompilerOptions = {}; diff --git a/build_tools/update-conditions.ts b/build_tools/update-conditions.ts index 873829e161..25e0891f9d 100644 --- a/build_tools/update-conditions.ts +++ b/build_tools/update-conditions.ts @@ -17,70 +17,100 @@ const imports: Record = {}; imports["#src/third_party/jpgjs/jpg.js"] = "./src/third_party/jpgjs/jpg.js"; imports["#src/*.js"] = "./src/*.ts"; imports["#src/*"] = "./src/*"; +imports["#tests/fixtures/msw"] = { + node: "./tests/fixtures/msw_node.ts", + default: "./tests/fixtures/msw_browser.ts", +}; +imports["#tests/fixtures/gl"] = { + node: "./tests/fixtures/gl_node.ts", + default: "./tests/fixtures/gl_browser.ts", +}; +imports["#tests/*.js"] = "./tests/*.ts"; imports["#testdata/*"] = "./testdata/*"; -const datasourceDir = path.resolve(rootDir, "src", "datasource"); -const layerDir = path.resolve(rootDir, "src", "layer"); - -const datasources = ( - await fs.promises.readdir(datasourceDir, { withFileTypes: true }) -) - .filter((e) => e.isDirectory()) - .map((e) => e.name); - -const layers = (await fs.promises.readdir(layerDir, { withFileTypes: true })) - .filter((e) => e.isDirectory()) - .map((e) => e.name); - -const datasourceKeys = { - backend: "backend", - async_computation: "async_computation", - register_default: "frontend", - register_credentials_provider: "frontend", -} as const; +async function listSubdirs(dir: string): Promise { + return (await fs.promises.readdir(dir, { withFileTypes: true })) + .filter((e) => e.isDirectory()) + .map((e) => e.name); +} -const datasourceModules = Object.fromEntries( - Object.values(datasourceKeys).map((key) => [key, new Array()]), -); +async function writeModule(modulePath: string, imports: string[]) { + await fs.promises.writeFile( + modulePath, + "// DO NOT EDIT: Generated by config/update_conditions.ts\n" + + imports.map((name) => `import ${JSON.stringify(name)};\n`).join(""), + { encoding: "utf-8" }, + ); +} -for (const datasource of datasources) { - for (const [filePrefix, moduleKind] of Object.entries(datasourceKeys)) { - const sourcePrefix = `./src/datasource/${datasource}/${filePrefix}`; - if ( - await fs.promises - .stat(path.resolve(rootDir, `${sourcePrefix}.ts`)) - .catch(() => undefined) - ) { - const source = sourcePrefix + JS_EXT; - const conditions: Record = {}; - if (datasource === "python") { - conditions["neuroglancer/python"] = source; - conditions.default = NOOP; - } else { - if (filePrefix === "register_credentials_provider") { - conditions["neuroglancer/python"] = NOOP; +async function handleDrivers( + kind: string, + moduleMap: Record, +) { + const driverDir = path.resolve(rootDir, "src", kind); + const drivers = await listSubdirs(driverDir); + const modules: Record = {}; + for (const driver of drivers) { + for (const [filePrefix, moduleKinds] of Object.entries(moduleMap)) { + const sourcePrefix = `./src/${kind}/${driver}/${filePrefix}`; + if ( + await fs.promises + .stat(path.resolve(rootDir, `${sourcePrefix}.ts`)) + .catch(() => undefined) + ) { + const source = sourcePrefix + JS_EXT; + const conditions: Record = {}; + if (driver === "python") { + conditions["neuroglancer/python"] = source; + conditions.default = NOOP; + } else { + if (filePrefix === "register_credentials_provider") { + conditions["neuroglancer/python"] = NOOP; + } + conditions[`neuroglancer/${kind}/${driver}:enabled`] = source; + conditions[`neuroglancer/${kind}:none_by_default`] = NOOP; + conditions[`neuroglancer/${kind}/${driver}:disabled`] = NOOP; + conditions.default = source; + } + let moduleId = `#${kind}/${driver}`; + if (filePrefix !== "index") { + moduleId += `/${filePrefix}`; + } + imports[moduleId] = conditions; + for (const moduleKind of moduleKinds) { + if (modules[moduleKind] === undefined) { + modules[moduleKind] = []; + } + modules[moduleKind].push(moduleId); } - conditions[`neuroglancer/datasource/${datasource}:enabled`] = source; - conditions["neuroglancer/datasource:none_by_default"] = NOOP; - conditions[`neuroglancer/datasource/${datasource}:disabled`] = source; - conditions.default = source; } - const moduleId = `#datasource/${datasource}/${filePrefix}`; - imports[moduleId] = conditions; - datasourceModules[moduleKind].push(moduleId); } } + for (const [moduleKind, moduleIds] of Object.entries(modules)) { + await writeModule( + path.resolve(driverDir, `enabled_${moduleKind}_modules.ts`), + moduleIds, + ); + } } -for (const layer of layers) { - const source = `./src/layer/${layer}/index` + JS_EXT; - imports[`#layer/${layer}`] = { - [`neuroglancer/layer/${layer}:enabled`]: source, - "neuroglancer/layer:none_by_default": NOOP, - [`neuroglancer/layer/${layer}:enabled`]: source, - default: source, - }; -} +await handleDrivers("datasource", { + backend: ["backend"], + async_computation: ["async_computation"], + register_default: ["frontend"], + register_credentials_provider: ["frontend"], +}); + +await handleDrivers("kvstore", { + register: ["frontend", "backend"], + register_frontend: ["frontend"], + register_backend: ["backend"], + register_credentials_provider: ["frontend"], +}); + +await handleDrivers("layer", { + index: ["frontend"], +}); // main entrypoint. imports["#main"] = { @@ -94,32 +124,6 @@ imports["#python_integration_build"] = { default: NOOP, }; -async function writeModule(modulePath: string, imports: string[]) { - await fs.promises.writeFile( - modulePath, - "// DO NOT EDIT: Generated by config/update_conditions.ts\n" + - imports.map((name) => `import ${JSON.stringify(name)};\n`).join(""), - { encoding: "utf-8" }, - ); -} - -for (const [moduleKind, moduleIds] of Object.entries(datasourceModules)) { - await writeModule( - path.resolve( - rootDir, - "src", - "datasource", - `enabled_${moduleKind}_modules.ts`, - ), - moduleIds, - ); -} - -await writeModule( - path.resolve(rootDir, "src", "layer", "enabled_frontend_modules.ts"), - layers.map((name) => `#layer/${name}`), -); - packageJson.imports = imports; packageJson.exports = { diff --git a/build_tools/vitest/build_fake_gcs_server.ts b/build_tools/vitest/build_fake_gcs_server.ts new file mode 100644 index 0000000000..2009ba7365 --- /dev/null +++ b/build_tools/vitest/build_fake_gcs_server.ts @@ -0,0 +1,57 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawnSync } from "node:child_process"; +import fs from "node:fs/promises"; +import path from "node:path"; + +export async function getFakeGcsServerBin(): Promise { + const binDir = path.join( + import.meta.dirname, + "..", + "..", + "node_modules", + ".cache", + "gobin", + ); + const serverBinPath = + path.join(binDir, "fake-gcs-server") + + (process.platform === "win32" ? ".exe" : ""); + if ( + !(await fs.access(serverBinPath).then( + () => true, + () => false, + )) + ) { + console.log("Building fake-gcs-server"); + // Note: For unknown reasons, using `await promisify(spawn)` in place of + // `spawnSync` causes the vitest process to exit as soon as the child + // process completes. + spawnSync( + "go", + [ + "install", + "github.com/fsouza/fake-gcs-server@3b3d059cbaade55b480196a51dedb7aa82ec2b0a", + ], + { + env: { ...process.env, GOBIN: binDir }, + stdio: ["ignore", "inherit", "inherit"], + }, + ); + console.log("Done building fake-gcs-server"); + } + return serverBinPath; +} diff --git a/build_tools/vitest/fake_ngauth_server.ts b/build_tools/vitest/fake_ngauth_server.ts new file mode 100644 index 0000000000..ed0068b333 --- /dev/null +++ b/build_tools/vitest/fake_ngauth_server.ts @@ -0,0 +1,98 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Fake ngauth server used for tests. + +import type { AddressInfo } from "node:net"; +import cookie from "cookie"; +import express from "express"; + +const COOKIE_NAME = "ngauth_login"; +const COOKIE_VALUE = "fake_login"; +const TOKEN_VALUE = "fake_token"; + +export interface FakeNgauthServer extends AsyncDisposable { + url: string; +} + +export function startFakeNgauthServer(): Promise { + const app = express(); + app.use(express.json({ inflate: false, type: "*/*" })); + app.get("/login", (req, res) => { + const origin = (req.query.origin ?? "").toString(); + res.contentType("text/html"); + // Note: The real ngauth marks this cookie as http-only, but that prevents + // JavaScript from clearing it. + res.cookie(COOKIE_NAME, COOKIE_VALUE, { sameSite: "lax" }); + const jsonToken = JSON.stringify({ token: TOKEN_VALUE }); + const jsonOrigin = JSON.stringify(origin); + res.send(` + + + + + +`); + }); + app.post("/token", (req, res) => { + const cookies = cookie.parse(req.headers.cookie ?? ""); + const origin = req.headers.origin ?? ""; + res.set("x-frame-options", "deny"); + res.set("access-control-allow-origin", origin); + res.set("access-control-allow-credentials", "true"); + res.set("vary", "origin"); + + if (cookies[COOKIE_NAME] === COOKIE_VALUE) { + res.contentType("text/plain"); + res.send(TOKEN_VALUE); + } else { + res.status(401); + res.send(); + } + }); + app.post("/gcs_token", (req, res) => { + const origin = req.headers.origin ?? ""; + res.set("access-control-allow-origin", origin); + res.set("vary", "origin"); + const { body } = req; + if ( + typeof body !== "object" || + Array.isArray(body) || + body.token !== TOKEN_VALUE + ) { + res.status(400); + res.send(); + } else { + res.json({ token: "fake_gcs_token:" + body.bucket }); + } + }); + const server = app.listen(0, "localhost"); + // Don't block node from exiting while this server is running. + server.unref(); + return new Promise((resolve, reject) => { + server.on("error", reject); + server.on("listening", () => { + const port = (server.address() as AddressInfo).port; + resolve({ + url: `http://localhost:${port}`, + [Symbol.asyncDispose]: () => + new Promise((resolve) => server.close(() => resolve())), + }); + }); + }); +} diff --git a/build_tools/vitest/polyfill-browser-globals-in-node.ts b/build_tools/vitest/polyfill-browser-globals-in-node.ts new file mode 100644 index 0000000000..c4d2ce3452 --- /dev/null +++ b/build_tools/vitest/polyfill-browser-globals-in-node.ts @@ -0,0 +1,16 @@ +import { webcrypto } from "node:crypto"; +import type { JSDOM } from "jsdom"; + +declare let jsdom: JSDOM; + +Object.defineProperty(globalThis, "crypto", { + value: webcrypto, +}); + +for (const name of [ + /*"DOMParser", "XPathResult", "navigator"*/ +] as const) { + Object.defineProperty(globalThis, name, { + value: jsdom.window[name], + }); +} diff --git a/build_tools/vitest/setup-crypto.ts b/build_tools/vitest/setup-crypto.ts deleted file mode 100644 index 65e56e55a2..0000000000 --- a/build_tools/vitest/setup-crypto.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Polyfill for missing `crypto` in jsdom. - -import { webcrypto } from "node:crypto"; - -Object.defineProperty(globalThis, "crypto", { - value: webcrypto, -}); diff --git a/build_tools/vitest/test_data_server.ts b/build_tools/vitest/test_data_server.ts new file mode 100644 index 0000000000..cde0e7ce18 --- /dev/null +++ b/build_tools/vitest/test_data_server.ts @@ -0,0 +1,51 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type * as http from "node:http"; +import type { AddressInfo } from "node:net"; +import { createServer } from "http-server"; + +export interface TestDataServer extends AsyncDisposable { + url: string; +} + +export async function startTestDataServer( + rootDirectory: string, +): Promise { + const server: http.Server = ( + createServer({ + root: rootDirectory, + cache: -1, + cors: true, + }) as any + ).server; + // Don't block node from exiting. + server.unref(); + const serverUrl = await new Promise((resolve, reject) => { + server.on("error", reject); + server.listen(0, "localhost", () => { + const port = (server.address() as AddressInfo).port; + resolve(`http://localhost:${port}/`); + }); + }); + console.log(`Serving ${rootDirectory} at ${serverUrl}`); + return { + url: serverUrl, + [Symbol.asyncDispose]: async () => { + await new Promise((resolve) => server.close(resolve)); + }, + }; +} diff --git a/eslint.config.js b/eslint.config.js index e877f40fe4..a7c11e0791 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -59,6 +59,7 @@ export default tseslint.config( "error", { argsIgnorePattern: "^_", + varsIgnorePattern: "^_", ignoreRestSiblings: true, }, ], diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 52fdcccb14..5923e257ab 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -23,7 +23,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -31,7 +32,7 @@ "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@babel/code-frame": { diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index 8142ea13f6..d948e32fbb 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -22,7 +22,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -30,38 +31,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -733,6 +747,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -966,6 +982,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -977,6 +995,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -988,8 +1008,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -997,7 +1015,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1042,7 +1062,9 @@ "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", @@ -1088,12 +1110,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1116,6 +1142,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1275,6 +1302,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1292,6 +1321,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1306,6 +1337,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1317,6 +1350,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1328,6 +1363,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1341,12 +1378,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1358,6 +1399,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1369,6 +1412,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1566,9 +1611,7 @@ "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1592,8 +1635,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1603,8 +1644,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1634,8 +1673,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1644,8 +1681,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1701,6 +1736,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1718,6 +1755,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1734,6 +1773,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1752,6 +1793,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1763,6 +1806,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1776,6 +1821,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1794,6 +1841,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1933,6 +1982,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -1943,7 +1994,9 @@ "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -1978,7 +2031,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -1988,13 +2043,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2006,13 +2063,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2034,12 +2093,16 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -2055,6 +2118,8 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -2063,6 +2128,8 @@ "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -2071,7 +2138,9 @@ "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/brace-expansion": { "version": "2.0.1", @@ -2147,6 +2216,8 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -2154,6 +2225,8 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } @@ -2170,6 +2243,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -2178,6 +2253,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2195,6 +2272,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2269,6 +2348,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -2313,6 +2394,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -2420,6 +2503,8 @@ "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -2428,6 +2513,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -2442,6 +2529,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2483,11 +2572,12 @@ "../../../node_modules/core-util-is": { "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -2500,6 +2590,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -2512,6 +2604,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2525,6 +2619,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -2533,6 +2629,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2551,17 +2649,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2615,11 +2719,15 @@ }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -2635,16 +2743,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -2655,9 +2759,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -2673,6 +2775,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -2681,8 +2785,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -2696,8 +2798,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -2709,8 +2809,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2719,8 +2817,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2729,8 +2825,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -2764,6 +2858,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2774,14 +2870,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -2796,6 +2892,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2822,6 +2920,8 @@ "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -2830,6 +2930,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2867,6 +2969,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -2887,6 +2991,8 @@ "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2907,7 +3013,9 @@ "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -2932,8 +3040,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -2945,8 +3051,6 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -2960,6 +3064,8 @@ "version": "0.1.4", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -2980,6 +3086,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -2996,6 +3104,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3012,6 +3122,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3020,6 +3132,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3081,6 +3195,8 @@ "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4018,6 +4134,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4037,6 +4155,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -4061,7 +4181,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -4127,6 +4249,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -4235,8 +4359,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4250,6 +4372,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -4258,6 +4382,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -4269,6 +4395,8 @@ "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4282,6 +4410,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4309,6 +4439,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4323,6 +4455,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4332,6 +4466,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4351,6 +4487,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4362,6 +4500,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -4407,6 +4547,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4428,6 +4570,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -4439,6 +4583,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4451,6 +4597,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -4463,6 +4611,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4471,6 +4621,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4515,6 +4667,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -4563,6 +4717,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -4577,6 +4733,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -4684,6 +4842,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -4708,6 +4868,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -4723,7 +4885,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -4840,8 +5004,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -4857,14 +5019,14 @@ "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -4891,6 +5053,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4903,8 +5067,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4959,7 +5121,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -5231,6 +5395,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5275,6 +5441,8 @@ "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -5286,7 +5454,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -5445,6 +5615,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5466,9 +5638,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -5676,8 +5846,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -5757,6 +5925,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -5768,6 +5938,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -5807,6 +5979,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -5818,6 +5992,8 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -5912,7 +6088,9 @@ "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", @@ -5943,6 +6121,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -5953,6 +6133,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -5985,7 +6167,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -5999,12 +6183,16 @@ "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -6016,7 +6204,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -6030,6 +6220,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6101,6 +6293,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6139,12 +6333,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -6179,7 +6377,9 @@ "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -6214,6 +6414,8 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -6239,6 +6441,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -6247,6 +6451,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -6284,6 +6490,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6292,6 +6500,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -6313,9 +6523,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -6436,6 +6644,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -6472,6 +6682,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -6490,6 +6702,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6501,6 +6715,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6513,6 +6729,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6525,6 +6743,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -6547,9 +6767,7 @@ "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -6807,12 +7025,16 @@ "../../../node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -6825,6 +7047,8 @@ "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -6843,6 +7067,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6854,6 +7080,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6866,6 +7094,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6878,6 +7108,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -6885,7 +7117,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -6895,6 +7129,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6911,6 +7147,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -6934,12 +7172,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6966,14 +7208,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -6997,12 +7239,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -7029,6 +7275,8 @@ "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7042,17 +7290,23 @@ "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -7061,6 +7315,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7186,9 +7442,7 @@ "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -7209,7 +7463,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -7231,6 +7487,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7245,6 +7503,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -7252,7 +7512,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -7266,7 +7528,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -7381,7 +7645,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -7446,8 +7712,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -7501,6 +7765,8 @@ "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -7552,7 +7818,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -7635,6 +7903,8 @@ "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7644,6 +7914,8 @@ "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7657,6 +7929,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -7670,6 +7944,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -7709,6 +7985,8 @@ "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -7716,7 +7994,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -7762,6 +8042,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -7771,6 +8053,8 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -7778,7 +8062,9 @@ "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -7982,6 +8268,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -7995,6 +8283,8 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -8070,7 +8360,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -8116,8 +8408,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -8132,8 +8422,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -8144,7 +8432,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -8171,7 +8461,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -8632,6 +8924,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8735,6 +9029,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -8758,6 +9054,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8772,8 +9070,6 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -8782,6 +9078,8 @@ "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -8837,8 +9135,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -8847,6 +9143,8 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -9092,8 +9390,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -9105,6 +9401,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -9135,6 +9433,8 @@ "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -9143,6 +9443,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -9164,6 +9466,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -9206,8 +9510,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -9402,8 +9704,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -9597,9 +9897,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -9687,6 +9985,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -9700,6 +10000,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/rsbuild/rsbuild-project-built/package-lock.json b/examples/rsbuild/rsbuild-project-built/package-lock.json index b73b7b5a55..3c908105d8 100644 --- a/examples/rsbuild/rsbuild-project-built/package-lock.json +++ b/examples/rsbuild/rsbuild-project-built/package-lock.json @@ -21,7 +21,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -29,7 +30,7 @@ "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@module-federation/runtime": { diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json index cd2de996d0..60f9b77745 100644 --- a/examples/rsbuild/rsbuild-project-source/package-lock.json +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -20,7 +20,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -28,38 +29,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -731,6 +745,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -964,6 +980,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -975,6 +993,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -986,8 +1006,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -995,7 +1013,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1040,7 +1060,9 @@ "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", @@ -1086,12 +1108,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1114,6 +1140,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1273,6 +1300,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1290,6 +1319,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1304,6 +1335,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1315,6 +1348,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1326,6 +1361,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1339,12 +1376,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1356,6 +1397,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1367,6 +1410,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1564,9 +1609,7 @@ "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1590,8 +1633,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1601,8 +1642,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1632,8 +1671,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1642,8 +1679,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1699,6 +1734,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1716,6 +1753,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1732,6 +1771,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1750,6 +1791,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1761,6 +1804,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1774,6 +1819,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1792,6 +1839,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1931,6 +1980,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -1941,7 +1992,9 @@ "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -1976,7 +2029,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -1986,13 +2041,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2004,13 +2061,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2032,12 +2091,16 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -2053,6 +2116,8 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -2061,6 +2126,8 @@ "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -2069,7 +2136,9 @@ "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/brace-expansion": { "version": "2.0.1", @@ -2145,6 +2214,8 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -2152,6 +2223,8 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } @@ -2168,6 +2241,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -2176,6 +2251,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2193,6 +2270,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2267,6 +2346,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -2311,6 +2392,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -2418,6 +2501,8 @@ "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -2426,6 +2511,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -2440,6 +2527,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2481,11 +2570,12 @@ "../../../node_modules/core-util-is": { "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -2498,6 +2588,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -2510,6 +2602,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2523,6 +2617,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -2531,6 +2627,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2549,17 +2647,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2613,11 +2717,15 @@ }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -2633,16 +2741,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -2653,9 +2757,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -2671,6 +2773,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -2679,8 +2783,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -2694,8 +2796,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -2707,8 +2807,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2717,8 +2815,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2727,8 +2823,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -2762,6 +2856,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2772,14 +2868,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -2794,6 +2890,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2820,6 +2918,8 @@ "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -2828,6 +2928,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2865,6 +2967,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -2885,6 +2989,8 @@ "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2905,7 +3011,9 @@ "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -2930,8 +3038,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -2943,8 +3049,6 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -2958,6 +3062,8 @@ "version": "0.1.4", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -2978,6 +3084,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -2994,6 +3102,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3010,6 +3120,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3018,6 +3130,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3079,6 +3193,8 @@ "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4016,6 +4132,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4035,6 +4153,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -4059,7 +4179,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -4125,6 +4247,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -4233,8 +4357,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4248,6 +4370,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -4256,6 +4380,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -4267,6 +4393,8 @@ "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4280,6 +4408,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4307,6 +4437,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4321,6 +4453,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4330,6 +4464,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4349,6 +4485,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4360,6 +4498,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -4405,6 +4545,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4426,6 +4568,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -4437,6 +4581,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4449,6 +4595,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -4461,6 +4609,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4469,6 +4619,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4513,6 +4665,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -4561,6 +4715,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -4575,6 +4731,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -4682,6 +4840,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -4706,6 +4866,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -4721,7 +4883,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -4838,8 +5002,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -4855,14 +5017,14 @@ "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -4889,6 +5051,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4901,8 +5065,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4957,7 +5119,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -5229,6 +5393,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5273,6 +5439,8 @@ "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -5284,7 +5452,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -5443,6 +5613,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5464,9 +5636,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -5674,8 +5844,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -5755,6 +5923,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -5766,6 +5936,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -5805,6 +5977,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -5816,6 +5990,8 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -5910,7 +6086,9 @@ "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", @@ -5941,6 +6119,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -5951,6 +6131,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -5983,7 +6165,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -5997,12 +6181,16 @@ "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -6014,7 +6202,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -6028,6 +6218,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6099,6 +6291,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6137,12 +6331,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -6177,7 +6375,9 @@ "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -6212,6 +6412,8 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -6237,6 +6439,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -6245,6 +6449,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -6282,6 +6488,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6290,6 +6498,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -6311,9 +6521,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -6434,6 +6642,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -6470,6 +6680,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -6488,6 +6700,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6499,6 +6713,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6511,6 +6727,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6523,6 +6741,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -6545,9 +6765,7 @@ "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -6805,12 +7023,16 @@ "../../../node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -6823,6 +7045,8 @@ "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -6841,6 +7065,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6852,6 +7078,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6864,6 +7092,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6876,6 +7106,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -6883,7 +7115,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -6893,6 +7127,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6909,6 +7145,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -6932,12 +7170,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6964,14 +7206,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -6995,12 +7237,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -7027,6 +7273,8 @@ "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7040,17 +7288,23 @@ "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -7059,6 +7313,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7184,9 +7440,7 @@ "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -7207,7 +7461,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -7229,6 +7485,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7243,6 +7501,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -7250,7 +7510,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -7264,7 +7526,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -7379,7 +7643,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -7444,8 +7710,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -7499,6 +7763,8 @@ "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -7550,7 +7816,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -7633,6 +7901,8 @@ "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7642,6 +7912,8 @@ "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7655,6 +7927,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -7668,6 +7942,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -7707,6 +7983,8 @@ "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -7714,7 +7992,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -7760,6 +8040,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -7769,6 +8051,8 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -7776,7 +8060,9 @@ "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -7980,6 +8266,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -7993,6 +8281,8 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -8068,7 +8358,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -8114,8 +8406,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -8130,8 +8420,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -8142,7 +8430,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -8169,7 +8459,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -8630,6 +8922,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8733,6 +9027,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -8756,6 +9052,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8770,8 +9068,6 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -8780,6 +9076,8 @@ "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -8835,8 +9133,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -8845,6 +9141,8 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -9090,8 +9388,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -9103,6 +9399,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -9133,6 +9431,8 @@ "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -9141,6 +9441,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -9162,6 +9464,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -9204,8 +9508,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -9400,8 +9702,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -9595,9 +9895,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -9685,6 +9983,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -9698,6 +9998,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/rspack/rspack-project-built/package-lock.json b/examples/rspack/rspack-project-built/package-lock.json index b55a287ff8..b434075015 100644 --- a/examples/rspack/rspack-project-built/package-lock.json +++ b/examples/rspack/rspack-project-built/package-lock.json @@ -22,7 +22,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -30,7 +31,7 @@ "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@discoveryjs/json-ext": { diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json index 064914d4c2..014e357e9d 100644 --- a/examples/rspack/rspack-project-source/package-lock.json +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -21,7 +21,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -29,38 +30,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -732,6 +746,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -965,6 +981,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -976,6 +994,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -987,8 +1007,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -996,7 +1014,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1041,7 +1061,9 @@ "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", @@ -1087,12 +1109,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1115,6 +1141,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1274,6 +1301,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1291,6 +1320,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1305,6 +1336,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1316,6 +1349,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1327,6 +1362,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1340,12 +1377,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1357,6 +1398,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1368,6 +1411,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1565,9 +1610,7 @@ "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1591,8 +1634,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1602,8 +1643,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1633,8 +1672,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1643,8 +1680,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1700,6 +1735,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1717,6 +1754,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1733,6 +1772,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1751,6 +1792,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1762,6 +1805,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1775,6 +1820,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1793,6 +1840,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1932,6 +1981,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -1942,7 +1993,9 @@ "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -1977,7 +2030,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -1987,13 +2042,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2005,13 +2062,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2033,12 +2092,16 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -2054,6 +2117,8 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -2062,6 +2127,8 @@ "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -2070,7 +2137,9 @@ "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/brace-expansion": { "version": "2.0.1", @@ -2146,6 +2215,8 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -2153,6 +2224,8 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } @@ -2169,6 +2242,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -2177,6 +2252,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2194,6 +2271,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2268,6 +2347,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -2312,6 +2393,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -2419,6 +2502,8 @@ "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -2427,6 +2512,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -2441,6 +2528,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2482,11 +2571,12 @@ "../../../node_modules/core-util-is": { "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -2499,6 +2589,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -2511,6 +2603,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2524,6 +2618,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -2532,6 +2628,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2550,17 +2648,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2614,11 +2718,15 @@ }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -2634,16 +2742,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -2654,9 +2758,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -2672,6 +2774,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -2680,8 +2784,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -2695,8 +2797,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -2708,8 +2808,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2718,8 +2816,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2728,8 +2824,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -2763,6 +2857,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2773,14 +2869,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -2795,6 +2891,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2821,6 +2919,8 @@ "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -2829,6 +2929,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2866,6 +2968,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -2886,6 +2990,8 @@ "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2906,7 +3012,9 @@ "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -2931,8 +3039,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -2944,8 +3050,6 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -2959,6 +3063,8 @@ "version": "0.1.4", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -2979,6 +3085,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -2995,6 +3103,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3011,6 +3121,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3019,6 +3131,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3080,6 +3194,8 @@ "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4017,6 +4133,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4036,6 +4154,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -4060,7 +4180,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -4126,6 +4248,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -4234,8 +4358,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4249,6 +4371,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -4257,6 +4381,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -4268,6 +4394,8 @@ "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4281,6 +4409,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4308,6 +4438,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4322,6 +4454,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4331,6 +4465,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4350,6 +4486,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4361,6 +4499,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -4406,6 +4546,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4427,6 +4569,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -4438,6 +4582,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4450,6 +4596,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -4462,6 +4610,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4470,6 +4620,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4514,6 +4666,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -4562,6 +4716,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -4576,6 +4732,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -4683,6 +4841,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -4707,6 +4867,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -4722,7 +4884,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -4839,8 +5003,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -4856,14 +5018,14 @@ "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -4890,6 +5052,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4902,8 +5066,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4958,7 +5120,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -5230,6 +5394,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5274,6 +5440,8 @@ "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -5285,7 +5453,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -5444,6 +5614,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5465,9 +5637,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -5675,8 +5845,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -5756,6 +5924,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -5767,6 +5937,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -5806,6 +5978,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -5817,6 +5991,8 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -5911,7 +6087,9 @@ "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", @@ -5942,6 +6120,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -5952,6 +6132,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -5984,7 +6166,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -5998,12 +6182,16 @@ "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -6015,7 +6203,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -6029,6 +6219,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6100,6 +6292,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6138,12 +6332,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -6178,7 +6376,9 @@ "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -6213,6 +6413,8 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -6238,6 +6440,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -6246,6 +6450,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -6283,6 +6489,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6291,6 +6499,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -6312,9 +6522,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -6435,6 +6643,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -6471,6 +6681,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -6489,6 +6701,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6500,6 +6714,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6512,6 +6728,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6524,6 +6742,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -6546,9 +6766,7 @@ "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -6806,12 +7024,16 @@ "../../../node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -6824,6 +7046,8 @@ "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -6842,6 +7066,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6853,6 +7079,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6865,6 +7093,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6877,6 +7107,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -6884,7 +7116,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -6894,6 +7128,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6910,6 +7146,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -6933,12 +7171,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6965,14 +7207,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -6996,12 +7238,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -7028,6 +7274,8 @@ "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7041,17 +7289,23 @@ "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -7060,6 +7314,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7185,9 +7441,7 @@ "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -7208,7 +7462,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -7230,6 +7486,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7244,6 +7502,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -7251,7 +7511,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -7265,7 +7527,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -7380,7 +7644,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -7445,8 +7711,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -7500,6 +7764,8 @@ "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -7551,7 +7817,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -7634,6 +7902,8 @@ "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7643,6 +7913,8 @@ "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7656,6 +7928,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -7669,6 +7943,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -7708,6 +7984,8 @@ "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -7715,7 +7993,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -7761,6 +8041,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -7770,6 +8052,8 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -7777,7 +8061,9 @@ "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -7981,6 +8267,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -7994,6 +8282,8 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -8069,7 +8359,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -8115,8 +8407,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -8131,8 +8421,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -8143,7 +8431,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -8170,7 +8460,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -8631,6 +8923,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8734,6 +9028,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -8757,6 +9053,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8771,8 +9069,6 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -8781,6 +9077,8 @@ "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -8836,8 +9134,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -8846,6 +9142,8 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -9091,8 +9389,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -9104,6 +9400,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -9134,6 +9432,8 @@ "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -9142,6 +9442,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -9163,6 +9465,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -9205,8 +9509,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -9401,8 +9703,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -9596,9 +9896,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -9686,6 +9984,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -9699,6 +9999,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index 4ce8cdcdc4..eb70c5c6d2 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -21,7 +21,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -29,7 +30,7 @@ "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index b9561fd2cc..e163cabd93 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -20,7 +20,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -28,38 +29,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -379,6 +393,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -428,6 +444,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -439,6 +457,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -450,8 +470,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -459,7 +477,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -504,7 +524,9 @@ "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", @@ -550,12 +572,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -578,6 +604,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -737,6 +764,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -754,6 +783,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -768,6 +799,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -779,6 +812,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -790,6 +825,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -803,12 +840,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -820,6 +861,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -831,6 +874,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1028,9 +1073,7 @@ "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1054,8 +1097,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1065,8 +1106,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1096,8 +1135,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1106,8 +1143,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1163,6 +1198,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1180,6 +1217,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1196,6 +1235,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1214,6 +1255,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1225,6 +1268,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1238,6 +1283,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1256,6 +1303,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1395,6 +1444,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -1405,7 +1456,9 @@ "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -1440,7 +1493,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -1450,13 +1505,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -1468,13 +1525,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -1496,12 +1555,16 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -1517,6 +1580,8 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -1525,6 +1590,8 @@ "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -1533,7 +1600,9 @@ "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/brace-expansion": { "version": "2.0.1", @@ -1609,6 +1678,8 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -1616,6 +1687,8 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } @@ -1632,6 +1705,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -1640,6 +1715,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -1657,6 +1734,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -1731,6 +1810,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -1775,6 +1856,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -1882,6 +1965,8 @@ "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -1890,6 +1975,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -1904,6 +1991,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1945,11 +2034,12 @@ "../../../node_modules/core-util-is": { "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -1962,6 +2052,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -1974,6 +2066,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1987,6 +2081,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -1995,6 +2091,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2013,17 +2111,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2077,11 +2181,15 @@ }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -2097,16 +2205,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -2117,9 +2221,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -2135,6 +2237,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -2143,8 +2247,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -2158,8 +2260,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -2171,8 +2271,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2181,8 +2279,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2191,8 +2287,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -2226,6 +2320,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2236,14 +2332,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -2258,6 +2354,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2284,6 +2382,8 @@ "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -2292,6 +2392,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2329,6 +2431,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -2349,6 +2453,8 @@ "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2369,7 +2475,9 @@ "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -2394,8 +2502,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -2407,8 +2513,6 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -2422,6 +2526,8 @@ "version": "0.1.4", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -2442,6 +2548,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -2458,6 +2566,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -2474,6 +2584,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -2482,6 +2594,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -2543,6 +2657,8 @@ "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -3128,6 +3244,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -3147,6 +3265,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -3171,7 +3291,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -3237,6 +3359,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -3345,8 +3469,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3360,6 +3482,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -3368,6 +3492,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -3379,6 +3505,8 @@ "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3392,6 +3520,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -3405,6 +3535,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -3419,6 +3551,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3428,6 +3562,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3447,6 +3583,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3458,6 +3596,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -3503,6 +3643,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3524,6 +3666,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -3535,6 +3679,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -3547,6 +3693,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -3559,6 +3707,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3567,6 +3717,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3611,6 +3763,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -3659,6 +3813,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -3673,6 +3829,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -3780,6 +3938,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -3804,6 +3964,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3819,7 +3981,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -3936,8 +4100,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -3953,14 +4115,14 @@ "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -3987,6 +4149,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -3999,8 +4163,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4055,7 +4217,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -4327,6 +4491,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4371,6 +4537,8 @@ "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -4382,7 +4550,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -4541,6 +4711,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -4562,9 +4734,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -4772,8 +4942,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -4853,6 +5021,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -4864,6 +5034,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4903,6 +5075,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -4914,6 +5088,8 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -5008,7 +5184,9 @@ "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", @@ -5039,6 +5217,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -5049,6 +5229,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -5081,7 +5263,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -5095,12 +5279,16 @@ "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -5112,7 +5300,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -5126,6 +5316,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5197,6 +5389,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5235,12 +5429,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -5275,7 +5473,9 @@ "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -5310,6 +5510,8 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -5335,6 +5537,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -5343,6 +5547,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -5380,6 +5586,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5388,6 +5596,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -5409,9 +5619,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -5532,6 +5740,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -5568,6 +5778,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -5586,6 +5798,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -5597,6 +5811,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5609,6 +5825,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -5621,6 +5839,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -5643,9 +5863,7 @@ "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -5901,12 +6119,16 @@ "../../../node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -5919,6 +6141,8 @@ "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -5937,6 +6161,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -5948,6 +6174,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5960,6 +6188,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -5972,6 +6202,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -5979,7 +6211,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -5989,6 +6223,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6005,6 +6241,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -6028,12 +6266,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6060,14 +6302,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -6091,12 +6333,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -6123,6 +6369,8 @@ "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6136,17 +6384,23 @@ "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -6155,6 +6409,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6280,9 +6536,7 @@ "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -6303,7 +6557,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -6325,6 +6581,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -6339,6 +6597,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -6346,7 +6606,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -6360,7 +6622,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -6471,7 +6735,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -6536,8 +6802,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -6591,6 +6855,8 @@ "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -6642,7 +6908,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -6725,6 +6993,8 @@ "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -6734,6 +7004,8 @@ "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -6747,6 +7019,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -6760,6 +7034,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6798,6 +7074,8 @@ "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -6805,7 +7083,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -6851,6 +7131,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -6860,6 +7142,8 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -6867,7 +7151,9 @@ "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -7071,6 +7357,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -7084,6 +7372,8 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -7159,7 +7449,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -7205,8 +7497,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -7221,8 +7511,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -7233,7 +7521,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -7260,7 +7550,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -7369,6 +7661,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -7472,6 +7766,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -7495,6 +7791,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7509,8 +7807,6 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -7519,6 +7815,8 @@ "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -7574,8 +7872,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -7584,6 +7880,8 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -7826,8 +8124,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -7839,6 +8135,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -7869,6 +8167,8 @@ "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -7877,6 +8177,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -7898,6 +8200,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -7940,8 +8244,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -8136,8 +8438,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -8331,9 +8631,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -8421,6 +8719,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -8434,6 +8734,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index fa88b0bb71..1f2d085634 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -26,7 +26,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -34,7 +35,7 @@ "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@discoveryjs/json-ext": { diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 39f771cc94..1a2e108e58 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -26,7 +26,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -34,38 +35,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -737,6 +751,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -970,6 +986,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -981,6 +999,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -992,8 +1012,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -1001,7 +1019,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1046,7 +1066,9 @@ "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", @@ -1092,12 +1114,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1120,6 +1146,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1279,6 +1306,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1296,6 +1325,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1310,6 +1341,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1321,6 +1354,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1332,6 +1367,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1345,12 +1382,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1362,6 +1403,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1373,6 +1416,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1570,9 +1615,7 @@ "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1596,8 +1639,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1607,8 +1648,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1638,8 +1677,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1648,8 +1685,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1705,6 +1740,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1722,6 +1759,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1738,6 +1777,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1756,6 +1797,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1767,6 +1810,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1780,6 +1825,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1798,6 +1845,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1937,6 +1986,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -1947,7 +1998,9 @@ "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -1982,7 +2035,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -1992,13 +2047,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2010,13 +2067,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2038,12 +2097,16 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -2059,6 +2122,8 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -2067,6 +2132,8 @@ "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -2075,7 +2142,9 @@ "../../../node_modules/bluebird": { "version": "3.4.7", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/brace-expansion": { "version": "2.0.1", @@ -2151,6 +2220,8 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -2158,6 +2229,8 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } @@ -2174,6 +2247,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -2182,6 +2257,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2199,6 +2276,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2273,6 +2352,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -2317,6 +2398,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -2424,6 +2507,8 @@ "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -2432,6 +2517,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -2446,6 +2533,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2487,11 +2576,12 @@ "../../../node_modules/core-util-is": { "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -2504,6 +2594,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -2516,6 +2608,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2529,6 +2623,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -2537,6 +2633,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2555,17 +2653,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2619,11 +2723,15 @@ }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -2639,16 +2747,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -2659,9 +2763,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -2677,6 +2779,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -2685,8 +2789,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -2700,8 +2802,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -2713,8 +2813,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2723,8 +2821,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -2733,8 +2829,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -2768,6 +2862,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2778,14 +2874,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -2800,6 +2896,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2826,6 +2924,8 @@ "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -2834,6 +2934,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2871,6 +2973,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -2891,6 +2995,8 @@ "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2911,7 +3017,9 @@ "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -2936,8 +3044,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -2949,8 +3055,6 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -2964,6 +3068,8 @@ "version": "0.1.4", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -2984,6 +3090,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -3000,6 +3108,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3016,6 +3126,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3024,6 +3136,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3085,6 +3199,8 @@ "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4022,6 +4138,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4041,6 +4159,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -4065,7 +4185,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -4131,6 +4253,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -4239,8 +4363,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4254,6 +4376,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -4262,6 +4386,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -4273,6 +4399,8 @@ "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4286,6 +4414,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4313,6 +4443,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4327,6 +4459,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4336,6 +4470,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4355,6 +4491,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4366,6 +4504,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -4411,6 +4551,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4432,6 +4574,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -4443,6 +4587,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4455,6 +4601,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -4467,6 +4615,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4475,6 +4625,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4519,6 +4671,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -4567,6 +4721,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -4581,6 +4737,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -4688,6 +4846,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -4712,6 +4872,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -4727,7 +4889,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -4844,8 +5008,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -4861,14 +5023,14 @@ "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -4895,6 +5057,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4907,8 +5071,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4963,7 +5125,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -5235,6 +5399,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5279,6 +5445,8 @@ "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -5290,7 +5458,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -5449,6 +5619,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5470,9 +5642,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -5680,8 +5850,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -5761,6 +5929,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -5772,6 +5942,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -5811,6 +5983,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -5822,6 +5996,8 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -5916,7 +6092,9 @@ "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", @@ -5947,6 +6125,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -5957,6 +6137,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -5989,7 +6171,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -6003,12 +6187,16 @@ "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -6020,7 +6208,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -6034,6 +6224,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6105,6 +6297,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6143,12 +6337,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -6183,7 +6381,9 @@ "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -6218,6 +6418,8 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -6243,6 +6445,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -6251,6 +6455,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -6288,6 +6494,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6296,6 +6504,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -6317,9 +6527,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -6440,6 +6648,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -6476,6 +6686,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -6494,6 +6706,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6505,6 +6719,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6517,6 +6733,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6529,6 +6747,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -6551,9 +6771,7 @@ "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -6811,12 +7029,16 @@ "../../../node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -6829,6 +7051,8 @@ "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -6847,6 +7071,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6858,6 +7084,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6870,6 +7098,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6882,6 +7112,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -6889,7 +7121,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -6899,6 +7133,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6915,6 +7151,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -6938,12 +7176,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6970,14 +7212,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -7001,12 +7243,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -7033,6 +7279,8 @@ "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7046,17 +7294,23 @@ "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -7065,6 +7319,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7190,9 +7446,7 @@ "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/resolve": { "version": "1.22.8", @@ -7213,7 +7467,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -7235,6 +7491,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7249,6 +7507,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -7256,7 +7516,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -7270,7 +7532,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -7385,7 +7649,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -7450,8 +7716,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -7505,6 +7769,8 @@ "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -7556,7 +7822,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -7639,6 +7907,8 @@ "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7648,6 +7918,8 @@ "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7661,6 +7933,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -7674,6 +7948,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -7713,6 +7989,8 @@ "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -7720,7 +7998,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -7766,6 +8046,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -7775,6 +8057,8 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -7782,7 +8066,9 @@ "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -7986,6 +8272,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -7999,6 +8287,8 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -8074,7 +8364,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -8120,8 +8412,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -8136,8 +8426,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -8148,7 +8436,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -8175,7 +8465,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -8636,6 +8928,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8739,6 +9033,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -8762,6 +9058,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8776,8 +9074,6 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -8786,6 +9082,8 @@ "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -8841,8 +9139,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -8851,6 +9147,8 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -9096,8 +9394,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -9109,6 +9405,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -9139,6 +9437,8 @@ "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -9147,6 +9447,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -9168,6 +9470,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -9210,8 +9514,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -9406,8 +9708,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -9601,9 +9901,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -9691,6 +9989,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -9704,6 +10004,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/package-lock.json b/package-lock.json index 1ee22589e7..95cce58459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -18,38 +19,51 @@ "numcodecs": "^0.3.2" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -61,6 +75,27 @@ "node": ">=0.10.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -85,10 +120,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -105,6 +141,16 @@ "cookie": "^0.7.2" } }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@bundled-es-modules/statuses": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", @@ -124,6 +170,141 @@ "tough-cookie": "^4.1.4" } }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dev": true, + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -134,13 +315,14 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -150,13 +332,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -166,13 +349,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -182,13 +366,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -198,13 +383,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -214,13 +400,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -230,13 +417,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -246,13 +434,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -262,13 +451,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -278,13 +468,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -294,13 +485,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -310,13 +502,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -326,13 +519,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -342,13 +536,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -358,13 +553,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -374,13 +570,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -390,13 +587,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -405,14 +603,32 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -422,13 +638,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -438,13 +655,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -454,13 +672,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -470,13 +689,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -486,13 +706,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -502,13 +723,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -578,10 +800,11 @@ } }, "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -635,10 +858,11 @@ } }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -653,11 +877,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, + "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.10.0", "levn": "^0.4.1" }, "engines": { @@ -816,6 +1042,74 @@ "@types/node": ">=18" } }, + "node_modules/@iodigital/vite-plugin-msw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iodigital/vite-plugin-msw/-/vite-plugin-msw-2.0.0.tgz", + "integrity": "sha512-b4041DewCVSGKQHu5BocPzMSW94/8h59AV6n6umEXHoeqf4nX77ve+gPb/+lmMuPXOtPL1d8465CKyx0ek6Fuw==", + "dev": true, + "dependencies": { + "@mswjs/interceptors": "^0.25.7", + "body-parser": "^1.20.2", + "fs-extra": "^11.1.1", + "headers-polyfill": "^4.0.2", + "strict-event-emitter": "^0.5.1" + }, + "peerDependencies": { + "msw": "^2.0.0" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/@mswjs/interceptors": { + "version": "0.25.16", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.16.tgz", + "integrity": "sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1008,6 +1302,57 @@ "tslib": "2" } }, + "node_modules/@koa/router": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-9.4.0.tgz", + "integrity": "sha512-dOOXgzqaDoHu5qqMEPLKEgLz5CeIA7q8+1W62mCvFVCOqeC71UoTGJ4u1xUSOpIl2J1x2pqrNULkFteUeZW3/A==", + "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.1.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@koa/router/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@koa/router/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@koa/router/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -1146,6 +1491,20 @@ "node": ">=14" } }, + "node_modules/@playwright/browser-chromium": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.49.1.tgz", + "integrity": "sha512-LLeyllKSucbojsJBOpdJshwW27ZXZs3oypqffkVWLUvxX2azHJMOevsOcWpjCfoYbpevkaEozM2xHeSUGF00lg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.49.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.24", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", @@ -1167,6 +1526,8 @@ "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" } ], + "optional": true, + "peer": true, "dependencies": { "spacetrim": "0.11.59" } @@ -1176,6 +1537,8 @@ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", @@ -1194,391 +1557,421 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/binding": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", - "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.8.tgz", + "integrity": "sha512-+/JzXx1HctfgPj+XtsCTbRkxiaOfAXGZZLEvs7jgp04WgWRSZ5u97WRCePNPvy+sCfOEH/2zw2ZK36Z7oQRGhQ==", "dev": true, + "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.1.6", - "@rspack/binding-darwin-x64": "1.1.6", - "@rspack/binding-linux-arm64-gnu": "1.1.6", - "@rspack/binding-linux-arm64-musl": "1.1.6", - "@rspack/binding-linux-x64-gnu": "1.1.6", - "@rspack/binding-linux-x64-musl": "1.1.6", - "@rspack/binding-win32-arm64-msvc": "1.1.6", - "@rspack/binding-win32-ia32-msvc": "1.1.6", - "@rspack/binding-win32-x64-msvc": "1.1.6" + "@rspack/binding-darwin-arm64": "1.1.8", + "@rspack/binding-darwin-x64": "1.1.8", + "@rspack/binding-linux-arm64-gnu": "1.1.8", + "@rspack/binding-linux-arm64-musl": "1.1.8", + "@rspack/binding-linux-x64-gnu": "1.1.8", + "@rspack/binding-linux-x64-musl": "1.1.8", + "@rspack/binding-win32-arm64-msvc": "1.1.8", + "@rspack/binding-win32-ia32-msvc": "1.1.8", + "@rspack/binding-win32-x64-msvc": "1.1.8" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", - "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.8.tgz", + "integrity": "sha512-I7avr471ghQ3LAqKm2fuXuJPLgQ9gffn5Q4nHi8rsukuZUtiLDPfYzK1QuupEp2JXRWM1gG5lIbSUOht3cD6Ug==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", - "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.8.tgz", + "integrity": "sha512-vfqf/c+mcx8rr1M8LnqKmzDdnrgguflZnjGerBLjNerAc+dcUp3lCvNxRIvZ2TkSZZBW8BpCMgjj3n70CZ4VLQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", - "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.8.tgz", + "integrity": "sha512-lZlO/rAJSeozi+qtVLkGSXfe+riPawCwM4FsrflELfNlvvEXpANwtrdJ+LsaNVXcgvhh50ZX2KicTdmx9G2b6Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", - "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.8.tgz", + "integrity": "sha512-bX7exULSZwy8xtDh6Z65b6sRC4uSxGuyvSLCEKyhmG6AnJkg0gQMxk3hoO0hWnyGEZgdJEn+jEhk0fjl+6ZRAQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", - "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.8.tgz", + "integrity": "sha512-2Prw2USgTJ3aLdLExfik8pAwAHbX4MZrACBGEmR7Vbb56kLjC+++fXkciRc50pUDK4JFr1VQ7eNZrJuDR6GG6Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", - "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.8.tgz", + "integrity": "sha512-bnVGB/mQBKEdzOU/CPmcOE3qEXxGOGGW7/i6iLl2MamVOykJq8fYjL9j86yi6L0r009ja16OgWckykQGc4UqGw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", - "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.8.tgz", + "integrity": "sha512-u+na3gxhzeksm4xZyAzn1+XWo5a5j7hgWA/KcFPDQ8qQNkRknx4jnQMxVtcZ9pLskAYV4AcOV/AIximx7zvv8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", - "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.8.tgz", + "integrity": "sha512-FijUxym1INd5fFHwVCLuVP8XEAb4Sk1sMwEEQUlugiDra9ZsLaPw4OgPGxbxkD6SB0DeUz9Zq46Xbcf6d3OgfA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", - "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.8.tgz", + "integrity": "sha512-SBzIcND4qpDt71jlu1MCDxt335tqInT3YID9V4DoQ4t8wgM/uad7EgKOWKTK6vc2RRaOIShfS2XzqjNUxPXh4w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/cli": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.6.tgz", - "integrity": "sha512-404JTAadncCp81sDa7nGZdsT7r1Ry8fALR8Wkp9VMTUhWEFlbDGQvOTyali24pfyJxJTdsarSabmNhbDO5okJw==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.8.tgz", + "integrity": "sha512-LiodoRmv1eAYtGQftPHX5Cr0uBmVUywOXZvnrVipXZupRsl1DNYO6Ao2kYlvSPYi77ymhOBRoxrMqbUOUklbIg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "@rspack/dev-server": "1.0.9", @@ -1739,13 +2132,14 @@ } }, "node_modules/@rspack/core": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", - "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.8.tgz", + "integrity": "sha512-pcZtcj5iXLCuw9oElTYC47bp/RQADm/MMEb3djHdwJuSlFWfWPQi5QFgJ/lJAxIW9UNHnTFrYtytycfjpuoEcA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime-tools": "0.5.1", - "@rspack/binding": "1.1.6", + "@rspack/binding": "1.1.8", "@rspack/lite-tapable": "1.0.1", "caniuse-lite": "^1.0.30001616" }, @@ -1961,6 +2355,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -1976,10 +2371,11 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.0.tgz", + "integrity": "sha512-+jsfK7kVJbqnCYtLTln8Ja/NmVrZRwBJHmHR9IxIVccMWSOZ6Oy0FkDJNeyVu4QSpMNmRfy10Xb76ObRDlWWBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -1992,13 +2388,16 @@ "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.5", @@ -2126,6 +2525,15 @@ "@types/node": "*" } }, + "node_modules/@types/http-server": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/http-server/-/http-server-0.12.4.tgz", + "integrity": "sha512-vsn4pvP2oRFALLuM5Rca6qUmSPG7u0VNjOuqvL57l3bKldQRWdUZPeSiARhzagDxgfNCHn/o8WlWk4KinBauUg==", + "dev": true, + "dependencies": { + "@types/connect": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -2150,6 +2558,17 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2184,10 +2603,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.20.0" } @@ -2219,6 +2639,15 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/s3rver": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/s3rver/-/s3rver-3.7.4.tgz", + "integrity": "sha512-CMCmdNszxS2FsIznWvBMVCl6fpvr5ueaFCaY0iSoH7Ud5maGcLghukpDvsXBnIcp92cv2HeVnVqI1p8yPcab9Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -2253,7 +2682,9 @@ "version": "8.1.5", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/sockjs": { "version": "0.3.36", @@ -2285,11 +2716,19 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true + }, "node_modules/@types/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/ws": { "version": "8.5.10", @@ -2321,25 +2760,27 @@ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", - "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz", + "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/type-utils": "8.18.0", - "@typescript-eslint/utils": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/type-utils": "8.20.0", + "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2355,15 +2796,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", - "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4" }, "engines": { @@ -2379,13 +2821,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", + "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2396,15 +2839,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", - "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz", + "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/utils": "8.20.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2419,10 +2863,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz", + "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2432,19 +2877,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz", + "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2458,15 +2904,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz", + "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2481,12 +2928,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz", + "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/types": "8.20.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2502,6 +2950,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2510,19 +2959,20 @@ } }, "node_modules/@vitest/browser": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.8.tgz", - "integrity": "sha512-OWVvEJThRgxlNMYNVLEK/9qVkpRcLvyuKLngIV3Hob01P56NjPHprVBYn+rx4xAJudbM9yrCrywPIEuA3Xyo8A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.0.2.tgz", + "integrity": "sha512-EVXRQTEmwyCNh6qDXIf/fGWp3YXa3KtsMCOXmlD4Yeq62pJaqJ5+iUIY1XLN7TO2iXatGDdLZYbHbR6YQT4FDw==", "dev": true, + "license": "MIT", "dependencies": { "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.5.2", - "@vitest/mocker": "2.1.8", - "@vitest/utils": "2.1.8", - "magic-string": "^0.30.12", - "msw": "^2.6.4", + "@testing-library/user-event": "^14.6.0", + "@vitest/mocker": "3.0.2", + "@vitest/utils": "3.0.2", + "magic-string": "^0.30.17", + "msw": "^2.7.0", "sirv": "^3.0.0", - "tinyrainbow": "^1.2.0", + "tinyrainbow": "^2.0.0", "ws": "^8.18.0" }, "funding": { @@ -2530,7 +2980,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "2.1.8", + "vitest": "3.0.2", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -2560,36 +3010,38 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", - "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.2.tgz", + "integrity": "sha512-dKSHLBcoZI+3pmP5hiZ7I5grNru2HRtEW8Z5Zp4IXog8QYcxhlox7JUPyIIFWfN53+3HW3KPLIl6nSzUGgKSuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.8", - "@vitest/utils": "2.1.8", + "@vitest/spy": "3.0.2", + "@vitest/utils": "3.0.2", "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", - "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.2.tgz", + "integrity": "sha512-Hr09FoBf0jlwwSyzIF4Xw31OntpO3XtZjkccpcBf8FeVW3tpiyKlkeUzxS/txzHqpUCNIX157NaTySxedyZLvA==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.8", + "@vitest/spy": "3.0.2", "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" + "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0" + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "msw": { @@ -2601,49 +3053,53 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", - "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.2.tgz", + "integrity": "sha512-yBohcBw/T/p0/JRgYD+IYcjCmuHzjC3WLAKsVE4/LwiubzZkE8N49/xIQ/KGQwDRA8PaviF8IRO8JMWMngdVVQ==", "dev": true, + "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", - "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.2.tgz", + "integrity": "sha512-GHEsWoncrGxWuW8s405fVoDfSLk6RF2LCXp6XhevbtDjdDme1WV/eNmUueDfpY1IX3MJaCRelVCEXsT9cArfEg==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.8", - "pathe": "^1.1.2" + "@vitest/utils": "3.0.2", + "pathe": "^2.0.1" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", - "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.2.tgz", + "integrity": "sha512-h9s67yD4+g+JoYG0zPCo/cLTabpDqzqNdzMawmNPzDStTiwxwkyYM1v5lWE8gmGv3SVJ2DcxA2NpQJZJv9ym3g==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.8", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" + "@vitest/pretty-format": "3.0.2", + "magic-string": "^0.30.17", + "pathe": "^2.0.1" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", - "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.2.tgz", + "integrity": "sha512-8mI2iUn+PJFMT44e3ISA1R+K6ALVs47W6eriDTfXe6lFqlflID05MB4+rIFhmDSLBj8iBsZkzBYlgSkinxLzSQ==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" }, @@ -2652,24 +3108,25 @@ } }, "node_modules/@vitest/ui": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.8.tgz", - "integrity": "sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.0.2.tgz", + "integrity": "sha512-R0E4nG0OAafsCKwKnENLdjpMbxAyDqT/hdbJp71eeAR1wE+C7IFv1G158sRj5gUfJ7pM7IxtcwIqa34beYzLhg==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.8", + "@vitest/utils": "3.0.2", "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", + "flatted": "^3.3.2", + "pathe": "^2.0.1", "sirv": "^3.0.0", "tinyglobby": "^0.2.10", - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.1.8" + "vitest": "3.0.2" } }, "node_modules/@vitest/ui/node_modules/sirv": { @@ -2677,6 +3134,7 @@ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -2687,17 +3145,34 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", - "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-Qu01ZYZlgHvDP02JnMBRpX43nRaZtNpIzw3C1clDXmn8eakgX6iQVGzTQ/NjkIr64WD8ioqOjkaYRVvHQI5qiw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.8", + "@vitest/pretty-format": "3.0.2", "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/web-worker": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-3.0.2.tgz", + "integrity": "sha512-38hmHAp2tB7H9VPUzFOb4rKFStjE0lRCE8k4ljunTDfkvndi68/6XK8UKADAikwDKcmEdsXldJIJxAFhr9RfVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "3.0.2" } }, "node_modules/@wdio/config": { @@ -2705,6 +3180,8 @@ "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "9.1.3", "@wdio/types": "9.2.2", @@ -2723,6 +3200,8 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -2743,6 +3222,8 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -2757,13 +3238,17 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@wdio/config/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -2780,6 +3265,8 @@ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -2795,6 +3282,8 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -2807,6 +3296,8 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2819,6 +3310,8 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2833,13 +3326,17 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@wdio/repl": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -2852,6 +3349,8 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -2860,13 +3359,17 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@wdio/types": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -2879,6 +3382,8 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -2887,13 +3392,17 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@wdio/utils": { "version": "9.2.8", "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^2.2.0", "@wdio/logger": "9.1.3", @@ -3110,6 +3619,8 @@ "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", "dev": true, + "optional": true, + "peer": true, "engines": { "bun": ">=0.7.0", "deno": ">=1.0.0", @@ -3141,6 +3652,8 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -3363,6 +3876,8 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -3381,6 +3896,8 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -3399,6 +3916,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -3408,6 +3927,8 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -3428,6 +3949,8 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -3442,13 +3965,17 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/archiver-utils/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -3465,6 +3992,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -3481,6 +4010,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3490,6 +4021,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -3499,6 +4032,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -3515,6 +4050,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3689,6 +4226,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -3698,6 +4236,8 @@ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -3745,15 +4285,17 @@ } }, "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/b4a": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -3765,7 +4307,8 @@ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "node_modules/bare-fs": { "version": "2.3.5", @@ -3773,6 +4316,7 @@ "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-path": "^2.0.0", @@ -3784,7 +4328,8 @@ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "node_modules/bare-path": { "version": "2.1.3", @@ -3792,6 +4337,7 @@ "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -3802,6 +4348,7 @@ "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", "dev": true, "optional": true, + "peer": true, "dependencies": { "streamx": "^2.21.0" } @@ -3824,13 +4371,35 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true, + "peer": true + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } @@ -3935,7 +4504,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -4015,6 +4586,8 @@ "url": "https://feross.org/support" } ], + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -4025,6 +4598,8 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8.0.0" } @@ -4052,6 +4627,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "dev": true, + "dependencies": { + "dicer": "0.3.0" + }, + "engines": { + "node": ">=4.5.0" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -4066,10 +4653,24 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -4156,6 +4757,7 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -4188,6 +4790,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 16" } @@ -4197,6 +4800,8 @@ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -4222,6 +4827,8 @@ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -4239,6 +4846,8 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -4255,6 +4864,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -4269,6 +4880,8 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -4284,7 +4897,9 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "dependencies": { + "optional": true, + "peer": true, + "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" @@ -4293,23 +4908,13 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/cheerio/node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -4324,6 +4929,8 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -4339,6 +4946,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -4348,18 +4957,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/cheerio/node_modules/htmlparser2": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", @@ -4372,6 +4969,8 @@ "url": "https://github.com/sponsors/fb55" } ], + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -4379,27 +4978,6 @@ "entities": "^4.5.0" } }, - "node_modules/cheerio/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4545,11 +5123,31 @@ "node": ">=0.10.0" } }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, "node_modules/codemirror": { "version": "5.65.16", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4566,12 +5164,47 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dev": true, + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4588,6 +5221,8 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -4597,6 +5232,8 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -4613,6 +5250,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -4622,6 +5261,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -4638,6 +5279,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -4757,12 +5400,13 @@ } }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, "node_modules/cookie-signature": { @@ -4771,11 +5415,25 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/core-js": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", - "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -4787,11 +5445,20 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -4804,6 +5471,8 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -4817,6 +5486,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -4826,6 +5497,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -4842,6 +5515,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -4898,19 +5573,25 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/css-value": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 6" }, @@ -4936,11 +5617,17 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, + "license": "MIT", "dependencies": { - "cssom": "0.3.x" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/dashdash": { @@ -4959,34 +5646,23 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 12" } }, "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "node_modules/data-urls/node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/data-view-buffer": { @@ -5068,6 +5744,8 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5075,15 +5753,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5094,6 +5785,8 @@ "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } @@ -5189,6 +5882,8 @@ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -5206,6 +5901,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5240,6 +5941,18 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dev": true, + "dependencies": { + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=4.5.0" + } + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -5256,7 +5969,8 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/domelementtype": { "version": "2.3.0", @@ -5268,7 +5982,9 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "optional": true, + "peer": true }, "node_modules/domexception": { "version": "1.0.1", @@ -5279,6 +5995,11 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, "node_modules/dunder-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", @@ -5318,6 +6039,8 @@ "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -5335,6 +6058,8 @@ "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.38.0", "@zip.js/zip.js": "^2.7.48", @@ -5353,6 +6078,8 @@ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -5368,6 +6095,8 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5380,6 +6109,8 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -5392,6 +6123,8 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -5401,6 +6134,8 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5416,6 +6151,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -5484,6 +6221,12 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -5498,6 +6241,8 @@ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" @@ -5511,6 +6256,8 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5518,23 +6265,13 @@ "node": ">=0.10.0" } }, - "node_modules/encoding-sniffer/node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -5552,6 +6289,18 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.23.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", @@ -5631,10 +6380,11 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -5689,11 +6439,12 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -5701,30 +6452,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -5759,6 +6511,8 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -5776,18 +6530,19 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", + "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", @@ -5795,7 +6550,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -6247,6 +7002,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -6273,7 +7029,9 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "engines": { + "optional": true, + "peer": true, + "engines": { "node": ">=6" } }, @@ -6350,6 +7108,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -6457,6 +7216,8 @@ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -6472,6 +7233,31 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/extract-zip/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/extract-zip/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6489,7 +7275,9 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -6550,6 +7338,8 @@ "url": "https://paypal.me/naturalintelligence" } ], + "optional": true, + "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -6583,10 +7373,19 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pend": "~1.2.0" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -6602,6 +7401,8 @@ "url": "https://paypal.me/jimmywarting" } ], + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -6711,9 +7512,16 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "dev": true }, "node_modules/follow-redirects": { @@ -6768,11 +7576,27 @@ "node": "*" } }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -6798,6 +7622,29 @@ "node": ">= 0.6" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6854,6 +7701,8 @@ "integrity": "sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^9.0.0", "@zip.js/zip.js": "^2.7.48", @@ -6876,6 +7725,8 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -6885,6 +7736,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -6931,6 +7784,8 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -6943,6 +7798,8 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -6987,6 +7844,8 @@ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -7001,6 +7860,8 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -7019,10 +7880,11 @@ "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" }, "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^4.0.1", @@ -7126,13 +7988,16 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/graphql": { "version": "16.9.0", @@ -7269,6 +8134,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/headers-polyfill": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", @@ -7288,11 +8162,15 @@ } }, "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, "dependencies": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/html-entities": { @@ -7321,7 +8199,56 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", - "dev": true + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -7414,6 +8341,69 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-server/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -7450,6 +8440,12 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-number": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", + "integrity": "sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==", + "dev": true + }, "node_modules/hyperdyperid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", @@ -7500,7 +8496,9 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true, + "peer": true }, "node_modules/ignore": { "version": "5.3.1", @@ -7522,52 +8520,290 @@ "xmldom": "^0.1.27" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dependencies": { + "cssom": "0.3.x" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" + "node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", + "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + }, + "node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/ikonate/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/ikonate/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ikonate/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "optional": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -7597,6 +8833,8 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -7609,7 +8847,9 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ipaddr.js": { "version": "2.1.0", @@ -7636,6 +8876,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -7933,6 +9179,8 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -7952,6 +9200,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-regex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", @@ -8311,149 +9565,56 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsdom": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", - "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "dev": true, + "license": "MIT", "dependencies": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", - "ws": "^4.0.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/jsdom/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { - "node": ">=4.0" - } - }, - "node_modules/jsdom/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "node": ">=18" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "peerDependencies": { + "canvas": "^3.0.0" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/jsdom/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/jsdom/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/jsdom/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "tldts": "^6.1.32" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "node": ">=16" } }, "node_modules/json-buffer": { @@ -8491,6 +9652,15 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -8510,6 +9680,8 @@ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -8521,7 +9693,21 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/keyv": { "version": "4.5.4", @@ -8543,6 +9729,203 @@ "node": ">=0.10.0" } }, + "node_modules/koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-logger": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-logger/-/koa-logger-3.2.1.tgz", + "integrity": "sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==", + "dev": true, + "dependencies": { + "bytes": "^3.1.0", + "chalk": "^2.4.2", + "humanize-number": "0.0.2", + "passthrough-counter": "^1.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-logger/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/koa-logger/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa-logger/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/koa-logger/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/koa-logger/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/koa-logger/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/koa-logger/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/koa-logger/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true + }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", @@ -8558,6 +9941,8 @@ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -8589,6 +9974,8 @@ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "immediate": "~3.0.5" } @@ -8619,7 +10006,9 @@ "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" } ], - "dependencies": { + "optional": true, + "peer": true, + "dependencies": { "@promptbook/utils": "0.69.5", "type-fest": "4.26.0", "userhome": "1.0.1" @@ -8630,6 +10019,8 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -8666,7 +10057,9 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -8683,13 +10076,34 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "dev": true + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dev": true, + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -8702,13 +10116,16 @@ "version": "0.8.4", "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/loupe": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "11.0.0", @@ -8724,15 +10141,17 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { - "version": "0.30.15", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz", - "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -8888,6 +10307,18 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -8904,9 +10335,9 @@ "dev": true }, "node_modules/msw": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.6.8.tgz", - "integrity": "sha512-nxXxnH6WALZ9a7rsQp4HU2AaD4iGAiouMmE/MY4al7pXTibgA6OZOuKhmN2WBIM6w9qMKwRtX8p2iOb45B2M/Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.0.tgz", + "integrity": "sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -8919,12 +10350,12 @@ "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", "strict-event-emitter": "^0.5.1", "type-fest": "^4.26.1", "yargs": "^17.7.2" @@ -9027,6 +10458,8 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -9054,6 +10487,8 @@ "url": "https://paypal.me/jimmywarting" } ], + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -9063,6 +10498,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -9133,6 +10570,8 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -9188,6 +10627,12 @@ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9316,10 +10761,21 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -9335,6 +10791,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -9420,6 +10882,8 @@ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", @@ -9439,6 +10903,8 @@ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -9465,15 +10931,24 @@ } }, "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" @@ -9487,6 +10962,8 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -9497,35 +10974,13 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5-parser-stream": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "parse5": "^7.0.0" }, @@ -9533,30 +10988,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-parser-stream/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-parser-stream/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -9566,6 +10997,12 @@ "node": ">= 0.8" } }, + "node_modules/passthrough-counter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz", + "integrity": "sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9612,16 +11049,18 @@ "dev": true }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true, + "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16" } @@ -9630,7 +11069,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/performance-now": { "version": "2.1.0", @@ -9655,11 +11095,90 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -9817,6 +11336,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -9831,6 +11351,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9843,6 +11364,8 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" } @@ -9858,6 +11381,8 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -9894,6 +11419,8 @@ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -9913,6 +11440,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -9921,7 +11450,9 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/psl": { "version": "1.9.0", @@ -9933,6 +11464,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -9958,7 +11491,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/querystringify": { "version": "2.2.0", @@ -9990,7 +11525,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/randombytes": { "version": "2.1.0", @@ -10040,7 +11577,8 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/readable-stream": { "version": "2.3.8", @@ -10074,6 +11612,8 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -10083,6 +11623,8 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10140,7 +11682,8 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", @@ -10323,6 +11866,8 @@ "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -10331,7 +11876,9 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/retry": { "version": "0.13.1", @@ -10356,7 +11903,9 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/rimraf": { "version": "5.0.10", @@ -10431,10 +11980,11 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -10446,28 +11996,35 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -10503,35 +12060,87 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safaridriver": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", - "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "node_modules/s3rver": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/s3rver/-/s3rver-3.7.1.tgz", + "integrity": "sha512-H9KIX6n8NqcfoE4ziFNbQASBQfjcNJgb+3wbT9L5iotEqfOncFO1c38cfJSFSo7xXTu1zM9HA6t2u9xKNlYRaA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "@koa/router": "^9.0.0", + "busboy": "^0.3.1", + "commander": "^5.0.0", + "fast-xml-parser": "^3.12.19", + "fs-extra": "^8.0.0", + "he": "^1.2.0", + "koa": "^2.7.0", + "koa-logger": "^3.2.0", + "lodash": "^4.17.5", + "statuses": "^2.0.0", + "winston": "^3.0.0" }, - "engines": { - "node": ">=0.4" + "bin": { + "s3rver": "bin/s3rver.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.3.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ + "node_modules/s3rver/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/s3rver/node_modules/fast-xml-parser": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", + "dev": true, + "dependencies": { + "strnum": "^1.0.4" + }, + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/safaridriver": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", + "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" @@ -10563,15 +12172,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } }, "node_modules/schema-utils": { "version": "3.3.0", @@ -10593,6 +12223,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -10676,6 +12312,8 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -10826,7 +12464,9 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -10972,6 +12612,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -10991,6 +12640,8 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -11021,6 +12672,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -11035,6 +12688,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -11088,7 +12743,9 @@ "type": "github", "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" } - ] + ], + "optional": true, + "peer": true }, "node_modules/spdy": { "version": "4.0.2", @@ -11139,6 +12796,8 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -11147,7 +12806,9 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/sshpk": { "version": "1.18.0", @@ -11179,6 +12840,15 @@ "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -11208,11 +12878,22 @@ "node": ">=0.10.0" } }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/streamx": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -11461,6 +13142,8 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -11475,6 +13158,8 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -11550,10 +13235,18 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -11570,7 +13263,9 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/thunky": { "version": "1.1.0", @@ -11585,16 +13280,18 @@ "dev": true }, "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "dev": true + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, + "license": "MIT", "dependencies": { "fdir": "^6.4.2", "picomatch": "^4.0.2" @@ -11604,10 +13301,11 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, + "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -11622,6 +13320,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11639,10 +13338,11 @@ } }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -11652,10 +13352,29 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.70.tgz", + "integrity": "sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.70" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.70.tgz", + "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==", + "dev": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11702,11 +13421,15 @@ } }, "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, "dependencies": { - "punycode": "^2.1.0" + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/tree-dump": { @@ -11725,23 +13448,34 @@ "tslib": "2" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-checker-rspack-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.0.3.tgz", - "integrity": "sha512-K5BUrytoFju1Olu11T49vlYvDEGOguBF1CBCl4o2ARxDGPoJHHf7fBzLlK0YYkUqI5EFA5cMRUC6332M7hQBHw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.1.tgz", + "integrity": "sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "@rspack/lite-tapable": "^1.0.0", @@ -11793,6 +13527,15 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, "node_modules/tsx": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", @@ -12268,6 +14011,8 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -12363,10 +14108,11 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12376,14 +14122,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.0.tgz", - "integrity": "sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.20.0.tgz", + "integrity": "sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.18.0", - "@typescript-eslint/parser": "8.18.0", - "@typescript-eslint/utils": "8.18.0" + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@typescript-eslint/utils": "8.20.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12417,6 +14164,8 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -12441,6 +14190,8 @@ "url": "https://feross.org/support" } ], + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12451,6 +14202,8 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=18.17" } @@ -12461,6 +14214,18 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -12519,6 +14284,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -12533,13 +14304,17 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/userhome": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -12577,552 +14352,161 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", - "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vite": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/vite-node": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.2.tgz", + "integrity": "sha512-hsEQerBAHvVAbv40m3TFQe/lTEbOp7yDpyqMJqr2Tnd+W58+DEYOt+fluQgekOePcsNBmR77lpVAnIU2Xu4SvQ==", "dev": true, - "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.1", + "vite": "^5.0.0 || ^6.0.0" + }, "bin": { - "esbuild": "bin/esbuild" + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", - "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", - "dev": true, - "dependencies": { - "@vitest/expect": "2.1.8", - "@vitest/mocker": "2.1.8", - "@vitest/pretty-format": "^2.1.8", - "@vitest/runner": "2.1.8", - "@vitest/snapshot": "2.1.8", - "@vitest/spy": "2.1.8", - "@vitest/utils": "2.1.8", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.2.tgz", + "integrity": "sha512-5bzaHakQ0hmVVKLhfh/jXf6oETDBtgPo8tQCHYB+wftNgFJ+Hah67IsWc8ivx4vFL025Ow8UiuTf4W57z4izvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.2", + "@vitest/mocker": "3.0.2", + "@vitest/pretty-format": "^3.0.2", + "@vitest/runner": "3.0.2", + "@vitest/snapshot": "3.0.2", + "@vitest/spy": "3.0.2", + "@vitest/utils": "3.0.2", "chai": "^5.1.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", + "magic-string": "^0.30.17", + "pathe": "^2.0.1", "std-env": "^3.8.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.8", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.2", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.8", - "@vitest/ui": "2.1.8", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.2", + "@vitest/ui": "3.0.2", "happy-dom": "*", "jsdom": "*" }, @@ -13156,11 +14540,25 @@ "browser-process-hrtime": "^1.0.0" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/wait-port": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -13202,6 +14600,8 @@ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -13211,6 +14611,8 @@ "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.4.1.tgz", "integrity": "sha512-vFDdxMj/9W1+6jhpHSiRYfO8dix23HjAUtLx7aOv9ejEsntC0EzCIAftJ59YsF3Ppu184+FkdDVhnivpkZPTFw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -13232,6 +14634,8 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -13240,13 +14644,17 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/webdriverio": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.4.1.tgz", "integrity": "sha512-XIPtRnxSES4CoxH2BfUY/6QzNgEgJEUjMYu7t7SJR8bVfbLRVXAA1ie9kM0MtdLs4oZ2Pr8rR8fqytsA1CjEWw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", @@ -13293,6 +14701,8 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -13301,12 +14711,18 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/webpack": { "version": "5.97.1", @@ -13589,26 +15005,49 @@ } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, "dependencies": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } }, "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -13727,6 +15166,70 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "dev": true, + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dev": true, + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -13826,7 +15329,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ws": { "version": "8.18.0", @@ -13850,9 +15355,19 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "node_modules/xmldom": { "version": "0.1.31", @@ -13920,13 +15435,17 @@ } }, "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/yauzl/node_modules/buffer-crc32": { @@ -13938,6 +15457,15 @@ "node": "*" } }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -13967,6 +15495,8 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -13981,6 +15511,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -13990,6 +15522,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14006,6 +15540,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } diff --git a/package.json b/package.json index 235bf26fbb..2473cb3a1e 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "git+https://github.com/google/neuroglancer.git" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" }, "browserslist": [ "last 2 Chrome versions", @@ -41,39 +41,53 @@ "version": "tsx ./build_tools/after-version-change.ts" }, "devDependencies": { - "@eslint/js": "^9.16.0", - "@rspack/cli": "^1.1.6", - "@rspack/core": "^1.1.6", + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.2", + "@types/node": "^22.10.7", "@types/nunjucks": "^3.2.6", + "@types/s3rver": "^3.7.4", "@types/yargs": "^17.0.33", - "@vitest/browser": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.24.0", - "eslint": "^9.16.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-rspack-plugin": "^4.2.1", - "glob": "^11.0.0", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", "nunjucks": "^3.2.4", + "playwright": "^1.49.1", "prettier": "3.4.2", - "ts-checker-rspack-plugin": "^1.0.3", + "s3rver": "^3.7.1", + "ts-checker-rspack-plugin": "^1.1.1", "tsx": "^4.19.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vitest": "^2.1.8", - "webdriverio": "^9.4.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", "webpack-merge": "^6.0.1", - "yargs": "^17.7.2" + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "dependencies": { "codemirror": "^5.61.1", - "core-js": "^3.39.0", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", @@ -99,286 +113,357 @@ "#src/third_party/jpgjs/jpg.js": "./src/third_party/jpgjs/jpg.js", "#src/*.js": "./src/*.ts", "#src/*": "./src/*", + "#tests/fixtures/msw": { + "node": "./tests/fixtures/msw_node.ts", + "default": "./tests/fixtures/msw_browser.ts" + }, + "#tests/fixtures/gl": { + "node": "./tests/fixtures/gl_node.ts", + "default": "./tests/fixtures/gl_browser.ts" + }, + "#tests/*.js": "./tests/*.ts", "#testdata/*": "./testdata/*", "#datasource/boss/backend": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/backend.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/backend.ts" }, "#datasource/boss/async_computation": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/async_computation.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/async_computation.ts" }, "#datasource/boss/register_default": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_default.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/register_default.ts" }, "#datasource/boss/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_credentials_provider.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/register_credentials_provider.ts" }, "#datasource/brainmaps/backend": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/backend.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/backend.ts" }, "#datasource/brainmaps/async_computation": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/async_computation.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/async_computation.ts" }, "#datasource/brainmaps/register_default": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_default.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/register_default.ts" }, "#datasource/brainmaps/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_credentials_provider.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/register_credentials_provider.ts" }, "#datasource/deepzoom/backend": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/backend.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/backend.ts" }, "#datasource/deepzoom/async_computation": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/async_computation.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/async_computation.ts" }, "#datasource/deepzoom/register_default": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/register_default.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/register_default.ts" }, "#datasource/dvid/backend": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/backend.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/backend.ts" }, "#datasource/dvid/async_computation": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/async_computation.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/async_computation.ts" }, "#datasource/dvid/register_default": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_default.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/register_default.ts" }, "#datasource/dvid/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_credentials_provider.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/register_credentials_provider.ts" }, "#datasource/graphene/backend": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/backend.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/backend.ts" }, "#datasource/graphene/async_computation": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/async_computation.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/async_computation.ts" }, "#datasource/graphene/register_default": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/register_default.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/register_default.ts" }, - "#datasource/middleauth/register_credentials_provider": { - "neuroglancer/python": "./src/util/false.ts", - "neuroglancer/datasource/middleauth:enabled": "./src/datasource/middleauth/register_credentials_provider.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/middleauth:disabled": "./src/datasource/middleauth/register_credentials_provider.ts", - "default": "./src/datasource/middleauth/register_credentials_provider.ts" - }, "#datasource/n5/backend": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/backend.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/backend.ts" }, "#datasource/n5/async_computation": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/async_computation.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/async_computation.ts" }, "#datasource/n5/register_default": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/register_default.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/register_default.ts" }, - "#datasource/ngauth/register_credentials_provider": { - "neuroglancer/python": "./src/util/false.ts", - "neuroglancer/datasource/ngauth:enabled": "./src/datasource/ngauth/register_credentials_provider.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/ngauth:disabled": "./src/datasource/ngauth/register_credentials_provider.ts", - "default": "./src/datasource/ngauth/register_credentials_provider.ts" - }, "#datasource/nggraph/backend": { "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/backend.ts", + "neuroglancer/datasource/nggraph:disabled": "./src/util/false.ts", "default": "./src/datasource/nggraph/backend.ts" }, "#datasource/nggraph/register_default": { "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/register_default.ts", + "neuroglancer/datasource/nggraph:disabled": "./src/util/false.ts", "default": "./src/datasource/nggraph/register_default.ts" }, "#datasource/nifti/backend": { "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/backend.ts", + "neuroglancer/datasource/nifti:disabled": "./src/util/false.ts", "default": "./src/datasource/nifti/backend.ts" }, "#datasource/nifti/register_default": { "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/register_default.ts", + "neuroglancer/datasource/nifti:disabled": "./src/util/false.ts", "default": "./src/datasource/nifti/register_default.ts" }, "#datasource/obj/backend": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/backend.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/backend.ts" }, "#datasource/obj/async_computation": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/async_computation.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/async_computation.ts" }, "#datasource/obj/register_default": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/register_default.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/register_default.ts" }, "#datasource/precomputed/backend": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/backend.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/backend.ts" }, "#datasource/precomputed/async_computation": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/async_computation.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/async_computation.ts" }, "#datasource/precomputed/register_default": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/register_default.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/register_default.ts" }, "#datasource/python/backend": { "neuroglancer/python": "./src/datasource/python/backend.ts", "default": "./src/util/false.ts" }, + "#datasource/python/register_default": { + "neuroglancer/python": "./src/datasource/python/register_default.ts", + "default": "./src/util/false.ts" + }, "#datasource/render/backend": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/backend.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/backend.ts" }, "#datasource/render/async_computation": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/async_computation.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/async_computation.ts" }, "#datasource/render/register_default": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/register_default.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/register_default.ts" }, "#datasource/vtk/backend": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/backend.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/backend.ts" }, "#datasource/vtk/async_computation": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/async_computation.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/async_computation.ts" }, "#datasource/vtk/register_default": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/register_default.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/register_default.ts" }, "#datasource/zarr/backend": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/backend.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/backend.ts" }, "#datasource/zarr/async_computation": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/async_computation.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/async_computation.ts" }, "#datasource/zarr/register_default": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/register_default.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/register_default.ts" }, + "#kvstore/byte_range/register": { + "neuroglancer/kvstore/byte_range:enabled": "./src/kvstore/byte_range/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/byte_range:disabled": "./src/util/false.ts", + "default": "./src/kvstore/byte_range/register.ts" + }, + "#kvstore/gcs/register": { + "neuroglancer/kvstore/gcs:enabled": "./src/kvstore/gcs/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/gcs:disabled": "./src/util/false.ts", + "default": "./src/kvstore/gcs/register.ts" + }, + "#kvstore/gzip/register": { + "neuroglancer/kvstore/gzip:enabled": "./src/kvstore/gzip/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/gzip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/gzip/register.ts" + }, + "#kvstore/http/register": { + "neuroglancer/kvstore/http:enabled": "./src/kvstore/http/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/http:disabled": "./src/util/false.ts", + "default": "./src/kvstore/http/register.ts" + }, + "#kvstore/middleauth/register": { + "neuroglancer/kvstore/middleauth:enabled": "./src/kvstore/middleauth/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/middleauth/register.ts" + }, + "#kvstore/middleauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:enabled": "./src/kvstore/middleauth/register_credentials_provider.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/middleauth/register_credentials_provider.ts" + }, + "#kvstore/ngauth/register": { + "neuroglancer/kvstore/ngauth:enabled": "./src/kvstore/ngauth/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ngauth/register.ts" + }, + "#kvstore/ngauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:enabled": "./src/kvstore/ngauth/register_credentials_provider.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ngauth/register_credentials_provider.ts" + }, + "#kvstore/s3/register": { + "neuroglancer/kvstore/s3:enabled": "./src/kvstore/s3/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/s3:disabled": "./src/util/false.ts", + "default": "./src/kvstore/s3/register.ts" + }, + "#kvstore/zip/register_frontend": { + "neuroglancer/kvstore/zip:enabled": "./src/kvstore/zip/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/zip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/zip/register_frontend.ts" + }, + "#kvstore/zip/register_backend": { + "neuroglancer/kvstore/zip:enabled": "./src/kvstore/zip/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/zip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/zip/register_backend.ts" + }, "#layer/annotation": { "neuroglancer/layer/annotation:enabled": "./src/layer/annotation/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/annotation:disabled": "./src/util/false.ts", "default": "./src/layer/annotation/index.ts" }, "#layer/image": { "neuroglancer/layer/image:enabled": "./src/layer/image/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/image:disabled": "./src/util/false.ts", "default": "./src/layer/image/index.ts" }, "#layer/segmentation": { "neuroglancer/layer/segmentation:enabled": "./src/layer/segmentation/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/segmentation:disabled": "./src/util/false.ts", "default": "./src/layer/segmentation/index.ts" }, "#layer/single_mesh": { "neuroglancer/layer/single_mesh:enabled": "./src/layer/single_mesh/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/single_mesh:disabled": "./src/util/false.ts", "default": "./src/layer/single_mesh/index.ts" }, "#main": { diff --git a/pyproject.toml b/pyproject.toml index 3474d58d80..c78059e51e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ exclude = [ "/guide_video_recorder/", "^docs/", "^build/", + "^testdata/", ] [[tool.mypy.overrides]] diff --git a/python/neuroglancer/write_annotations.py b/python/neuroglancer/write_annotations.py index 6e1d3f87c6..8a204e0fc1 100644 --- a/python/neuroglancer/write_annotations.py +++ b/python/neuroglancer/write_annotations.py @@ -174,11 +174,11 @@ def _add_two_point_obj( def _add_obj(self, coords: Sequence[float], id: Optional[int], **kwargs): encoded = np.zeros(shape=(), dtype=self.dtype) - encoded[()]["geometry"] = coords + encoded[()]["geometry"] = coords # type: ignore[call-overload] for i, p in enumerate(self.properties): if p.id in kwargs: - encoded[()][f"property{i}"] = kwargs.pop(p.id) + encoded[()][f"property{i}"] = kwargs.pop(p.id) # type: ignore[call-overload] related_ids = [] for relationship in self.relationships: diff --git a/python/tests/on_demand_mesh_generator_test.py b/python/tests/on_demand_mesh_generator_test.py index b1f265d043..8e28af49b5 100644 --- a/python/tests/on_demand_mesh_generator_test.py +++ b/python/tests/on_demand_mesh_generator_test.py @@ -20,7 +20,7 @@ import pytest from neuroglancer import local_volume, test_util, viewer_state -testdata_dir = os.path.join(os.path.dirname(__file__), "..", "testdata", "mesh") +testdata_dir = os.path.join(os.path.dirname(__file__), "..", "..", "testdata", "mesh") @pytest.mark.xfail( diff --git a/python/tests/zarr_test.py b/python/tests/zarr_test.py index 14e1fb60f4..860c7dbadb 100644 --- a/python/tests/zarr_test.py +++ b/python/tests/zarr_test.py @@ -19,7 +19,9 @@ import numpy as np import pytest -TEST_DATA_DIR = pathlib.Path(__file__).parent.parent / "testdata" +TEST_DATA_DIR = ( + pathlib.Path(__file__).parent.parent.parent / "testdata" / "datasource" / "zarr" +) @pytest.mark.parametrize( diff --git a/setup.py b/setup.py index 7fd8e08317..35c0fc3cad 100755 --- a/setup.py +++ b/setup.py @@ -130,7 +130,7 @@ class BundleClientCommand( ): editable_mode: bool = False - user_options = [ + user_options = [ # type: ignore[assignment] ( "client-bundle-type=", None, diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index aa7f43ce49..1c8444e9a1 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -170,8 +170,8 @@ class AnnotationMetadataChunkSource extends ChunkSource { return chunk; } - download(chunk: AnnotationMetadataChunk, abortSignal: AbortSignal) { - return this.parent!.downloadMetadata(chunk, abortSignal); + download(chunk: AnnotationMetadataChunk, signal: AbortSignal) { + return this.parent!.downloadMetadata(chunk, signal); } } @@ -205,11 +205,11 @@ class AnnotationSubsetGeometryChunkSource extends ChunkSource { } return chunk; } - download(chunk: AnnotationSubsetGeometryChunk, abortSignal: AbortSignal) { + download(chunk: AnnotationSubsetGeometryChunk, signal: AbortSignal) { return this.parent!.downloadSegmentFilteredGeometry( chunk, this.relationshipIndex, - abortSignal, + signal, ); } } @@ -220,12 +220,12 @@ export interface AnnotationSource { // TypeScript supports mixins with abstract classes. downloadMetadata( chunk: AnnotationMetadataChunk, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise; downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise; } diff --git a/src/async_computation/request.ts b/src/async_computation/request.ts index f641b6fefc..9497ffeb78 100644 --- a/src/async_computation/request.ts +++ b/src/async_computation/request.ts @@ -85,14 +85,14 @@ export function requestAsyncComputation< Signature extends (...args: any) => any, >( request: AsyncComputationSpec, - abortSignal: AbortSignal | undefined, + signal: AbortSignal | undefined, transfer: Transferable[] | undefined, ...args: Parameters ): Promise> { const id = nextTaskId++; const msg = { t: request.id, id, args: args }; - abortSignal?.throwIfAborted(); + signal?.throwIfAborted(); const promise = new Promise>((resolve, reject) => { tasks.set(id, { resolve, reject }); @@ -102,16 +102,16 @@ export function requestAsyncComputation< freeWorkers.pop()!.postMessage(msg, transfer as Transferable[]); } else { let cleanup: (() => void) | undefined; - if (abortSignal !== undefined) { + if (signal !== undefined) { function abortHandler() { pendingTasks.delete(id); const task = tasks.get(id)!; tasks.delete(id); - task.reject(abortSignal!.reason); + task.reject(signal!.reason); } - abortSignal.addEventListener("abort", abortHandler, { once: true }); + signal.addEventListener("abort", abortHandler, { once: true }); cleanup = () => { - abortSignal.removeEventListener("abort", abortHandler); + signal.removeEventListener("abort", abortHandler); }; } pendingTasks.set(id, { msg, transfer, cleanup }); diff --git a/src/chunk_manager/backend.ts b/src/chunk_manager/backend.ts index 70f02db41d..62457ac015 100644 --- a/src/chunk_manager/backend.ts +++ b/src/chunk_manager/backend.ts @@ -412,12 +412,12 @@ export interface ChunkSourceBase { * Note: This method must be defined by subclasses. * * @param chunk Chunk to download. - * @param abortSignal Used to abort download. + * @param signal Used to abort download. * * TODO(jbms): Move this back to the class definition above and declare this abstract once mixins * are compatible with abstract classes. */ - download(chunk: Chunk, abortSignal: AbortSignal): Promise; + download(chunk: Chunk, signal: AbortSignal): Promise; } export class ChunkSource extends ChunkSourceBase { @@ -462,7 +462,7 @@ function startChunkDownload(chunk: Chunk) { function cancelChunkDownload(chunk: Chunk) { const controller = chunk.downloadAbortController!; chunk.downloadAbortController = undefined; - controller.abort(); + controller.abort(new DOMException("chunk download cancelled", "AbortError")); } class ChunkPriorityQueue { @@ -890,6 +890,11 @@ export class ChunkQueueManager extends SharedObjectCounterpart { this.scheduleUpdate(); } + markRecentlyUsed(chunk: Chunk) { + this.removeChunkFromQueues_(chunk); + this.addChunkToQueues_(chunk); + } + private processGPUPromotions_() { const queueManager = this; function evictFromGPUMemory(chunk: Chunk) { diff --git a/src/chunk_manager/frontend.ts b/src/chunk_manager/frontend.ts index 8d552cbefc..3df76ce075 100644 --- a/src/chunk_manager/frontend.ts +++ b/src/chunk_manager/frontend.ts @@ -196,9 +196,9 @@ export class ChunkQueueManager extends SharedObject { } private handleFetch_(source: ChunkSource, update: any) { - const { resolve, reject, abortSignal } = update.promise; - if (abortSignal.aborted) { - reject(abortSignal.reason); + const { resolve, reject, signal } = update.promise; + if (signal.aborted) { + reject(signal.reason); return; } @@ -348,15 +348,12 @@ registerRPC("Chunk.update", function (x) { updateChunk(this, x); }); -registerPromiseRPC( - "Chunk.retrieve", - function (x, abortSignal): RPCPromise { - return new Promise<{ value: any }>((resolve, reject) => { - x.promise = { resolve, reject, abortSignal }; - updateChunk(this, x); - }); - }, -); +registerPromiseRPC("Chunk.retrieve", function (x, signal): RPCPromise { + return new Promise<{ value: any }>((resolve, reject) => { + x.promise = { resolve, reject, signal }; + updateChunk(this, x); + }); +}); registerRPC(CHUNK_LAYER_STATISTICS_RPC_ID, function (x) { const chunkManager = this.get(x.id) as ChunkManager; diff --git a/src/chunk_manager/generic_file_source.ts b/src/chunk_manager/generic_file_source.ts index 6029a19814..308e18ffe4 100644 --- a/src/chunk_manager/generic_file_source.ts +++ b/src/chunk_manager/generic_file_source.ts @@ -21,243 +21,25 @@ import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, ChunkSourceBase } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; -import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; -import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; +import type { Owned } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; +import type { AsyncMemoize } from "#src/util/memoize.js"; +import { asyncMemoizeWithProgress } from "#src/util/memoize.js"; import { getObjectId } from "#src/util/object_id.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; - -export type PriorityGetter = () => { - priorityTier: ChunkPriorityTier; - priority: number; -}; - -interface FileDataRequester { - resolve: (data: Data) => void; - reject: (error: any) => void; - getPriority: PriorityGetter; - cleanup: () => void; -} - -class GenericSharedDataChunk extends Chunk { - decodedKey?: Key; - data?: Data; - requesters?: Set>; - - initialize(key: string) { - super.initialize(key); - this.requesters = new Set>(); - } - - downloadSucceeded() { - super.downloadSucceeded(); - const { requesters, data } = this; - this.requesters = undefined; - for (const requester of requesters!) { - requester.resolve(data!); - } - } - - downloadFailed(error: any) { - super.downloadFailed(error); - const { requesters } = this; - this.requesters = undefined; - for (const requester of requesters!) { - requester.reject(error); - } - } - - freeSystemMemory() { - this.data = undefined; - } -} - -export interface GenericSharedDataSourceOptions { - encodeKey?: (key: Key) => string; - download: ( - key: Key, - abortSignal: AbortSignal, - ) => Promise<{ size: number; data: Data }>; - sourceQueueLevel?: number; -} - -export class GenericSharedDataSource extends ChunkSourceBase { - declare chunks: Map>; - - private encodeKeyFunction: (key: Key) => string; - - private downloadFunction: ( - key: Key, - abortSignal: AbortSignal, - ) => Promise<{ size: number; data: Data }>; - - constructor( - chunkManager: Owned, - options: GenericSharedDataSourceOptions, - ) { - super(chunkManager); - this.registerDisposer(chunkManager); - const { encodeKey = stableStringify } = options; - this.downloadFunction = options.download; - this.encodeKeyFunction = encodeKey; - const { sourceQueueLevel = 0 } = options; - this.sourceQueueLevel = sourceQueueLevel; - - // This source is unusual in that it updates its own chunk priorities. - this.registerDisposer( - this.chunkManager.recomputeChunkPrioritiesLate.add(() => { - this.updateChunkPriorities(); - }), - ); - } - - updateChunkPriorities() { - const { chunkManager } = this; - for (const chunk of this.chunks.values()) { - const { requesters } = chunk; - if (requesters !== undefined) { - for (const requester of requesters) { - const { priorityTier, priority } = requester.getPriority(); - if (priorityTier === ChunkPriorityTier.RECENT) continue; - chunkManager.requestChunk( - chunk, - priorityTier, - priority, - ChunkState.SYSTEM_MEMORY_WORKER, - ); - } - } - } - } - - async download( - chunk: GenericSharedDataChunk, - abortSignal: AbortSignal, - ) { - const { size, data } = await this.downloadFunction( - chunk.decodedKey!, - abortSignal, - ); - chunk.systemMemoryBytes = size; - chunk.data = data; - } - - /** - * Precondition: priorityTier <= ChunkPriorityTier.LAST_ORDERED_TIER - */ - getData(key: Key, getPriority: PriorityGetter, abortSignal: AbortSignal) { - const encodedKey = this.encodeKeyFunction(key); - let chunk = this.chunks.get(encodedKey); - if (chunk === undefined) { - chunk = this.getNewChunk_>( - GenericSharedDataChunk, - ); - chunk.decodedKey = key; - chunk.initialize(encodedKey); - this.addChunk(chunk); - } - return new Promise((resolve, reject) => { - // If the data is already available or the request has already failed, resolve/reject the - // promise immediately. - switch (chunk!.state) { - case ChunkState.FAILED: - reject(chunk!.error); - return; - - case ChunkState.SYSTEM_MEMORY_WORKER: - resolve(chunk!.data!); - return; - } - function handleAbort() { - const { requesters } = chunk!; - if (requesters !== undefined) { - requesters.delete(requester); - chunk!.chunkManager!.scheduleUpdateChunkPriorities(); - } - reject(abortSignal.reason); - } - - const requester: FileDataRequester = { - resolve, - reject, - getPriority, - cleanup: () => abortSignal.removeEventListener("abort", handleAbort), - }; - chunk!.requesters!.add(requester); - abortSignal.addEventListener("abort", handleAbort, { once: true }); - this.chunkManager.scheduleUpdateChunkPriorities(); - }); - } - - static get( - chunkManager: Borrowed, - memoizeKey: string, - options: GenericSharedDataSourceOptions, - ) { - return chunkManager.memoize.get( - `getFileSource:${memoizeKey}`, - () => new GenericSharedDataSource(chunkManager.addRef(), options), - ); - } - - static getData( - chunkManager: Borrowed, - memoizeKey: string, - options: GenericSharedDataSourceOptions, - key: Key, - getPriority: PriorityGetter, - abortSignal: AbortSignal, - ) { - const source = GenericSharedDataSource.get( - chunkManager, - memoizeKey, - options, - ); - const result = source.getData(key, getPriority, abortSignal); - source.dispose(); - return result; - } - - static getUrl( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - decodeFunction: ( - buffer: ArrayBuffer, - abortSignal: AbortSignal, - ) => Promise<{ size: number; data: Data }>, - url: string, - getPriority: PriorityGetter, - abortSignal: AbortSignal, - ) { - return GenericSharedDataSource.getData( - chunkManager, - `${getObjectId(decodeFunction)}`, - { - download: (url: string, abortSignal: AbortSignal) => - fetchSpecialOk(credentialsProvider, url, { signal: abortSignal }) - .then((response) => response.arrayBuffer()) - .then((response) => decodeFunction(response, abortSignal)), - }, - url, - getPriority, - abortSignal, - ); - } -} +import type { ProgressOptions } from "#src/util/progress_listener.js"; class AsyncCacheChunk extends Chunk { - promise: Promise | undefined; - outstandingRequests: number = 0; - sharedAbortController: SharedAbortController | undefined; + asyncMemoize: AsyncMemoize | undefined; initialize(key: string) { super.initialize(key); } freeSystemMemory() { - this.promise = undefined; + this.asyncMemoize = undefined; } } @@ -265,7 +47,7 @@ export interface SimpleAsyncCacheOptions { encodeKey?: (key: Key) => string; get: ( key: Key, - abortSignal: AbortSignal, + progressOptions: ProgressOptions, ) => Promise<{ size: number; data: Value }>; } @@ -284,10 +66,10 @@ export class SimpleAsyncCache extends ChunkSourceBase { encodeKeyFunction: (key: Key) => string; downloadFunction: ( key: Key, - abortSignal: AbortSignal, + progressOptions: ProgressOptions, ) => Promise<{ size: number; data: Value }>; - get(key: Key, abortSignal?: AbortSignal): Promise { + get(key: Key, options: Partial): Promise { const encodedKey = this.encodeKeyFunction(key); let chunk = this.chunks.get(encodedKey); if (chunk === undefined) { @@ -295,23 +77,12 @@ export class SimpleAsyncCache extends ChunkSourceBase { chunk.initialize(encodedKey); this.addChunk(chunk); } - if ( - chunk.promise === undefined || - chunk.sharedAbortController?.signal.aborted - ) { - let completed = false; - const sharedAbortController = (chunk!.sharedAbortController = - new SharedAbortController()); - sharedAbortController.signal.addEventListener("abort", () => { - if (!completed) { - chunk!.promise = undefined; - } - }); - chunk.promise = (async () => { + if (chunk.asyncMemoize === undefined) { + chunk.asyncMemoize = asyncMemoizeWithProgress(async (progressOptions) => { try { const { data, size } = await this.downloadFunction( key, - sharedAbortController.signal, + progressOptions, ); chunk.systemMemoryBytes = size; chunk!.queueManager.updateChunkState( @@ -322,15 +93,13 @@ export class SimpleAsyncCache extends ChunkSourceBase { } catch (e) { chunk!.queueManager.updateChunkState(chunk!, ChunkState.FAILED); throw e; - } finally { - completed = true; - sharedAbortController[Symbol.dispose](); } - })(); + }); + } + if (chunk.state === ChunkState.SYSTEM_MEMORY) { + chunk.chunkManager.queueManager.markRecentlyUsed(chunk); } - chunk!.sharedAbortController!.addConsumer(abortSignal); - chunk!.sharedAbortController!.start(); - return raceWithAbort(chunk.promise, abortSignal); + return chunk.asyncMemoize(options); } } @@ -344,3 +113,38 @@ export function makeSimpleAsyncCache( () => new SimpleAsyncCache(chunkManager.addRef(), options), ); } + +export function getCachedDecodedUrl( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + decodeFunction: ( + readResponse: ReadResponse | undefined, + options: ProgressOptions, + ) => Promise<{ size: number; data: Data }>, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + `getCachedDecodedUrl:${getObjectId(decodeFunction)}`, + () => { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async (url: string, options: ProgressOptions) => { + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + url, + options, + ); + try { + return decodeFunction(readResponse, options); + } catch (e) { + throw new Error("Error reading ${url}", { cause: e }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get(url, options); +} diff --git a/src/chunk_worker.bundle.js b/src/chunk_worker.bundle.js index a5cb4b9bbc..a463171535 100644 --- a/src/chunk_worker.bundle.js +++ b/src/chunk_worker.bundle.js @@ -4,9 +4,11 @@ import "#src/util/polyfills.js"; import "#src/shared_watchable_value.js"; import "#src/chunk_manager/backend.js"; +import "#src/kvstore/backend.js"; import "#src/sliceview/backend.js"; import "#src/perspective_view/backend.js"; import "#src/volume_rendering/backend.js"; import "#src/annotation/backend.js"; import "#src/datasource/enabled_backend_modules.js"; +import "#src/kvstore/enabled_backend_modules.js"; import "#src/worker_rpc_context.js"; diff --git a/src/credentials_provider/default_manager.ts b/src/credentials_provider/default_manager.ts index dea60b764c..c95fb6a874 100644 --- a/src/credentials_provider/default_manager.ts +++ b/src/credentials_provider/default_manager.ts @@ -18,7 +18,23 @@ * @file CredentialsManager for globally registering a CredentialsProvider */ -import { CachingMapBasedCredentialsManager } from "#src/credentials_provider/index.js"; +import { + CachingMapBasedCredentialsManager, + type ProviderGetter, +} from "#src/credentials_provider/index.js"; -export const defaultCredentialsManager = - new CachingMapBasedCredentialsManager(); +const providers = new Map>(); +export function registerDefaultCredentialsProvider( + key: string, + providerGetter: ProviderGetter, +) { + providers.set(key, providerGetter); +} + +export function getDefaultCredentialsManager() { + const manager = new CachingMapBasedCredentialsManager(); + for (const [key, provider] of providers) { + manager.register(key, provider); + } + return manager; +} diff --git a/src/credentials_provider/http_request.ts b/src/credentials_provider/http_request.ts index d3998a66f5..bdf8bec3f0 100644 --- a/src/credentials_provider/http_request.ts +++ b/src/credentials_provider/http_request.ts @@ -18,18 +18,20 @@ import type { CredentialsProvider, CredentialsWithGeneration, } from "#src/credentials_provider/index.js"; +import type { FetchOk } from "#src/util/http_request.js"; import { fetchOk, HttpError, pickDelay } from "#src/util/http_request.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; const maxCredentialsAttempts = 3; -export async function fetchWithCredentials( +export async function fetchOkWithCredentials( credentialsProvider: CredentialsProvider, input: RequestInfo | ((credentials: Credentials) => RequestInfo), - init: RequestInit, + init: RequestInit & { progressListener?: ProgressListener }, applyCredentials: ( credentials: Credentials, - requestInit: RequestInit, - ) => RequestInit, + requestInit: RequestInit & { progressListener?: ProgressListener }, + ) => RequestInit & { progressListener?: ProgressListener }, errorHandler: (httpError: HttpError, credentials: Credentials) => "refresh", ): Promise { let credentials: CredentialsWithGeneration | undefined; @@ -43,10 +45,10 @@ export async function fetchWithCredentials( setTimeout(resolve, pickDelay(credentialsAttempt - 2)), ); } - credentials = await credentialsProvider.get( - credentials, - init.signal ?? undefined, - ); + credentials = await credentialsProvider.get(credentials, { + signal: init.signal ?? undefined, + progressListener: init.progressListener, + }); try { return await fetchOk( typeof input === "function" ? input(credentials.credentials) : input, @@ -63,3 +65,21 @@ export async function fetchWithCredentials( } } } + +export function fetchOkWithCredentialsAdapter( + credentialsProvider: CredentialsProvider, + applyCredentials: ( + credentials: Credentials, + requestInit: RequestInit & { progressListener?: ProgressListener }, + ) => RequestInit & { progressListener?: ProgressListener }, + errorHandler: (httpError: HttpError, credentials: Credentials) => "refresh", +): FetchOk { + return (input, init = {}) => + fetchOkWithCredentials( + credentialsProvider, + input, + init, + applyCredentials, + errorHandler, + ); +} diff --git a/src/credentials_provider/index.ts b/src/credentials_provider/index.ts index 41ec25ede0..1290e24036 100644 --- a/src/credentials_provider/index.ts +++ b/src/credentials_provider/index.ts @@ -18,10 +18,11 @@ * @file Generic facility for providing authentication/authorization credentials. */ -import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; -import { StringMemoize } from "#src/util/memoize.js"; +import type { AsyncMemoizeWithProgress } from "#src/util/memoize.js"; +import { asyncMemoizeWithProgress, StringMemoize } from "#src/util/memoize.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** * Wraps an arbitrary JSON credentials object with a generation number. @@ -42,68 +43,50 @@ export abstract class CredentialsProvider extends RefCounted { */ abstract get: ( invalidCredentials?: CredentialsWithGeneration, - abortSignal?: AbortSignal | undefined, + options?: Partial, ) => Promise>; } export function makeCachedCredentialsGetter( getUncached: ( invalidCredentials: CredentialsWithGeneration | undefined, - abortSignal: AbortSignal, + options: ProgressOptions, ) => Promise>, ) { let cachedCredentials: CredentialsWithGeneration | undefined; let pendingCredentials: - | Promise> + | AsyncMemoizeWithProgress> | undefined; - let pendingAbortController: SharedAbortController | undefined; - return ( + return async ( invalidCredentials?: CredentialsWithGeneration, - abortSignal?: AbortSignal, + options?: Partial, ) => { + // Check if a new credential request needs to be made. if ( - pendingCredentials !== undefined && - (cachedCredentials === undefined || - invalidCredentials === undefined || - cachedCredentials.generation !== invalidCredentials.generation) + pendingCredentials === undefined || + (invalidCredentials !== undefined && + cachedCredentials?.generation === invalidCredentials.generation) ) { - if (cachedCredentials === undefined) { - pendingAbortController!.addConsumer(abortSignal); - } - return raceWithAbort(pendingCredentials, abortSignal); + cachedCredentials = undefined; + pendingCredentials = asyncMemoizeWithProgress(async (progressOptions) => { + cachedCredentials = await getUncached( + invalidCredentials, + progressOptions, + ); + return cachedCredentials; + }); } - cachedCredentials = undefined; - pendingAbortController = new SharedAbortController(); - pendingCredentials = getUncached( - invalidCredentials, - pendingAbortController.signal, - ).then( - (credentials) => { - cachedCredentials = credentials; - pendingAbortController![Symbol.dispose](); - pendingAbortController = undefined; - return credentials; - }, - (reason) => { - pendingAbortController![Symbol.dispose](); - if (pendingAbortController?.signal.aborted) { - pendingAbortController = undefined; - pendingCredentials = undefined; - } - throw reason; - }, - ); - return pendingCredentials; + return pendingCredentials(options ?? {}); }; } export function makeCredentialsGetter( - getWithoutGeneration: (abortSignal: AbortSignal) => Promise, + getWithoutGeneration: (options: ProgressOptions) => Promise, ) { let generation = 0; return makeCachedCredentialsGetter( - (_invalidCredentials, abortSignal) => - getWithoutGeneration(abortSignal).then((credentials) => ({ + (_invalidCredentials, options) => + getWithoutGeneration(options).then((credentials) => ({ generation: ++generation, credentials, })), @@ -129,13 +112,7 @@ export type ProviderGetter = ( * CredentialsManager that supports registration. */ export class MapBasedCredentialsManager implements CredentialsManager { - providers = new Map< - string, - ( - parameters: any, - credentialsManager: CredentialsManager, - ) => Owned> - >(); + providers = new Map>(); topLevelManager: CredentialsManager = this; register( key: string, @@ -213,7 +190,10 @@ export class AnonymousFirstCredentialsProvider< } get = makeCachedCredentialsGetter( - (invalidCredentials?: CredentialsWithGeneration) => { + ( + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, + ) => { if (this.anonymous && invalidCredentials === undefined) { return Promise.resolve({ generation: -10, @@ -221,7 +201,7 @@ export class AnonymousFirstCredentialsProvider< }); } this.anonymous = false; - return this.baseProvider.get(invalidCredentials); + return this.baseProvider.get(invalidCredentials, options); }, ); } diff --git a/src/credentials_provider/interactive_credentials_provider.ts b/src/credentials_provider/interactive_credentials_provider.ts index 9f66c18d70..b10e7f7bdd 100644 --- a/src/credentials_provider/interactive_credentials_provider.ts +++ b/src/credentials_provider/interactive_credentials_provider.ts @@ -22,15 +22,15 @@ export function getCredentialsWithStatus( description: string; requestDescription?: string; supportsImmediate?: boolean; - get: (abortSignal: AbortSignal, immediate: boolean) => Promise; + get: (signal: AbortSignal, immediate: boolean) => Promise; }, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const { requestDescription = "login" } = options; const status = new StatusMessage(/*delay=*/ true); let abortController: AbortController | undefined; return new Promise((resolve, reject) => { - const disposeAbortCallback = scopedAbortCallback(abortSignal, (reason) => { + const disposeAbortCallback = scopedAbortCallback(signal, (reason) => { if (abortController !== undefined) { abortController.abort(reason); abortController = undefined; @@ -92,6 +92,7 @@ export function getCredentialsWithStatus( } else { writeLoginStatus(); status.setVisible(true); + status.setModal(true); } }); } diff --git a/src/credentials_provider/oauth2.ts b/src/credentials_provider/oauth2.ts index 2eec784848..3fee4084fa 100644 --- a/src/credentials_provider/oauth2.ts +++ b/src/credentials_provider/oauth2.ts @@ -14,8 +14,12 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { + fetchOkWithCredentials, + fetchOkWithCredentialsAdapter, +} from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { FetchOk, HttpError } from "#src/util/http_request.js"; import { fetchOk } from "#src/util/http_request.js"; /** @@ -27,7 +31,41 @@ export interface OAuth2Credentials { email?: string; } -export function fetchWithOAuth2Credentials( +function applyCredentials( + credentials: OAuth2Credentials, + init: RequestInit, +): RequestInit { + if (!credentials.accessToken) return init; + const headers = new Headers(init.headers); + headers.set( + "Authorization", + `${credentials.tokenType} ${credentials.accessToken}`, + ); + return { ...init, headers }; +} + +function errorHandler( + error: HttpError, + credentials: OAuth2Credentials, +): "refresh" { + const { status } = error; + if (status === 401) { + // 401: Authorization needed. OAuth2 token may have expired. + return "refresh"; + } + if (status === 403 && !credentials.accessToken) { + // Anonymous access denied. Request credentials. + return "refresh"; + } + if (error instanceof Error && credentials.email !== undefined) { + error.message += ` (Using credentials for ${JSON.stringify( + credentials.email, + )})`; + } + throw error; +} + +export function fetchOkWithOAuth2Credentials( credentialsProvider: CredentialsProvider | undefined, input: RequestInfo, init: RequestInit, @@ -35,35 +73,22 @@ export function fetchWithOAuth2Credentials( if (credentialsProvider === undefined) { return fetchOk(input, init); } - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, input, init, - (credentials, init) => { - if (!credentials.accessToken) return init; - const headers = new Headers(init.headers); - headers.set( - "Authorization", - `${credentials.tokenType} ${credentials.accessToken}`, - ); - return { ...init, headers }; - }, - (error, credentials) => { - const { status } = error; - if (status === 401) { - // 401: Authorization needed. OAuth2 token may have expired. - return "refresh"; - } - if (status === 403 && !credentials.accessToken) { - // Anonymous access denied. Request credentials. - return "refresh"; - } - if (error instanceof Error && credentials.email !== undefined) { - error.message += ` (Using credentials for ${JSON.stringify( - credentials.email, - )})`; - } - throw error; - }, + applyCredentials, + errorHandler, + ); +} + +export function fetchOkWithOAuth2CredentialsAdapter( + credentialsProvider: CredentialsProvider | undefined, +): FetchOk { + if (credentialsProvider === undefined) return fetchOk; + return fetchOkWithCredentialsAdapter( + credentialsProvider, + applyCredentials, + errorHandler, ); } diff --git a/src/credentials_provider/shared.ts b/src/credentials_provider/shared.ts index 1703a0f94f..60153312f9 100644 --- a/src/credentials_provider/shared.ts +++ b/src/credentials_provider/shared.ts @@ -19,14 +19,18 @@ */ import type { + CredentialsManager, CredentialsProvider, CredentialsWithGeneration, } from "#src/credentials_provider/index.js"; import { CREDENTIALS_PROVIDER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, + CREDENTIALS_MANAGER_RPC_ID, + CREDENTIALS_MANAGER_GET_RPC_ID, } from "#src/credentials_provider/shared_common.js"; import type { Owned } from "#src/util/disposable.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, @@ -50,9 +54,9 @@ export class SharedCredentialsProvider get( invalidCredentials?: CredentialsWithGeneration, - abortSignal?: AbortSignal, + options?: Partial, ): Promise> { - return this.provider.get(invalidCredentials, abortSignal); + return this.provider.get(invalidCredentials, options); } } @@ -61,11 +65,53 @@ registerPromiseRPC( function ( this: RPC, x: { providerId: number; invalidCredentials: any }, - abortSignal: AbortSignal, + progressOptions, ): RPCPromise> { const obj = >this.get(x.providerId); - return obj.get(x.invalidCredentials, abortSignal).then((credentials) => ({ - value: credentials, - })); + return obj + .get(x.invalidCredentials, progressOptions) + .then((credentials) => ({ + value: credentials, + })); + }, +); + +@registerSharedObjectOwner(CREDENTIALS_MANAGER_RPC_ID) +export class SharedCredentialsManager + extends SharedObject + implements CredentialsManager +{ + constructor( + public base: CredentialsManager, + rpc: RPC, + ) { + super(); + this.initializeCounterpart(rpc); + } + + getCredentialsProvider(key: string, parameters?: any) { + return this.base.getCredentialsProvider(key, parameters); + } +} + +registerPromiseRPC( + CREDENTIALS_MANAGER_GET_RPC_ID, + async function ( + this: RPC, + x: { + managerId: number; + key: string; + parameters: any; + invalidCredentials: any; + }, + progressOptions, + ): RPCPromise> { + const manager = this.get(x.managerId) as SharedCredentialsManager; + const provider = manager.base.getCredentialsProvider(x.key, x.parameters); + const credentials = await provider.get( + x.invalidCredentials, + progressOptions, + ); + return { value: credentials }; }, ); diff --git a/src/credentials_provider/shared_common.ts b/src/credentials_provider/shared_common.ts index a9b435cc9a..ce47289b67 100644 --- a/src/credentials_provider/shared_common.ts +++ b/src/credentials_provider/shared_common.ts @@ -16,3 +16,5 @@ export const CREDENTIALS_PROVIDER_RPC_ID = "CredentialsProvider"; export const CREDENTIALS_PROVIDER_GET_RPC_ID = "CredentialsProvider.get"; +export const CREDENTIALS_MANAGER_RPC_ID = "CredentialsManager"; +export const CREDENTIALS_MANAGER_GET_RPC_ID = "CredentialsManager.get"; diff --git a/src/credentials_provider/shared_counterpart.ts b/src/credentials_provider/shared_counterpart.ts index 22436a53b2..c9ca969bca 100644 --- a/src/credentials_provider/shared_counterpart.ts +++ b/src/credentials_provider/shared_counterpart.ts @@ -20,15 +20,23 @@ */ import type { - CredentialsProvider, + CredentialsManager, CredentialsWithGeneration, MaybeOptionalCredentialsProvider, } from "#src/credentials_provider/index.js"; -import { makeCachedCredentialsGetter } from "#src/credentials_provider/index.js"; import { + CachingCredentialsManager, + makeCachedCredentialsGetter, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import { + CREDENTIALS_MANAGER_GET_RPC_ID, + CREDENTIALS_MANAGER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, CREDENTIALS_PROVIDER_RPC_ID, } from "#src/credentials_provider/shared_common.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerSharedObject, SharedObjectCounterpart, @@ -41,13 +49,13 @@ export class SharedCredentialsProviderCounterpart { get = makeCachedCredentialsGetter( ( - invalidCredentials?: CredentialsWithGeneration, - abortSignal?: AbortSignal, + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, ): Promise> => this.rpc!.promiseInvoke( CREDENTIALS_PROVIDER_GET_RPC_ID, { providerId: this.rpcId, invalidCredentials: invalidCredentials }, - abortSignal, + { signal: options.signal, progressListener: options.progressListener }, ), ); } @@ -67,3 +75,57 @@ export function WithSharedCredentialsProviderCounterpart() { } }; } + +class ProxyCredentialsProvider< + Credentials, +> extends CredentialsProvider { + constructor( + public rpc: RPC, + public managerId: number, + public key: string, + public parameters?: any, + ) { + super(); + } + get = makeCachedCredentialsGetter( + ( + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, + ): Promise> => + this.rpc.promiseInvoke( + CREDENTIALS_MANAGER_GET_RPC_ID, + { + managerId: this.managerId, + key: this.key, + parameters: this.parameters, + invalidCredentials: invalidCredentials, + }, + { signal: options.signal, progressListener: options.progressListener }, + ), + ); +} + +@registerSharedObject(CREDENTIALS_MANAGER_RPC_ID) +export class SharedCredentialsManagerCounterpart + extends SharedObjectCounterpart + implements CredentialsManager +{ + private impl: CachingCredentialsManager = + new CachingCredentialsManager(this.makeBaseCredentialsManager()); + + private makeBaseCredentialsManager(): CredentialsManager { + return { + getCredentialsProvider: (key: string, parameters?: any) => + new ProxyCredentialsProvider( + this.rpc!, + this.rpcId!, + key, + parameters, + ), + }; + } + + getCredentialsProvider(key: string, parameters?: any) { + return this.impl.getCredentialsProvider(key, parameters); + } +} diff --git a/src/data_management_context.ts b/src/data_management_context.ts new file mode 100644 index 0000000000..d55274c81a --- /dev/null +++ b/src/data_management_context.ts @@ -0,0 +1,79 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; +import { + CapacitySpecification, + ChunkManager, + ChunkQueueManager, +} from "#src/chunk_manager/frontend.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; +import { RPC } from "#src/worker_rpc.js"; + +export class DataManagementContext extends RefCounted { + worker: Worker; + chunkQueueManager: ChunkQueueManager; + chunkManager: ChunkManager; + + get rpc(): RPC { + return this.chunkQueueManager.rpc!; + } + + constructor( + public gl: GL, + public frameNumberCounter: FrameNumberCounter, + ) { + super(); + // Note: For compatibility with multiple bundlers, a browser-compatible URL + // must be used with `new URL`, which means a Node.js subpath import like + // "#src/chunk_worker.bundle.js" cannot be used. + this.worker = new Worker( + /* webpackChunkName: "neuroglancer_chunk_worker" */ + new URL("./chunk_worker.bundle.js", import.meta.url), + { type: "module" }, + ); + this.chunkQueueManager = this.registerDisposer( + new ChunkQueueManager( + new RPC(this.worker, /*waitUntilReady=*/ true), + this.gl, + this.frameNumberCounter, + { + gpuMemory: new CapacitySpecification({ + defaultItemLimit: 1e6, + defaultSizeLimit: 1e9, + }), + systemMemory: new CapacitySpecification({ + defaultItemLimit: 1e7, + defaultSizeLimit: 2e9, + }), + download: new CapacitySpecification({ + defaultItemLimit: 100, + defaultSizeLimit: Number.POSITIVE_INFINITY, + }), + compute: new CapacitySpecification({ + defaultItemLimit: 128, + defaultSizeLimit: 5e8, + }), + }, + ), + ); + this.chunkQueueManager.registerDisposer(() => this.worker.terminate()); + this.chunkManager = this.registerDisposer( + new ChunkManager(this.chunkQueueManager), + ); + } +} diff --git a/src/datasource/boss/api.ts b/src/datasource/boss/api.ts index cfed87d1fb..8ca9ff6817 100644 --- a/src/datasource/boss/api.ts +++ b/src/datasource/boss/api.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import { fetchOk } from "#src/util/http_request.js"; @@ -41,7 +41,7 @@ export async function fetchWithBossCredentials( // has been cancelled throw error; } - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, input, init, diff --git a/src/datasource/boss/backend.ts b/src/datasource/boss/backend.ts index 3b16ca3159..fba370af85 100644 --- a/src/datasource/boss/backend.ts +++ b/src/datasource/boss/backend.ts @@ -67,7 +67,7 @@ export class BossVolumeChunkSource extends BossSource( ) { chunkDecoder = chunkDecoders.get(this.parameters.encoding)!; - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; let url = `${parameters.baseUrl}/latest/cutout/${parameters.collection}/${parameters.experiment}/${parameters.channel}/${parameters.resolution}`; { @@ -88,11 +88,11 @@ export class BossVolumeChunkSource extends BossSource( this.credentialsProvider, url, { - signal: abortSignal, + signal: signal, headers: { Accept: acceptHeaders.get(parameters.encoding)! }, }, ); - await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -119,23 +119,23 @@ export class BossMeshSource extends BossSource( MeshSource, MeshSourceParameters, ) { - download(chunk: ManifestChunk, abortSignal: AbortSignal) { + download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters } = this; return fetchWithBossCredentials( this.credentialsProvider, `${parameters.baseUrl}${chunk.objectId}`, - { signal: abortSignal }, + { signal: signal }, ) .then((response) => response.arrayBuffer()) .then((response) => decodeManifestChunk(chunk, response)); } - downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; return fetchWithBossCredentials( this.credentialsProvider, `${parameters.baseUrl}${chunk.fragmentId}`, - { signal: abortSignal }, + { signal: signal }, ) .then((response) => response.arrayBuffer()) .then((response) => decodeFragmentChunk(chunk, response)); diff --git a/src/datasource/boss/credentials_provider.ts b/src/datasource/boss/credentials_provider.ts index 939a44e400..0a05e79fcc 100644 --- a/src/datasource/boss/credentials_provider.ts +++ b/src/datasource/boss/credentials_provider.ts @@ -33,6 +33,7 @@ import { verifyObjectProperty, verifyString, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { getRandomHexString } from "#src/util/random.js"; export type BossToken = string; @@ -61,7 +62,7 @@ function makeAuthRequestUrl(options: { function waitForAuthResponseMessage( source: Window, state: string, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { return new Promise((resolve, reject) => { window.addEventListener( @@ -104,7 +105,7 @@ function waitForAuthResponseMessage( console.error("Response received: ", event.data); } }, - { signal: abortSignal }, + { signal: signal }, ); }); } @@ -115,7 +116,7 @@ function waitForAuthResponseMessage( */ export async function authenticateKeycloakOIDC( options: { realm: string; clientId: string; authServer: string }, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const state = getRandomHexString(); const nonce = getRandomHexString(); @@ -127,7 +128,7 @@ export async function authenticateKeycloakOIDC( nonce: nonce, }); const abortController = new AbortController(); - abortSignal = AbortSignal.any([abortController.signal, abortSignal]); + signal = AbortSignal.any([abortController.signal, signal]); try { const newWindow = open(url); if (newWindow === null) { @@ -136,7 +137,7 @@ export async function authenticateKeycloakOIDC( monitorAuthPopupWindow(newWindow, abortController); return await raceWithAbort( waitForAuthResponseMessage(newWindow, state, abortController.signal), - abortSignal, + signal, ); } finally { abortController.abort(); @@ -148,8 +149,11 @@ export class BossCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter((abortSignal) => - getCredentialsWithStatus( + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting Boss access token from ${this.authServer}`, + }); + return await getCredentialsWithStatus( { description: "Boss", get: (signal) => @@ -162,7 +166,7 @@ export class BossCredentialsProvider extends CredentialsProvider { signal, ), }, - abortSignal, - ), - ); + options.signal, + ); + }); } diff --git a/src/datasource/boss/frontend.ts b/src/datasource/boss/frontend.ts index 69d5302529..ae3cfee2da 100644 --- a/src/datasource/boss/frontend.ts +++ b/src/datasource/boss/frontend.ts @@ -46,8 +46,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { MeshSource } from "#src/mesh/frontend.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; @@ -81,6 +81,7 @@ import { verifyOptionalString, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; class BossVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), @@ -249,6 +250,7 @@ function parseExperimentInfo( credentialsProvider: CredentialsProvider, collection: string, experiment: string, + options: Partial, ): Promise { verifyObject(obj); @@ -261,6 +263,7 @@ function parseExperimentInfo( experiment, collection, ch, + options, ), ), ); @@ -290,6 +293,7 @@ function parseExperimentInfo( hostname, credentialsProvider, experimentInfo, + options, ); }); } @@ -500,19 +504,21 @@ export function getExperimentInfo( credentialsProvider: CredentialsProvider, experiment: string, collection: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, experiment: experiment, type: "boss:getExperimentInfo", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/`, - {}, + progressOptions, ) .then((response) => response.json()) .then((value) => @@ -523,6 +529,7 @@ export function getExperimentInfo( credentialsProvider, collection, experiment, + progressOptions, ), ), ); @@ -535,8 +542,9 @@ export function getChannelInfo( experiment: string, collection: string, channel: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, @@ -544,11 +552,12 @@ export function getChannelInfo( channel: channel, type: "boss:getChannelInfo", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/channel/${channel}/`, - {}, + progressOptions, ) .then((response) => response.json()) .then(parseChannelInfo), @@ -562,9 +571,10 @@ export function getDownsampleInfoForChannel( collection: string, experimentInfo: ExperimentInfo, channel: string, + options: Partial, ): Promise { return chunkManager.memoize - .getUncounted( + .getAsync( { hostname: hostname, collection: collection, @@ -573,11 +583,12 @@ export function getDownsampleInfoForChannel( downsample: true, type: "boss:getDownsampleInfoForChannel", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/downsample/${collection}/${experimentInfo.key}/${channel}`, - {}, + progressOptions, ).then((response) => response.json()), ) .then((downsampleObj) => { @@ -660,6 +671,7 @@ export function getDataSource( hostname: string, credentialsProvider: CredentialsProvider, path: string, + options: Partial, ) { const match = path.match(pathPattern); if (match === null) { @@ -670,15 +682,17 @@ export function getDataSource( const channel = match[3]; const parameters = parseQueryStringParameters(match[4] || ""); // Warning: If additional arguments are added, the cache key should be updated as well. - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, path: path, type: "boss:getVolume" }, - async () => { + options, + async (progressOptions) => { const experimentInfo = await getExperimentInfo( chunkManager, hostname, credentialsProvider, experiment, collection, + progressOptions, ); const experimentInfoWithDownsample = await getDownsampleInfoForChannel( chunkManager, @@ -687,6 +701,7 @@ export function getDataSource( collection, experimentInfo, channel, + progressOptions, ); const volume = new BossMultiscaleVolumeChunkSource( chunkManager, @@ -739,14 +754,16 @@ export function getCollections( chunkManager: ChunkManager, hostname: string, credentialsProvider: CredentialsProvider, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, type: "boss:getCollections" }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/`, - {}, + progressOptions, ) .then((response) => response.json()) .then((value) => @@ -762,14 +779,16 @@ export function getExperiments( hostname: string, credentialsProvider: CredentialsProvider, collection: string, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, type: "boss:getExperiments" }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/`, - {}, + progressOptions, ) .then((response) => response.json()) .then((value) => @@ -785,20 +804,22 @@ export function getCoordinateFrame( hostname: string, credentialsProvider: CredentialsProvider, experimentInfo: ExperimentInfo, + options: Partial, ): Promise { const key = experimentInfo.coordFrameKey; - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, coordinateframe: key, experimentInfo: experimentInfo, type: "boss:getCoordinateFrame", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/coord/${key}/`, - {}, + progressOptions, ) .then((response) => response.json()) .then((coordinateFrameObj) => @@ -812,6 +833,7 @@ export function collectionExperimentChannelCompleter( hostname: string, credentialsProvider: CredentialsProvider, path: string, + options: Partial, ): Promise { const channelMatch = path.match( /^(?:([^/]+)(?:\/?([^/]*)(?:\/?([^/]*)(?:\/?([^/]*)?))?)?)?$/, @@ -827,19 +849,22 @@ export function collectionExperimentChannelCompleter( if (channelMatch[2] === undefined) { const collectionPrefix = channelMatch[1] || ""; // Try to complete the collection. - return getCollections(chunkManager, hostname, credentialsProvider).then( - (collections) => { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - collectionPrefix, - collections, - (x) => x + "/", - () => undefined, - ), - }; - }, - ); + return getCollections( + chunkManager, + hostname, + credentialsProvider, + options, + ).then((collections) => { + return { + offset: 0, + completions: getPrefixMatchesWithDescriptions( + collectionPrefix, + collections, + (x) => x + "/", + () => undefined, + ), + }; + }); } if (channelMatch[3] === undefined) { const experimentPrefix = channelMatch[2] || ""; @@ -848,6 +873,7 @@ export function collectionExperimentChannelCompleter( hostname, credentialsProvider, channelMatch[1], + options, ).then((experiments) => { return { offset: channelMatch![1].length + 1, @@ -866,6 +892,7 @@ export function collectionExperimentChannelCompleter( credentialsProvider, channelMatch[2], channelMatch[1], + options, ).then((experimentInfo) => { const completions = getPrefixMatchesWithDescriptions( channelMatch![3], @@ -893,18 +920,17 @@ function getAuthServer(endpoint: string): string { return authServer; } -export class BossDataSource extends DataSourceProvider { - constructor(public credentialsManager: CredentialsManager) { - super(); +export class BossDataSource implements DataSourceProvider { + get scheme() { + return "boss"; } - get description() { return "bossDB: Block & Object Storage System"; } - getCredentialsProvider(path: string) { + getCredentialsProvider(credentialsManager: CredentialsManager, path: string) { const authServer = getAuthServer(path); - return this.credentialsManager.getCredentialsProvider( + return credentialsManager.getCredentialsProvider( credentialsKey, authServer, ); @@ -918,13 +944,15 @@ export class BossDataSource extends DataSourceProvider { ); } const credentialsProvider = this.getCredentialsProvider( + options.registry.credentialsManager, options.providerUrl, ); return getDataSource( - options.chunkManager, + options.registry.chunkManager, match[1], credentialsProvider, match[2], + options, ); } @@ -935,13 +963,17 @@ export class BossDataSource extends DataSourceProvider { throw null; } const hostname = match[1]; - const credentialsProvider = this.getCredentialsProvider(match[1]); + const credentialsProvider = this.getCredentialsProvider( + options.registry.credentialsManager, + match[1], + ); const path = match[2]; const completions = await collectionExperimentChannelCompleter( - options.chunkManager, + options.registry.chunkManager, hostname, credentialsProvider, path, + options, ); return applyCompletionOffset(match![1].length + 1, completions); } diff --git a/src/datasource/boss/register_credentials_provider.ts b/src/datasource/boss/register_credentials_provider.ts index fcdbe1eeac..47ec688d32 100644 --- a/src/datasource/boss/register_credentials_provider.ts +++ b/src/datasource/boss/register_credentials_provider.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/boss/api.js"; import { BossCredentialsProvider } from "#src/datasource/boss/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( credentialsKey, (authServer) => new BossCredentialsProvider(authServer), ); diff --git a/src/datasource/boss/register_default.ts b/src/datasource/boss/register_default.ts index 399f13a1a5..acdf432402 100644 --- a/src/datasource/boss/register_default.ts +++ b/src/datasource/boss/register_default.ts @@ -17,7 +17,4 @@ import { BossDataSource } from "#src/datasource/boss/frontend.js"; import { registerProvider } from "#src/datasource/default_provider.js"; -registerProvider( - "boss", - (options) => new BossDataSource(options.credentialsManager), -); +registerProvider(new BossDataSource()); diff --git a/src/datasource/brainmaps/api.ts b/src/datasource/brainmaps/api.ts index e2cfd481d5..941e7ccffd 100644 --- a/src/datasource/brainmaps/api.ts +++ b/src/datasource/brainmaps/api.ts @@ -16,7 +16,8 @@ import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchOkWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { RequestInitWithProgress } from "#src/util/http_request.js"; export type { OAuth2Credentials }; @@ -93,25 +94,15 @@ export interface BatchMeshFragmentPayload { batches: BatchMeshFragment[]; } -export interface HttpCall { - method: "GET" | "POST"; - path: string; - payload?: string; - signal?: AbortSignal; -} - export function makeRequest( instance: BrainmapsInstance, credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall, + path: string, + init: RequestInitWithProgress = {}, ): Promise { - return fetchWithOAuth2Credentials( + return fetchOkWithOAuth2Credentials( credentialsProvider, - `${instance.serverUrl}${httpCall.path}`, - { - signal: httpCall.signal, - method: httpCall.method, - body: httpCall.payload, - }, + `${instance.serverUrl}${path}`, + init, ); } diff --git a/src/datasource/brainmaps/backend.ts b/src/datasource/brainmaps/backend.ts index af3c722b81..51e2de5061 100644 --- a/src/datasource/brainmaps/backend.ts +++ b/src/datasource/brainmaps/backend.ts @@ -142,8 +142,6 @@ function BrainmapsSource< ); } -const tempUint64 = new Uint64(); - @registerSharedObject() export class BrainmapsVolumeChunkSource extends BrainmapsSource( VolumeChunkSource, @@ -177,7 +175,7 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( } } - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; // chunkPosition must not be captured, since it will be invalidated by the next call to @@ -200,14 +198,14 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( const response = await makeRequest( parameters.instance, this.credentialsProvider, + path, { method: "POST", - payload: JSON.stringify(payload), - path, - signal: abortSignal, + body: JSON.stringify(payload), + signal: signal, }, ); - await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -223,7 +221,7 @@ function getFragmentCorner( `Couldn't parse fragmentId ${fragmentId} as hex-encoded Uint64`, ); } - return decodeZIndexCompressed(id, xBits, yBits, zBits); + return decodeZIndexCompressed(id.toBigInt(), xBits, yBits, zBits); } interface BrainmapsMultiscaleManifestChunk extends MultiscaleManifestChunk { @@ -485,7 +483,7 @@ async function makeBatchMeshRequest( meshName: string; }, ids: Map, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const path = "/v1/objects/meshes:batch"; const batches: BatchMeshFragment[] = []; @@ -511,11 +509,10 @@ async function makeBatchMeshRequest( }; try { return await ( - await makeRequest(parameters.instance, credentialsProvider, { + await makeRequest(parameters.instance, credentialsProvider, path, { method: "POST", - path, - payload: JSON.stringify(payload), - signal: abortSignal, + body: JSON.stringify(payload), + signal: signal, }) ).arrayBuffer(); } finally { @@ -539,26 +536,21 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( return ""; })(); - download(chunk: BrainmapsMultiscaleManifestChunk, abortSignal: AbortSignal) { + download(chunk: BrainmapsMultiscaleManifestChunk, signal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.info.lods[0].info.name}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "GET", - path, - signal: abortSignal, + return makeRequest(parameters.instance, this.credentialsProvider, path, { + signal: signal, }) .then((response) => response.json()) .then((response) => decodeMultiscaleManifestChunk(chunk, response)); } - async downloadFragment( - chunk: MultiscaleFragmentChunk, - abortSignal: AbortSignal, - ) { + async downloadFragment(chunk: MultiscaleFragmentChunk, signal: AbortSignal) { const { parameters } = this; const manifestChunk = @@ -597,7 +589,6 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( octree[chunkIndex * 5 + 2] / relativeBlockShape[2], ); const fragmentKey = encodeZIndexCompressed3d( - tempUint64, xBits, yBits, zBits, @@ -641,7 +632,7 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( meshName, }, ids, - abortSignal, + signal, ) .then((response) => { --requestsInProgress; @@ -772,17 +763,15 @@ export class BrainmapsMeshSource extends BrainmapsSource( return ""; })(); - download(chunk: ManifestChunk, abortSignal: AbortSignal) { + download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.meshName}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest(parameters.instance, this.credentialsProvider, { - signal: abortSignal, - method: "GET", - path, + return makeRequest(parameters.instance, this.credentialsProvider, path, { + signal, }) .then((response) => response.json()) .then((response) => @@ -790,7 +779,7 @@ export class BrainmapsMeshSource extends BrainmapsSource( ); } - async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const ids = new Map(); @@ -807,7 +796,7 @@ export class BrainmapsMeshSource extends BrainmapsSource( credentialsProvider, parameters, ids, - abortSignal, + signal, ); decodeBatchMeshResponse(response, (fragment) => { if (!ids.delete(fragment.fullKey)) { @@ -852,7 +841,7 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, abortSignal: AbortSignal) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const payload: SkeletonPayload = { object_id: `${chunk.objectId}`, @@ -862,11 +851,10 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( `/meshes/${parameters.meshName}` + "/skeleton:binary"; applyChangeStack(parameters.changeSpec, payload); - return makeRequest(parameters.instance, this.credentialsProvider, { + return makeRequest(parameters.instance, this.credentialsProvider, path, { method: "POST", - path, - payload: JSON.stringify(payload), - signal: abortSignal, + body: JSON.stringify(payload), + signal, }) .then((response) => response.arrayBuffer()) .then((response) => decodeSkeletonChunk(chunk, response)); @@ -1134,19 +1122,23 @@ export class BrainmapsAnnotationGeometryChunkSource extends BrainmapsSource( AnnotationGeometryChunkSourceBackend, AnnotationSpatialIndexSourceParameters, ) { - async download(chunk: AnnotationGeometryChunk, abortSignal: AbortSignal) { + async download(chunk: AnnotationGeometryChunk, signal: AbortSignal) { const { parameters } = this; return Promise.all( spatialAnnotationTypes.map((spatialAnnotationType) => - makeRequest(parameters.instance, this.credentialsProvider, { - signal: abortSignal, - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: spatialAnnotationType, - ignore_payload: true, - }), - }).then((response) => response.json()), + makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + { + signal, + method: "POST", + body: JSON.stringify({ + type: spatialAnnotationType, + ignore_payload: true, + }), + }, + ).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); @@ -1162,39 +1154,47 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, _relationshipIndex: number, - abortSignal: AbortSignal, + signal: AbortSignal, ) { const { parameters } = this; return Promise.all( spatialAnnotationTypes.map((spatialAnnotationType) => - makeRequest(parameters.instance, this.credentialsProvider, { - signal: abortSignal, - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: spatialAnnotationType, - object_labels: [chunk.objectId.toString()], - ignore_payload: true, - }), - }).then((response) => response.json()), + makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + { + signal, + method: "POST", + body: JSON.stringify({ + type: spatialAnnotationType, + object_labels: [chunk.objectId.toString()], + ignore_payload: true, + }), + }, + ).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); }); } - downloadMetadata(chunk: AnnotationMetadataChunk, abortSignal: AbortSignal) { + downloadMetadata(chunk: AnnotationMetadataChunk, signal: AbortSignal) { const { parameters } = this; const id = chunk.key!; - return makeRequest(parameters.instance, this.credentialsProvider, { - signal: abortSignal, - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ - type: getSpatialAnnotationTypeFromId(id), - id: getFullSpatialAnnotationId(parameters, id), - }), - }) + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, + { + signal, + method: "POST", + body: JSON.stringify({ + type: getSpatialAnnotationTypeFromId(id), + id: getFullSpatialAnnotationId(parameters, id), + }), + }, + ) .then((response) => response.json()) .then( (response) => { @@ -1213,11 +1213,15 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( add(annotation: Annotation) { const { parameters } = this; const brainmapsAnnotation = annotationToBrainmaps(annotation); - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, - payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - }) + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, + { + method: "POST", + body: JSON.stringify({ annotations: [brainmapsAnnotation] }), + }, + ) .then((response) => response.json()) .then((response) => { verifyObject(response); @@ -1236,22 +1240,30 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( const { parameters } = this; const brainmapsAnnotation = annotationToBrainmaps(annotation); brainmapsAnnotation.id = getFullSpatialAnnotationId(parameters, id); - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, - payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - }).then((response) => response.json()); + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, + { + method: "POST", + body: JSON.stringify({ annotations: [brainmapsAnnotation] }), + }, + ).then((response) => response.json()); } delete(id: AnnotationId) { const { parameters } = this; - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:delete`, - payload: JSON.stringify({ - type: getSpatialAnnotationTypeFromId(id), - ids: [getFullSpatialAnnotationId(parameters, id)], - }), - }).then((response) => response.json()); + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:delete`, + { + method: "POST", + body: JSON.stringify({ + type: getSpatialAnnotationTypeFromId(id), + ids: [getFullSpatialAnnotationId(parameters, id)], + }), + }, + ).then((response) => response.json()); } } diff --git a/src/datasource/brainmaps/frontend.ts b/src/datasource/brainmaps/frontend.ts index 6bd0cfc1ba..aa5a16ba14 100644 --- a/src/datasource/brainmaps/frontend.ts +++ b/src/datasource/brainmaps/frontend.ts @@ -34,13 +34,16 @@ import { makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; import type { BrainmapsCredentialsProvider, BrainmapsInstance, OAuth2Credentials, } from "#src/datasource/brainmaps/api.js"; -import { makeRequest } from "#src/datasource/brainmaps/api.js"; +import { credentialsKey, makeRequest } from "#src/datasource/brainmaps/api.js"; import type { ChangeSpec, MultiscaleMeshInfo, @@ -58,9 +61,10 @@ import { import type { CompleteUrlOptions, DataSource, + DataSourceRegistry, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { VertexPositionFormat } from "#src/mesh/base.js"; import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import { SkeletonSource } from "#src/skeleton/frontend.js"; @@ -79,7 +83,6 @@ import { MultiscaleVolumeChunkSource as GenericMultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import { StatusMessage } from "#src/status.js"; import { transposeNestedArrays } from "#src/util/array.js"; import type { CompletionWithDescription } from "#src/util/completion.js"; import { @@ -106,7 +109,8 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { defaultStringCompare } from "#src/util/string.js"; class BrainmapsVolumeChunkSource extends WithParameters( @@ -769,49 +773,65 @@ const supportedQueryParameters = [ }, ]; -export class BrainmapsDataSource extends DataSourceProvider { +function getCredentialsProvider(credentialsManager: CredentialsManager) { + return credentialsManager.getCredentialsProvider( + credentialsKey, + ); +} + +export class BrainmapsDataSource implements DataSourceProvider { constructor( public instance: BrainmapsInstance, - public credentialsProvider: Owned, - ) { - super(); - } + public scheme: string, + ) {} get description() { return this.instance.description; } - private getMultiscaleInfo(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + private getMultiscaleInfo( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { type: "brainmaps:getMultiscaleInfo", volumeId, instance: this.instance, - credentialsProvider: getObjectId(this.credentialsProvider), }, - () => - makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/volumes/${volumeId}`, - }) - .then((response) => response.json()) - .then((response) => new MultiscaleVolumeInfo(response)), + options, + async (progressOptions) => { + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/volumes/${volumeId}`, + progressOptions, + ); + return new MultiscaleVolumeInfo(await response.json()); + }, ); } - private getMeshesInfo(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + private getMeshesInfo( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { type: "brainmaps:getMeshesInfo", volumeId, instance: this.instance, - credentialsProvider: getObjectId(this.credentialsProvider), }, - () => - makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/objects/${volumeId}/meshes`, - }) + options, + (progressOptions) => + makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/objects/${volumeId}/meshes`, + progressOptions, + ) .then((response) => response.json()) .then((response) => parseMeshesResponse(response)), ); @@ -848,7 +868,7 @@ export class BrainmapsDataSource extends DataSourceProvider { chunkLayoutPreference, jpegQuality, }; - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "brainmaps:get", instance: this.instance, @@ -856,15 +876,19 @@ export class BrainmapsDataSource extends DataSourceProvider { changeSpec, brainmapsOptions, }, - async () => { + options, + async (progressOptions) => { + const credentialsProvider = getCredentialsProvider( + options.registry.credentialsManager, + ); const [multiscaleVolumeInfo, meshesInfo] = await Promise.all([ - this.getMultiscaleInfo(options.chunkManager, volumeId), - this.getMeshesInfo(options.chunkManager, volumeId), + this.getMultiscaleInfo(options.registry, volumeId, progressOptions), + this.getMeshesInfo(options.registry, volumeId, progressOptions), ]); const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, + options.registry.chunkManager, this.instance, - this.credentialsProvider, + credentialsProvider, volumeId, changeSpec, multiscaleVolumeInfo, @@ -918,10 +942,10 @@ export class BrainmapsDataSource extends DataSourceProvider { const { single } = mesh; if (single !== undefined) { if (single.type === "TRIANGLES") { - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsMeshSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, parameters: { instance: this.instance, volumeId: volumeId, @@ -931,10 +955,10 @@ export class BrainmapsDataSource extends DataSourceProvider { }, ); } else { - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsSkeletonSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, parameters: { instance: this.instance, volumeId: volumeId, @@ -946,10 +970,10 @@ export class BrainmapsDataSource extends DataSourceProvider { } } else { const multi = mesh.multi!; - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsMultiscaleMeshSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, format: { fragmentRelativeVertices: false, vertexPositionFormat: VertexPositionFormat.float32, @@ -994,7 +1018,7 @@ export class BrainmapsDataSource extends DataSourceProvider { default: true, modelSubspaceDimensionIndices: [0, 1, 2], subsource: { - annotation: options.chunkManager.getChunkSource( + annotation: options.registry.chunkManager.getChunkSource( BrainmapsAnnotationSource, { parameters: { @@ -1004,7 +1028,7 @@ export class BrainmapsDataSource extends DataSourceProvider { upperVoxelBound: multiscaleVolumeInfo.scales[0].upperVoxelBound, }, - credentialsProvider: this.credentialsProvider, + credentialsProvider, }, ), }, @@ -1015,112 +1039,110 @@ export class BrainmapsDataSource extends DataSourceProvider { ); } - getProjectList(chunkManager: ChunkManager) { - return chunkManager.memoize.getUncounted( + getProjectList( + registry: DataSourceRegistry, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: "brainmaps:getProjectList" }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: "/v1beta2/projects", - }) - .then((response) => response.json()) - .then((projectsResponse) => { - return parseProjectList(projectsResponse); - }); - const description = `${this.instance.description} project list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}.`, - errorPrefix: `Error retrieving ${description}: `, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} project list`, }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + "/v1beta2/projects", + progressOptions, + ); + return parseProjectList(await response.json()); }, ); } - getDatasetList(chunkManager: ChunkManager, project: string) { - return chunkManager.memoize.getUncounted( + getDatasetList( + registry: DataSourceRegistry, + project: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: `brainmaps:${project}:getDatasetList` }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/datasets?project_id=${project}`, - }) - .then((response) => response.json()) - .then((datasetsResponse) => { - return parseAPIResponseList(datasetsResponse, "datasetIds"); - }); - const description = `${this.instance.description} dataset list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}`, - errorPrefix: `Error retrieving ${description}`, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} dataset list for ${project}`, }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/datasets?project_id=${project}`, + ); + return parseAPIResponseList(await response.json(), "datasetIds"); }, ); } - getVolumeList(chunkManager: ChunkManager, project: string, dataset: string) { - return chunkManager.memoize.getUncounted( + getVolumeList( + registry: DataSourceRegistry, + project: string, + dataset: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: `brainmaps:${project}:${dataset}:getVolumeList`, }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/volumes?project_id=${project}&dataset_id=${dataset}`, - }) - .then((response) => response.json()) - .then((volumesResponse) => { - const fullyQualifyiedVolumeList = parseAPIResponseList( - volumesResponse, - "volumeId", - ); - const splitPoint = project.length + dataset.length + 2; - const volumeList = []; - for (const volume of fullyQualifyiedVolumeList) { - volumeList.push(volume.substring(splitPoint)); - } - return volumeList; - }); - const description = `${this.instance.description} volume list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}`, - errorPrefix: `Error retrieving ${description}`, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} volume list for ${project}:${dataset}`, }); - return promise; + + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/volumes?project_id=${project}&dataset_id=${dataset}`, + progressOptions, + ); + const fullyQualifyiedVolumeList = parseAPIResponseList( + await response.json(), + "volumeId", + ); + const splitPoint = project.length + dataset.length + 2; + const volumeList = []; + for (const volume of fullyQualifyiedVolumeList) { + volumeList.push(volume.substring(splitPoint)); + } + return volumeList; }, ); } - getChangeStackList(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + getChangeStackList( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: "brainmaps:getChangeStackList", volumeId, }, - () => { - const promise: Promise = makeRequest( - this.instance, - this.credentialsProvider, - { - method: "GET", - path: `/v1beta2/changes/${volumeId}/change_stacks`, - }, - ) - .then((response) => response.json()) - .then((response) => parseChangeStackList(response)); - const description = `change stacks for ${volumeId}`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}.`, - errorPrefix: `Error retrieving ${description}: `, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} change stack list for ${volumeId}`, }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/changes/${volumeId}/change_stacks`, + progressOptions, + ); + return parseChangeStackList(await response.json()); }, ); } @@ -1143,7 +1165,11 @@ export class BrainmapsDataSource extends DataSourceProvider { } if (meshName !== undefined) { const volumeId = `${project}:${dataset}:${volume}`; - const meshes = await this.getMeshesInfo(options.chunkManager, volumeId); + const meshes = await this.getMeshesInfo( + options.registry, + volumeId, + options, + ); const results: CompletionWithDescription[] = []; const seenMultiscale = new Set(); for (const mesh of meshes) { @@ -1180,8 +1206,9 @@ export class BrainmapsDataSource extends DataSourceProvider { if (changestack !== undefined) { const volumeId = `${project}:${dataset}:${volume}`; const changeStacks = await this.getChangeStackList( - options.chunkManager, + options.registry, volumeId, + options, ); if (changeStacks === undefined) { throw null; @@ -1196,12 +1223,16 @@ export class BrainmapsDataSource extends DataSourceProvider { offset: providerUrl.length - volume.length, completions: getPrefixMatches( volume, - await this.getVolumeList(options.chunkManager, project, dataset), + await this.getVolumeList(options.registry, project, dataset, options), ), }; } if (dataset !== undefined) { - const datasets = await this.getDatasetList(options.chunkManager, project); + const datasets = await this.getDatasetList( + options.registry, + project, + options, + ); return { offset: providerUrl.length - dataset.length, completions: getPrefixMatches( @@ -1211,7 +1242,7 @@ export class BrainmapsDataSource extends DataSourceProvider { }; } - const projects = await this.getProjectList(options.chunkManager); + const projects = await this.getProjectList(options.registry, options); return { offset: 0, completions: getPrefixMatchesWithDescriptions( diff --git a/src/datasource/brainmaps/register_credentials_provider.ts b/src/datasource/brainmaps/register_credentials_provider.ts index 4d3035b159..f31189e993 100644 --- a/src/datasource/brainmaps/register_credentials_provider.ts +++ b/src/datasource/brainmaps/register_credentials_provider.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/brainmaps/api.js"; import { BrainmapsCredentialsProvider } from "#src/datasource/brainmaps/credentials_provider.js"; @@ -22,7 +22,7 @@ import { BrainmapsCredentialsProvider } from "#src/datasource/brainmaps/credenti declare const NEUROGLANCER_BRAINMAPS_CLIENT_ID: string | undefined; if (typeof NEUROGLANCER_BRAINMAPS_CLIENT_ID !== "undefined") { - defaultCredentialsManager.register( + registerDefaultCredentialsProvider( credentialsKey, () => new BrainmapsCredentialsProvider(NEUROGLANCER_BRAINMAPS_CLIENT_ID!), ); diff --git a/src/datasource/brainmaps/register_default.ts b/src/datasource/brainmaps/register_default.ts index 03c94c992f..c06935310e 100644 --- a/src/datasource/brainmaps/register_default.ts +++ b/src/datasource/brainmaps/register_default.ts @@ -15,21 +15,13 @@ */ import type { BrainmapsInstance } from "#src/datasource/brainmaps/api.js"; -import { credentialsKey } from "#src/datasource/brainmaps/api.js"; import { BrainmapsDataSource, productionInstance, } from "#src/datasource/brainmaps/frontend.js"; import { registerProvider } from "#src/datasource/default_provider.js"; -registerProvider( - "brainmaps", - (options) => - new BrainmapsDataSource( - productionInstance, - options.credentialsManager.getCredentialsProvider(credentialsKey), - ), -); +registerProvider(new BrainmapsDataSource(productionInstance, "brainmaps")); declare const NEUROGLANCER_BRAINMAPS_SERVERS: | { [key: string]: BrainmapsInstance } @@ -39,13 +31,6 @@ if (typeof NEUROGLANCER_BRAINMAPS_SERVERS !== "undefined") { for (const [key, instance] of Object.entries( NEUROGLANCER_BRAINMAPS_SERVERS, )) { - registerProvider( - `brainmaps-${key}`, - (options) => - new BrainmapsDataSource( - instance, - options.credentialsManager.getCredentialsProvider(credentialsKey), - ), - ); + registerProvider(new BrainmapsDataSource(instance, `brainmaps-${key}`)); } } diff --git a/src/datasource/deepzoom/backend.ts b/src/datasource/deepzoom/backend.ts index a5bf1e7122..fc5a74d8d6 100644 --- a/src/datasource/deepzoom/backend.ts +++ b/src/datasource/deepzoom/backend.ts @@ -18,17 +18,14 @@ import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; import { decodePng } from "#src/async_computation/decode_png_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { ImageTileEncoding, ImageTileSourceParameters, } from "#src/datasource/deepzoom/base.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { transposeArray2d } from "#src/util/array.js"; -import { isNotFoundError } from "#src/util/http_request.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; /* This is enough if support for these aren't needed: @@ -39,11 +36,13 @@ import { registerSharedObject } from "#src/worker_rpc.js"; @registerSharedObject() export class DeepzoomImageTileSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), ImageTileSourceParameters, ) { + private tileKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + gridShape = (() => { const gridShape = new Uint32Array(2); const { upperVoxelBound, chunkDataSize } = this.spec; @@ -53,7 +52,7 @@ export class DeepzoomImageTileSource extends WithParameters( return gridShape; })(); - async download(chunk: VolumeChunk, abortSignal: AbortSignal): Promise { + async download(chunk: VolumeChunk, signal: AbortSignal): Promise { const { parameters } = this; // /* This block is enough if support for these aren't needed: @@ -63,7 +62,7 @@ export class DeepzoomImageTileSource extends WithParameters( // const {tilesize, overlap} = parameters; // const [x, y] = chunk.chunkGridPosition; // const url = `${parameters.url}/${x}_${y}.${ImageTileEncoding[parameters.encoding].toLowerCase()}`; - // const response: Blob = await (await fetchSpecialOk(this.credentialsProvider, url, {signal: abortSignal})).blob(); + // const response: Blob = await (await fetchSpecialOk(this.credentialsProvider, url, {signal: signal})).blob(); // const tile = await createImageBitmap(response); // const canvas = new OffscreenCanvas(tilesize, tilesize); // const ctx = canvas.getContext("2d")!; @@ -82,73 +81,71 @@ export class DeepzoomImageTileSource extends WithParameters( const [x, y] = chunk.chunkGridPosition; const ox = x === 0 ? 0 : overlap; const oy = y === 0 ? 0 : overlap; - const url = `${parameters.url}/${x}_${y}.${parameters.format}`; - try { - const responseBuffer = await ( - await fetchSpecialOk(this.credentialsProvider, url, { - signal: abortSignal, - }) - ).arrayBuffer(); - - let tilewidth = 0; - let tileheight = 0; - let tiledata: Uint8Array | undefined; - switch (encoding) { - case ImageTileEncoding.PNG: { - const pngbitmap = await requestAsyncComputation( - decodePng, - abortSignal, - [responseBuffer], - new Uint8Array(responseBuffer), - undefined, - undefined, - undefined, - 3, - 1, - false, - ); - ({ width: tilewidth, height: tileheight } = pngbitmap); - tiledata = transposeArray2d( - pngbitmap.uint8Array, - tilewidth * tileheight, - 3, - ); - break; - } + const path = `${this.tileKvStore.path}/${x}_${y}.${parameters.format}`; + const response = await this.tileKvStore.store.read(path, { + signal, + }); + if (response === undefined) { + return; + } + const responseArray = new Uint8Array(await response.response.arrayBuffer()); - case ImageTileEncoding.JPG: - case ImageTileEncoding.JPEG: { - const jpegbitmap = await requestAsyncComputation( - decodeJpeg, - abortSignal, - [responseBuffer], - new Uint8Array(responseBuffer), - undefined, - undefined, - undefined, - 3, - false, - ); - ({ - uint8Array: tiledata, - width: tilewidth, - height: tileheight, - } = jpegbitmap); - break; - } + let tilewidth = 0; + let tileheight = 0; + let tiledata: Uint8Array | undefined; + switch (encoding) { + case ImageTileEncoding.PNG: { + const pngbitmap = await requestAsyncComputation( + decodePng, + signal, + [responseArray.buffer], + responseArray, + undefined, + undefined, + undefined, + 3, + 1, + false, + ); + ({ width: tilewidth, height: tileheight } = pngbitmap); + tiledata = transposeArray2d( + pngbitmap.uint8Array, + tilewidth * tileheight, + 3, + ); + break; } - if (tiledata !== undefined) { - const t2 = tilesize * tilesize; - const twh = tilewidth * tileheight; - const d = (chunk.data = new Uint8Array(t2 * 3)); - for (let k = 0; k < 3; k++) - for (let j = 0; j < tileheight; j++) - for (let i = 0; i < tilewidth; i++) - d[i + j * tilesize + k * t2] = - tiledata[i + ox + (j + oy) * tilewidth + k * twh]; + + case ImageTileEncoding.JPG: + case ImageTileEncoding.JPEG: { + const jpegbitmap = await requestAsyncComputation( + decodeJpeg, + signal, + [responseArray.buffer], + responseArray, + undefined, + undefined, + undefined, + 3, + false, + ); + ({ + uint8Array: tiledata, + width: tilewidth, + height: tileheight, + } = jpegbitmap); + break; } - } catch (e) { - if (!isNotFoundError(e)) throw e; + } + if (tiledata !== undefined) { + const t2 = tilesize * tilesize; + const twh = tilewidth * tileheight; + const d = (chunk.data = new Uint8Array(t2 * 3)); + for (let k = 0; k < 3; k++) + for (let j = 0; j < tileheight; j++) + for (let i = 0; i < tilewidth; i++) + d[i + j * tilesize + k * t2] = + tiledata[i + ox + (j + oy) * tilewidth + k * twh]; } } } diff --git a/src/datasource/deepzoom/frontend.ts b/src/datasource/deepzoom/frontend.ts index 502e2e6cbc..826d43e438 100644 --- a/src/datasource/deepzoom/frontend.ts +++ b/src/datasource/deepzoom/frontend.ts @@ -15,7 +15,6 @@ */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { BoundingBox, @@ -26,25 +25,24 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import { ImageTileEncoding, ImageTileSourceParameters, } from "#src/datasource/deepzoom/base.js"; import type { - CompleteUrlOptions, - ConvertLegacyUrlOptions, DataSource, DataSubsourceEntry, - GetDataSourceOptions, - NormalizeUrlOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; -import { - parseProviderUrl, - resolvePath, - unparseProviderUrl, -} from "#src/datasource/precomputed/frontend.js"; +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -57,7 +55,6 @@ import { } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { DataType } from "#src/util/data_type.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; import { verifyEnumString, verifyInt, @@ -65,18 +62,11 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; /*export*/ class DeepzoomImageTileSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), ImageTileSourceParameters, ) {} @@ -150,12 +140,11 @@ interface LevelInfo { url: string; constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, - /*public*/ url: string, + public sharedKvStoreContext: SharedKvStoreContext, + url: string, public info: PyramidalImageInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); this.url = url.substring(0, url.lastIndexOf(".")) + "_files"; } @@ -196,13 +185,10 @@ interface LevelInfo { chunkSource: this.chunkManager.getChunkSource( DeepzoomImageTileSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: resolvePath( - this.url, - (array.length - 1 - index).toString(), - ), + url: `${this.url}/${array.length - 1 - index}/`, encoding: this.info.encoding, format: this.info.format, overlap: this.info.overlap, @@ -228,9 +214,9 @@ interface DZIMetaData { } function getDZIMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { if (url.endsWith(".json") || url.includes(".json?")) { /* http://openseadragon.github.io/examples/tilesource-dzi/ @@ -240,16 +226,21 @@ function getDZIMetadata( */ throw new Error("DZI-JSON: OpenSeadragon hack not supported yet."); } - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "deepzoom:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - const text = await fetchSpecialOk(credentialsProvider, url, {}).then( - (response) => response.text(), - ); + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading Deep Zoom metadata from ${url}`, + }); + const { response } = await sharedKvStoreContext.kvStoreContext.read(url, { + ...progressOptions, + throwIfMissing: true, + }); + const text = await response.text(); const xml = new DOMParser().parseFromString(text, "text/xml"); const image = xml.documentElement; const size = verifyObject(image.getElementsByTagName("Size").item(0)); @@ -266,16 +257,14 @@ function getDZIMetadata( ); } -async function getImageDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, +function getImageDataSource( + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: DZIMetaData, -): Promise { +): DataSource { const info = buildPyramidalImageInfo(metadata); const volume = new DeepzoomPyramidalImageTileSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, url, info, ); @@ -296,53 +285,61 @@ async function getImageDataSource( }, }, ]; - return { modelTransform: makeIdentityTransform(modelSpace), subsources }; + return { + modelTransform: makeIdentityTransform(modelSpace), + subsources, + canonicalUrl: `${url}|deepzoom:`, + }; } -export class DeepzoomDataSource extends DataSourceProvider { - get description() { - return "Deep Zoom file-backed data source"; - } - - normalizeUrl(options: NormalizeUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); +export class DeepzoomDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "deepzoom"; } - - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get description() { + return "Deep Zoom data source"; } - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, - ); - return options.chunkManager.memoize.getUncounted( - { type: "deepzoom:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); + return options.registry.chunkManager.memoize.getAsync( + { type: "deepzoom:get", url: options.kvStoreUrl }, + options, + async (progressOptions): Promise => { const metadata = await getDZIMetadata( - options.chunkManager, - credentialsProvider, - url, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + progressOptions, + ); + return getImageDataSource( + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + metadata, ); - return getImageDataSource(options, credentialsProvider, url, metadata); }, ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, - ); +} + +async function detectFormat( + options: AutoDetectFileOptions, +): Promise { + const text = new TextDecoder().decode(options.prefix); + const xml = new DOMParser().parseFromString(text, "text/xml"); + if ( + xml.documentElement.tagName === "Image" && + xml.documentElement.namespaceURI === + "http://schemas.microsoft.com/deepzoom/2009" + ) { + return [{ suffix: "deepzoom:", description: "Deep Zoom" }]; } + return []; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 500, + suffixLength: 0, + match: detectFormat, + }); } diff --git a/src/datasource/deepzoom/register_default.ts b/src/datasource/deepzoom/register_default.ts index eb9c8a387d..cf97508b87 100644 --- a/src/datasource/deepzoom/register_default.ts +++ b/src/datasource/deepzoom/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { DeepzoomDataSource } from "#src/datasource/deepzoom/frontend.js"; -import { registerProvider } from "#src/datasource/default_provider.js"; +import { + DeepzoomDataSource, + registerAutoDetect, +} from "#src/datasource/deepzoom/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -registerProvider("deepzoom", () => new DeepzoomDataSource()); +const provider = new DeepzoomDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/default_provider.ts b/src/datasource/default_provider.ts index bc72938543..85bf8b0aa7 100644 --- a/src/datasource/default_provider.ts +++ b/src/datasource/default_provider.ts @@ -18,32 +18,47 @@ * @file Facility for registering default data sources. */ -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { DataSourceProvider } from "#src/datasource/index.js"; -import { DataSourceProviderRegistry } from "#src/datasource/index.js"; -import type { Owned } from "#src/util/disposable.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import type { + DataSourceProvider, + KvStoreBasedDataSourceProvider, +} from "#src/datasource/index.js"; +import { DataSourceRegistry } from "#src/datasource/index.js"; +import { LocalDataSourceProvider } from "#src/datasource/local.js"; +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; export interface ProviderOptions { - credentialsManager: CredentialsManager; + credentialsManager: SharedCredentialsManager; + kvStoreContext: SharedKvStoreContext; } -export type ProviderFactory = ( - options: ProviderOptions, -) => Owned; -const providerFactories = new Map(); +const providers: DataSourceProvider[] = []; +const kvStoreBasedProviders: KvStoreBasedDataSourceProvider[] = []; +export const dataSourceAutoDetectRegistry = new AutoDetectRegistry(); -export function registerProvider(name: string, factory: ProviderFactory) { - providerFactories.set(name, factory); +export function registerProvider(provider: DataSourceProvider) { + providers.push(provider); +} + +export function registerKvStoreBasedDataProvider( + provider: KvStoreBasedDataSourceProvider, +) { + kvStoreBasedProviders.push(provider); } export function getDefaultDataSourceProvider(options: ProviderOptions) { - const provider = new DataSourceProviderRegistry(options.credentialsManager); - for (const [name, factory] of providerFactories) { - try { - provider.register(name, factory(options)); - } catch (e) { - console.warn(`Skipping ${name} data source: ${e}`); - } + const registry = new DataSourceRegistry(options.kvStoreContext); + registry.register(new LocalDataSourceProvider()); + for (const provider of providers) { + registry.register(provider); + } + for (const provider of kvStoreBasedProviders) { + registry.registerKvStoreBasedProvider(provider); } - return provider; + options.kvStoreContext.kvStoreContext.autoDetectRegistry.copyTo( + registry.autoDetectRegistry, + ); + dataSourceAutoDetectRegistry.copyTo(registry.autoDetectRegistry); + return registry; } diff --git a/src/datasource/dvid/api.ts b/src/datasource/dvid/api.ts index 32d556cb3d..c9f0ed1ed2 100644 --- a/src/datasource/dvid/api.ts +++ b/src/datasource/dvid/api.ts @@ -18,7 +18,7 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; export interface DVIDToken { @@ -76,7 +76,7 @@ export function fetchWithDVIDCredentials( input: string, init: RequestInit, ): Promise { - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, input, init, diff --git a/src/datasource/dvid/backend.ts b/src/datasource/dvid/backend.ts index 7edc1602f1..c136a10dad 100644 --- a/src/datasource/dvid/backend.ts +++ b/src/datasource/dvid/backend.ts @@ -64,7 +64,7 @@ export class DVIDSkeletonSource extends DVIDSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, abortSignal: AbortSignal) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const bodyid = `${chunk.objectId}`; const url = @@ -76,7 +76,7 @@ export class DVIDSkeletonSource extends DVIDSource( this.credentialsProvider, appendQueryStringForDvid(url, parameters.user), { - signal: abortSignal, + signal: signal, }, ) .then((response) => response.arrayBuffer()) @@ -117,7 +117,7 @@ export class DVIDMeshSource extends DVIDSource( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const dvidInstance = new DVIDInstance( parameters.baseUrl, @@ -132,7 +132,7 @@ export class DVIDMeshSource extends DVIDSource( this.credentialsProvider, appendQueryStringForDvid(meshUrl, parameters.user), { - signal: abortSignal, + signal: signal, }, ) .then((response) => response.arrayBuffer()) @@ -145,7 +145,7 @@ export class DVIDVolumeChunkSource extends DVIDSource( VolumeChunkSource, VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const params = this.parameters; let path: string; { @@ -161,11 +161,11 @@ export class DVIDVolumeChunkSource extends DVIDSource( const response = await fetchWithDVIDCredentials( this.credentialsProvider, appendQueryStringForDvid(`${params.baseUrl}${path}`, params.user), - { signal: abortSignal }, + { signal: signal }, ).then((response) => response.arrayBuffer()); await decoder( chunk, - abortSignal, + signal, params.encoding === VolumeChunkEncoding.JPEG ? response.slice(16) : response, diff --git a/src/datasource/dvid/credentials_provider.ts b/src/datasource/dvid/credentials_provider.ts index 1bdf2e9f62..74dd40f515 100644 --- a/src/datasource/dvid/credentials_provider.ts +++ b/src/datasource/dvid/credentials_provider.ts @@ -26,15 +26,16 @@ import { import { getCredentialsWithStatus } from "#src/credentials_provider/interactive_credentials_provider.js"; import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { fetchOk } from "#src/util/http_request.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; async function getAuthToken( authServer: string, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const response = await fetchOk(authServer, { method: "GET", credentials: "include", - signal: abortSignal, + signal: signal, }); const token = await response.text(); return { token }; @@ -45,16 +46,19 @@ class BaseDVIDCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter(async (abortSignal) => { + get = makeCredentialsGetter(async (options) => { const { authServer } = this; if (!authServer) return { token: "" }; + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting DVID access token from ${authServer}`, + }); return await getCredentialsWithStatus( { description: `DVID server ${this.authServer}`, supportsImmediate: true, - get: async (abortSignal, immediate) => { + get: async (signal, immediate) => { if (immediate) { - return await getAuthToken(authServer, abortSignal); + return await getAuthToken(authServer, signal); } // In the current DVID setup, https://flyemlogin. is expected for the login server const match = authServer.match(/^[^/]+\/\/[^/.]+\.([^/]+)/); @@ -70,7 +74,7 @@ class BaseDVIDCredentialsProvider extends CredentialsProvider { } }, }, - abortSignal, + options.signal, ); }); } diff --git a/src/datasource/dvid/frontend.ts b/src/datasource/dvid/frontend.ts index 82b5ec2bc7..d4db7ffa4e 100644 --- a/src/datasource/dvid/frontend.ts +++ b/src/datasource/dvid/frontend.ts @@ -29,10 +29,7 @@ import { makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { - CredentialsManager, - CredentialsProvider, -} from "#src/credentials_provider/index.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { credentialsKey, @@ -50,8 +47,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { MeshSource } from "#src/mesh/frontend.js"; import { SkeletonSource } from "#src/skeleton/frontend.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; @@ -65,7 +62,6 @@ import { MultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import { StatusMessage } from "#src/status.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, @@ -85,6 +81,8 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; const serverDataTypes = new Map(); serverDataTypes.set("uint8", DataType.UINT8); @@ -453,26 +451,21 @@ export function getServerInfo( chunkManager: ChunkManager, baseUrl: string, credentialsProvider: CredentialsProvider, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "dvid:getServerInfo", baseUrl }, - () => { - const result = fetchWithDVIDCredentials( + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving repository info for DVID server ${baseUrl}`, + }); + const response = await fetchWithDVIDCredentials( credentialsProvider, `${baseUrl}/api/repos/info`, - { - method: "GET", - }, - ) - .then((response) => response.json()) - .then((response) => new ServerInfo(response)); - const description = `repository info for DVID server ${baseUrl}`; - StatusMessage.forPromise(result, { - initialMessage: `Retrieving ${description}.`, - delay: true, - errorPrefix: `Error retrieving ${description}: `, - }); - return result; + progressOptions, + ); + return new ServerInfo(await response.json()); }, ); } @@ -572,7 +565,7 @@ function getVolumeSource( }); const volume = new DvidMultiscaleVolumeChunkSource( - options.chunkManager, + options.registry.chunkManager, baseUrl, nodeKey, dataInstanceKey, @@ -599,7 +592,7 @@ function getVolumeSource( id: "meshes", default: true, subsource: { - mesh: options.chunkManager.getChunkSource(DVIDMeshSource, { + mesh: options.registry.chunkManager.getChunkSource(DVIDMeshSource, { parameters: { ...sourceParameters, dataInstanceKey: info.meshSrc, @@ -615,7 +608,7 @@ function getVolumeSource( id: "skeletons", default: true, subsource: { - mesh: options.chunkManager.getChunkSource(DVIDSkeletonSource, { + mesh: options.registry.chunkManager.getChunkSource(DVIDSkeletonSource, { parameters: { ...sourceParameters, dataInstanceKey: info.skeletonSrc, @@ -642,16 +635,17 @@ export function getDataSource( const sourceParameters = parseSourceUrl(options.providerUrl); const { baseUrl, nodeKey, dataInstanceKey } = sourceParameters; - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "dvid:MultiscaleVolumeChunkSource", baseUrl, nodeKey: nodeKey, dataInstanceKey, }, - async () => { + options, + async (progressOptions) => { const credentailsProvider = - options.credentialsManager.getCredentialsProvider( + options.registry.credentialsManager.getCredentialsProvider( credentialsKey, { dvidServer: sourceParameters.baseUrl, @@ -659,9 +653,10 @@ export function getDataSource( }, ); const serverInfo = await getServerInfo( - options.chunkManager, + options.registry.chunkManager, baseUrl, credentailsProvider, + progressOptions, ); const repositoryInfo = serverInfo.getNode(nodeKey); if (repositoryInfo === undefined) { @@ -744,12 +739,13 @@ export async function completeUrl( const authServer = getDefaultAuthServer(baseUrl); const serverInfo = await getServerInfo( - options.chunkManager, + options.registry.chunkManager, baseUrl, - options.credentialsManager.getCredentialsProvider( + options.registry.credentialsManager.getCredentialsProvider( credentialsKey, { dvidServer: baseUrl, authServer }, ), + options, ); return applyCompletionOffset( baseUrl.length + 1, @@ -757,11 +753,10 @@ export async function completeUrl( ); } -export class DVIDDataSource extends DataSourceProvider { - constructor(public credentialsManager: CredentialsManager) { - super(); +export class DVIDDataSource implements DataSourceProvider { + get scheme() { + return "dvid"; } - get description() { return "DVID"; } diff --git a/src/datasource/dvid/register_credentials_provider.ts b/src/datasource/dvid/register_credentials_provider.ts index d14e3bb2e9..42891dc49a 100644 --- a/src/datasource/dvid/register_credentials_provider.ts +++ b/src/datasource/dvid/register_credentials_provider.ts @@ -18,11 +18,11 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/dvid/api.js"; import { DVIDCredentialsProvider } from "#src/datasource/dvid/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( credentialsKey, (params: { dvidServer: string; authServer: string | undefined }) => new DVIDCredentialsProvider(params.dvidServer, params.authServer), diff --git a/src/datasource/dvid/register_default.ts b/src/datasource/dvid/register_default.ts index ac96fb56f7..810a8dbb79 100644 --- a/src/datasource/dvid/register_default.ts +++ b/src/datasource/dvid/register_default.ts @@ -17,7 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { DVIDDataSource } from "#src/datasource/dvid/frontend.js"; -registerProvider( - "dvid", - (options) => new DVIDDataSource(options.credentialsManager), -); +registerProvider(new DVIDDataSource()); diff --git a/src/datasource/enabled_frontend_modules.ts b/src/datasource/enabled_frontend_modules.ts index 96b934b7b7..264c63800b 100644 --- a/src/datasource/enabled_frontend_modules.ts +++ b/src/datasource/enabled_frontend_modules.ts @@ -7,13 +7,12 @@ import "#datasource/deepzoom/register_default"; import "#datasource/dvid/register_default"; import "#datasource/dvid/register_credentials_provider"; import "#datasource/graphene/register_default"; -import "#datasource/middleauth/register_credentials_provider"; import "#datasource/n5/register_default"; -import "#datasource/ngauth/register_credentials_provider"; import "#datasource/nggraph/register_default"; import "#datasource/nifti/register_default"; import "#datasource/obj/register_default"; import "#datasource/precomputed/register_default"; +import "#datasource/python/register_default"; import "#datasource/render/register_default"; import "#datasource/vtk/register_default"; import "#datasource/zarr/register_default"; diff --git a/src/datasource/graphene/backend.ts b/src/datasource/graphene/backend.ts index 174fd2d0b6..987c48d831 100644 --- a/src/datasource/graphene/backend.ts +++ b/src/datasource/graphene/backend.ts @@ -22,7 +22,6 @@ import { ChunkSource, } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import type { ChunkedGraphChunkSpecification } from "#src/datasource/graphene/base.js"; import { getGrapheneFragmentKey, @@ -33,8 +32,12 @@ import { CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, RENDER_RATIO_LIMIT, isBaseSegmentId, + parseGrapheneError, } from "#src/datasource/graphene/base.js"; import { decodeManifestChunk } from "#src/datasource/precomputed/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { KvStoreWithPath, ReadResponse } from "#src/kvstore/index.js"; +import { readKvStore } from "#src/kvstore/index.js"; import type { FragmentChunk, ManifestChunk } from "#src/mesh/backend.js"; import { assignMeshFragmentData, MeshSource } from "#src/mesh/backend.js"; import { decodeDraco } from "#src/mesh/draco/index.js"; @@ -59,13 +62,8 @@ import { } from "#src/sliceview/base.js"; import { computeChunkBounds } from "#src/sliceview/volume/backend.js"; import { Uint64Set } from "#src/uint64_set.js"; -import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; import { vec3, vec3Key } from "#src/util/geom.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { HttpError } from "#src/util/http_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, @@ -75,73 +73,67 @@ import { import type { RPC } from "#src/worker_rpc.js"; import { registerSharedObject, registerRPC } from "#src/worker_rpc.js"; -function getVerifiedFragmentPromise( - credentialsProvider: SpecialProtocolCredentialsProvider, - chunk: FragmentChunk, - parameters: MeshSourceParameters, - abortSignal: AbortSignal, -) { - if (chunk.fragmentId && chunk.fragmentId.charAt(0) === "~") { - const parts = chunk.fragmentId.substr(1).split(":"); - const startOffset = Number(parts[1]); - const endOffset = startOffset + Number(parts[2]); - return fetchSpecialHttpByteRange( - credentialsProvider, - `${parameters.fragmentUrl}/initial/${parts[0]}`, - startOffset, - endOffset, - abortSignal, +function downloadFragmentWithSharding( + fragmentKvStore: KvStoreWithPath, + fragmentId: string, + signal: AbortSignal, +): Promise { + if (fragmentId && fragmentId.charAt(0) === "~") { + const parts = fragmentId.substring(1).split(":"); + const byteRange = { offset: Number(parts[1]), length: Number(parts[2]) }; + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}initial/${parts[0]}`, + { signal, byteRange, throwIfMissing: true }, ); } - return fetchSpecialOk( - credentialsProvider, - `${parameters.fragmentUrl}/dynamic/${chunk.fragmentId}`, - { signal: abortSignal }, - ).then((response) => response.arrayBuffer()); + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}dynamic/${fragmentId}`, + { signal, throwIfMissing: true }, + ); } -function getFragmentDownloadPromise( - credentialsProvider: SpecialProtocolCredentialsProvider, - chunk: FragmentChunk, +function downloadFragment( + fragmentKvStore: KvStoreWithPath, + fragmentId: string, parameters: MeshSourceParameters, - abortSignal: AbortSignal, -) { - let fragmentDownloadPromise; + signal: AbortSignal, +): Promise { if (parameters.sharding) { - fragmentDownloadPromise = getVerifiedFragmentPromise( - credentialsProvider, - chunk, - parameters, - abortSignal, - ); + return downloadFragmentWithSharding(fragmentKvStore, fragmentId, signal); } else { - fragmentDownloadPromise = fetchSpecialOk( - credentialsProvider, - `${parameters.fragmentUrl}/${chunk.fragmentId}`, - { signal: abortSignal }, - ).then((response) => response.arrayBuffer()); + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}/${fragmentId}`, + { signal, throwIfMissing: true }, + ); } - return fragmentDownloadPromise; } async function decodeDracoFragmentChunk( chunk: FragmentChunk, - response: ArrayBuffer, + response: Uint8Array, ) { - const rawMesh = await decodeDraco(new Uint8Array(response)); + const rawMesh = await decodeDraco(response); assignMeshFragmentData(chunk, rawMesh); } @registerSharedObject() export class GrapheneMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MeshSource, - ), + WithSharedKvStoreContextCounterpart(MeshSource), MeshSourceParameters, ) { manifestRequestCount = new Map(); newSegments = new Uint64Set(); + manifestKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.manifestUrl, + ); + fragmentKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.fragmentUrl, + ); + addNewSegment(segment: Uint64) { const { newSegments } = this; newSegments.add(segment); @@ -151,48 +143,49 @@ export class GrapheneMeshSource extends WithParameters( }, TEN_MINUTES); } - async download(chunk: ManifestChunk, abortSignal: AbortSignal) { + async download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters, newSegments, manifestRequestCount } = this; if (isBaseSegmentId(chunk.objectId, parameters.nBitsForLayerId)) { return decodeManifestChunk(chunk, { fragments: [] }); } - const url = `${parameters.manifestUrl}/manifest`; - const manifestUrl = `${url}/${chunk.objectId}:${parameters.lod}?verify=1&prepend_seg_ids=1`; - await fetchSpecialOk(this.credentialsProvider, manifestUrl, { - signal: abortSignal, - }) - .then((response) => response.json()) - .then((response) => { - const chunkIdentifier = manifestUrl; - if (newSegments.has(chunk.objectId)) { - const requestCount = - (manifestRequestCount.get(chunkIdentifier) || 0) + 1; - manifestRequestCount.set(chunkIdentifier, requestCount); - setTimeout( - () => { - this.chunkManager.queueManager.updateChunkState( - chunk, - ChunkState.QUEUED, - ); - }, - 2 ** requestCount * 1000, + const { manifestKvStore } = this; + const manifestPath = `${manifestKvStore.path}/manifest/${chunk.objectId}:${parameters.lod}?verify=1&prepend_seg_ids=1`; + const response = await ( + await readKvStore(manifestKvStore.store, manifestPath, { + throwIfMissing: true, + signal, + }) + ).response.json(); + const chunkIdentifier = manifestPath; + if (newSegments.has(chunk.objectId)) { + const requestCount = (manifestRequestCount.get(chunkIdentifier) ?? 0) + 1; + manifestRequestCount.set(chunkIdentifier, requestCount); + setTimeout( + () => { + this.chunkManager.queueManager.updateChunkState( + chunk, + ChunkState.QUEUED, ); - } else { - manifestRequestCount.delete(chunkIdentifier); - } - return decodeManifestChunk(chunk, response); - }); + }, + 2 ** requestCount * 1000, + ); + } else { + manifestRequestCount.delete(chunkIdentifier); + } + return decodeManifestChunk(chunk, response); } - async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { - const { parameters } = this; - const response = await getFragmentDownloadPromise( - undefined, + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { + const { response } = await downloadFragment( + this.fragmentKvStore, + chunk.fragmentId!, + this.parameters, + signal, + ); + await decodeDracoFragmentChunk( chunk, - parameters, - abortSignal, + new Uint8Array(await response.arrayBuffer()), ); - await decodeDracoFragmentChunk(chunk, response); } getFragmentKey(objectKey: string | null, fragmentId: string) { @@ -250,9 +243,7 @@ function decodeChunkedGraphChunk(leaves: string[]) { @registerSharedObject() export class GrapheneChunkedGraphChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - ChunkSource, - ), + WithSharedKvStoreContextCounterpart(ChunkSource), ChunkedGraphSourceParameters, ) { spec: ChunkedGraphChunkSpecification; @@ -260,6 +251,10 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( tempChunkDataSize: Uint32Array; tempChunkPosition: Float32Array; + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + constructor(rpc: RPC, options: any) { super(rpc, options); this.spec = options.spec; @@ -268,11 +263,7 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( this.tempChunkPosition = new Float32Array(rank); } - async download( - chunk: ChunkedGraphChunk, - abortSignal: AbortSignal, - ): Promise { - const { parameters } = this; + async download(chunk: ChunkedGraphChunk, signal: AbortSignal): Promise { const chunkPosition = this.computeChunkBounds(chunk); const chunkDataSize = chunk.chunkDataSize!; const bounds = @@ -280,20 +271,25 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( `${chunkPosition[1]}-${chunkPosition[1] + chunkDataSize[1]}_` + `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; - const request = fetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.segment}/leaves?int64_as_str=1&bounds=${bounds}`, - { signal: abortSignal }, + const { kvStore } = this; + + const request = readKvStore( + kvStore.store, + `${kvStore.path}/${chunk.segment}/leaves?int64_as_str=1&bounds=${bounds}`, + { signal, throwIfMissing: true }, ); await this.withErrorMessage( request, `Fetching leaves of segment ${chunk.segment} in region ${bounds}: `, ) - .then((res) => res.json()) + .then((res) => res.response.json()) .then((res) => { chunk.leaves = decodeChunkedGraphChunk(res.leaf_ids); }) - .catch((err) => console.error(err)); + .catch((err) => { + if (err instanceof Error && err.name === "AbortError") return; + console.error(err); + }); } getChunk(chunkGridPosition: Float32Array, segment: Uint64) { @@ -312,21 +308,17 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( return computeChunkBounds(this, chunk); } - async withErrorMessage( - promise: Promise, + async withErrorMessage( + promise: Promise, errorPrefix: string, - ): Promise { - const response = await promise; - if (response.ok) { - return response; - } - let msg: string; - try { - msg = (await response.json()).message; - } catch { - msg = await response.text(); - } - throw new Error(`[${response.status}] ${errorPrefix}${msg}`); + ): Promise { + return promise.catch(async (e) => { + if (e instanceof HttpError && e.response) { + const msg = await parseGrapheneError(e); + throw new Error(`[${e.response.status}] ${errorPrefix}${msg ?? ""}`); + } + throw e; + }); } } diff --git a/src/datasource/graphene/base.ts b/src/datasource/graphene/base.ts index 28a6403af3..aedf2a291b 100644 --- a/src/datasource/graphene/base.ts +++ b/src/datasource/graphene/base.ts @@ -25,6 +25,7 @@ import type { } from "#src/sliceview/base.js"; import { makeSliceViewChunkSpecification } from "#src/sliceview/base.js"; import type { mat4 } from "#src/util/geom.js"; +import type { HttpError } from "#src/util/http_request.js"; import { Uint64 } from "#src/util/uint64.js"; @@ -137,3 +138,16 @@ export function makeChunkedGraphChunkSpecification( export interface ChunkedGraphChunkSource extends SliceViewChunkSource { spec: ChunkedGraphChunkSpecification; } + +export async function parseGrapheneError(e: HttpError) { + if (e.response) { + let msg: string; + if (e.response.headers.get("content-type") === "application/json") { + msg = (await e.response.json()).message; + } else { + msg = await e.response.text(); + } + return msg; + } + return undefined; +} diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 71790be466..b0966e59ae 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -34,14 +34,13 @@ import { LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeIdentityTransform } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; import type { ChunkedGraphChunkSource as ChunkedGraphChunkSourceInterface, ChunkedGraphChunkSpecification, MultiscaleMeshMetadata, } from "#src/datasource/graphene/base.js"; import { + parseGrapheneError, CHUNKED_GRAPH_LAYER_RPC_ID, CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, ChunkedGraphSourceParameters, @@ -54,10 +53,11 @@ import { } from "#src/datasource/graphene/base.js"; import type { DataSource, + DataSourceLookupResult, DataSubsourceEntry, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { RedirectError } from "#src/datasource/index.js"; import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { DataEncoding, @@ -67,11 +67,16 @@ import type { MultiscaleVolumeInfo } from "#src/datasource/precomputed/frontend. import { getSegmentPropertyMap, parseMultiscaleVolumeInfo, - parseProviderUrl, - PrecomputedDataSource, PrecomputedMultiscaleVolumeChunkSource, - resolvePath, } from "#src/datasource/precomputed/frontend.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { HttpKvStore } from "#src/kvstore/http/index.js"; +import { + ensureEmptyUrlSuffix, + kvstoreEnsureDirectoryPipelineUrl, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { LayerView, MouseSelectionState, @@ -160,6 +165,7 @@ import type { ValueOrError } from "#src/util/error.js"; import { makeValueOrError, valueOrThrow } from "#src/util/error.js"; import { EventActionMap } from "#src/util/event_action_map.js"; import { mat4, vec3, vec4 } from "#src/util/geom.js"; +import type { FetchOk } from "#src/util/http_request.js"; import { HttpError, isNotFoundError } from "#src/util/http_request.js"; import { parseArray, @@ -178,16 +184,9 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; import { Uint64 } from "#src/util/uint64.js"; import { makeDeleteButton } from "#src/widget/delete_button.js"; @@ -213,7 +212,7 @@ const TRANSPARENT_COLOR_PACKED = new Uint64(packColor(TRANSPARENT_COLOR)); const MULTICUT_OFF_COLOR = vec4.fromValues(0, 0, 0, 0.5); class GrapheneMeshSource extends WithParameters( - WithCredentialsProvider()(MeshSource), + WithSharedKvStoreContext(MeshSource), MeshSourceParameters, ) { getFragmentKey(objectKey: string | null, fragmentId: string) { @@ -230,7 +229,7 @@ class AppInfo { // .../1.0/... is the legacy link style // .../table/... is the current, version agnostic link style (for retrieving the info file) const linkStyle = - /^(https?:\/\/[.\w:\-/]+)\/segmentation\/(?:1\.0|table)\/([^/]+)\/?$/; + /^((?:middleauth\+)?https?:\/\/[.\w:\-/]+)\/segmentation\/(?:1\.0|table)\/([^/]+)\/?$/; const match = infoUrl.match(linkStyle); if (match === null) { throw Error(`Graph URL invalid: ${infoUrl}`); @@ -249,7 +248,7 @@ class AppInfo { // Dealing with a prehistoric graph server with no version information this.supported_api_versions = [0]; } - if (PYCG_APP_VERSION in this.supported_api_versions === false) { + if (this.supported_api_versions.includes(PYCG_APP_VERSION) === false) { const redirectMsg = `This Neuroglancer branch requires Graph Server version ${PYCG_APP_VERSION}, but the server only supports version(s) ${this.supported_api_versions}.`; throw new Error(redirectMsg); } @@ -284,12 +283,9 @@ interface GrapheneMultiscaleVolumeInfo extends MultiscaleVolumeInfo { function parseGrapheneMultiscaleVolumeInfo( obj: unknown, url: string, - credentialsManager: CredentialsManager, ): GrapheneMultiscaleVolumeInfo { const volumeInfo = parseMultiscaleVolumeInfo(obj); - const dataUrl = verifyObjectProperty(obj, "data_dir", (x) => - parseSpecialUrl(x, credentialsManager), - ).url; + const dataUrl = verifyObjectProperty(obj, "data_dir", verifyString); const app = verifyObjectProperty(obj, "app", (x) => new AppInfo(url, x)); const graph = verifyObjectProperty(obj, "graph", (x) => new GraphInfo(x)); return { @@ -302,11 +298,10 @@ function parseGrapheneMultiscaleVolumeInfo( class GrapheneMultiscaleVolumeChunkSource extends PrecomputedMultiscaleVolumeChunkSource { constructor( - chunkManager: ChunkManager, - public chunkedGraphCredentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, public info: GrapheneMultiscaleVolumeInfo, ) { - super(chunkManager, undefined, info.dataUrl, info); + super(sharedKvStoreContext, info.dataUrl, info); } getChunkedGraphSource() { @@ -341,7 +336,7 @@ class GrapheneMultiscaleVolumeChunkSource extends PrecomputedMultiscaleVolumeChu GrapheneChunkedGraphChunkSource, { spec, - credentialsProvider: this.chunkedGraphCredentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, parameters: { url: `${this.info.app!.segmentationUrl}/node` }, }, ), @@ -430,13 +425,18 @@ function parseMeshMetadata(data: any): ParsedMeshMetadata { } async function getMeshMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { let metadata: any; try { - metadata = await getJsonMetadata(chunkManager, credentialsProvider, url); + metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ false, + options, + ); } catch (e) { if (isNotFoundError(e)) { // If we fail to fetch the info file, assume it is the legacy @@ -512,27 +512,26 @@ function parseGrapheneShardingParameters( } function getShardedMeshSource( - chunkManager: ChunkManager, + sharedKvStoreContext: SharedKvStoreContext, parameters: MeshSourceParameters, - credentialsProvider: SpecialProtocolCredentialsProvider, ) { - return chunkManager.getChunkSource(GrapheneMeshSource, { + return sharedKvStoreContext.chunkManager.getChunkSource(GrapheneMeshSource, { + sharedKvStoreContext, parameters, - credentialsProvider, }); } async function getMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, fragmentUrl: string, nBitsForLayerId: number, + options: ProgressOptions, ) { const { metadata, segmentPropertyMap } = await getMeshMetadata( - chunkManager, - undefined, + sharedKvStoreContext, fragmentUrl, + options, ); const parameters: MeshSourceParameters = { manifestUrl: url, @@ -543,27 +542,35 @@ async function getMeshSource( }; const transform = metadata?.transform || mat4.create(); return { - source: getShardedMeshSource(chunkManager, parameters, credentialsProvider), + source: getShardedMeshSource(sharedKvStoreContext, parameters), transform, segmentPropertyMap, }; } -function getJsonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, +export function getJsonMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, + required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { - type: "graphene:metadata", + type: "precomputed:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - return await fetchSpecialOk(credentialsProvider, `${url}/info`, {}).then( - (response) => response.json(), - ); + options, + async (options) => { + const infoUrl = pipelineUrlJoin(url, "info"); + using _span = new ProgressSpan(options.progressListener, { + message: `Reading graphene metadata from ${infoUrl}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(infoUrl, { + ...options, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -578,31 +585,22 @@ function getSubsourceToModelSubspaceTransform(info: MultiscaleVolumeInfo) { } async function getVolumeDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, + options: ProgressOptions, + stateJson: any, ): Promise { - const info = parseGrapheneMultiscaleVolumeInfo( - metadata, - url, - options.credentialsManager, - ); + const info = parseGrapheneMultiscaleVolumeInfo(metadata, url); const volume = new GrapheneMultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, info, ); const state = new GrapheneState(); - if (options.state) { - state.restoreState(options.state); + if (stateJson) { + state.restoreState(stateJson); } - const segmentationGraph = new GrapheneGraphSource( - info, - credentialsProvider, - volume, - state, - ); + const segmentationGraph = new GrapheneGraphSource(info, volume, state); const { modelSpace } = info; const subsources: DataSubsourceEntry[] = [ { @@ -626,18 +624,19 @@ async function getVolumeDataSource( }, ]; if (info.segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, info.segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.segmentPropertyMap, + ), ); - const segmentPropertyMap = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMap = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -646,11 +645,16 @@ async function getVolumeDataSource( } if (info.mesh !== undefined) { const { source: meshSource, transform } = await getMeshSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, info.app!.meshingUrl, - resolvePath(info.dataUrl, info.mesh), + kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + info.dataUrl, + info.mesh, + ), + ), info.graph.nBitsForLayerId, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -673,56 +677,56 @@ async function getVolumeDataSource( }; } -export class GrapheneDataSource extends PrecomputedDataSource { - get description() { - return "Graphene file-backed data source"; +// Note: Graphene is not really a kvstore-based data source, since it relies on +// making arbitrary HTTP requests rather than just kvstore. It fails if the +// provided kvstore does not inherit from HttpKvStore. +export class GrapheneDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "graphene"; } - - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, - ); - return options.chunkManager.memoize.getUncounted( - { type: "graphene:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, + get description() { + return "Graphene data source"; + } + + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + ensureEmptyUrlSuffix(options.url); + const url = kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl); + return options.registry.chunkManager.memoize.getAsync( + { type: "graphene:get", url }, + options, + async (progressOptions) => { + const metadata = await getJsonMetadata( + options.registry.sharedKvStoreContext, + url, + /*required=*/ true, + progressOptions, ); - let metadata: any; - try { - metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - url, - ); - } catch (e) { - if (isNotFoundError(e)) { - if (parameters.type === "mesh") { - console.log("does this happen?"); - } - } - throw e; - } verifyObject(metadata); const redirect = verifyOptionalObjectProperty( metadata, "redirect", verifyString, ); + const canonicalUrl = `${options.url.scheme}://${url}`; if (redirect !== undefined) { - throw new RedirectError(redirect); + return { canonicalUrl, targetUrl: redirect }; } const t = verifyOptionalObjectProperty(metadata, "@type", verifyString); switch (t) { case "neuroglancer_multiscale_volume": - case undefined: - return await getVolumeDataSource( - options, - credentialsProvider, + case undefined: { + const dataSource = await getVolumeDataSource( + options.registry.sharedKvStoreContext, url, metadata, + progressOptions, + options.state, ); + dataSource.canonicalUrl = canonicalUrl; + return dataSource; + } default: throw new Error(`Invalid type: ${JSON.stringify(t)}`); } @@ -1536,26 +1540,13 @@ class GraphConnection extends SegmentationGraphSourceConnection { } } -async function parseGrapheneError(e: HttpError) { - if (e.response) { - let msg: string; - if (e.response.headers.get("content-type") === "application/json") { - msg = (await e.response.json()).message; - } else { - msg = await e.response.text(); - } - return msg; - } - return undefined; -} - -async function withErrorMessageHTTP( - promise: Promise, +async function withErrorMessageHTTP( + promise: Promise, options: { initialMessage?: string; errorPrefix: string; }, -): Promise { +): Promise { let status: StatusMessage | undefined = undefined; let dispose = () => {}; if (options.initialMessage) { @@ -1587,10 +1578,17 @@ async function withErrorMessageHTTP( export const GRAPH_SERVER_NOT_SPECIFIED = Symbol("Graph Server Not Specified."); class GrapheneGraphServerInterface { - constructor( - private url: string, - private credentialsProvider: SpecialProtocolCredentialsProvider, - ) {} + private fetchOkImpl: FetchOk; + private url: string; + constructor(sharedKvStoreContext: SharedKvStoreContext, url: string) { + const { store, path } = sharedKvStoreContext.kvStoreContext.getKvStore(url); + if (store instanceof HttpKvStore) { + this.fetchOkImpl = store.fetchOkImpl; + this.url = store.baseUrl + path; + } else { + throw new Error(`Non-HTTP protocol not supported: ${url}`); + } + } async getRoot(segment: Uint64, timestamp = "") { const timestampEpoch = new Date(timestamp).valueOf() / 1000; @@ -1599,13 +1597,13 @@ class GrapheneGraphServerInterface { Number.isNaN(timestampEpoch) ? "" : `×tamp=${timestampEpoch}` }`; - const promise = fetchSpecialOk(this.credentialsProvider, url, {}); - - const response = await withErrorMessageHTTP(promise, { - initialMessage: `Retrieving root for segment ${segment}`, - errorPrefix: "Could not fetch root: ", - }); - const jsonResp = await response.json(); + const jsonResp = await withErrorMessageHTTP( + this.fetchOkImpl(url).then((response) => response.json()), + { + initialMessage: `Retrieving root for segment ${segment}`, + errorPrefix: "Could not fetch root: ", + }, + ); return Uint64.parseString(jsonResp.root_id); } @@ -1619,23 +1617,19 @@ class GrapheneGraphServerInterface { return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); } - const promise = fetchSpecialOk( - this.credentialsProvider, - `${url}/merge?int64_as_str=1`, - { - method: "POST", - body: JSON.stringify([ - [ - String(first.segmentId), - ...first.position.map((val, i) => val * annotationToNanometers[i]), - ], - [ - String(second.segmentId), - ...second.position.map((val, i) => val * annotationToNanometers[i]), - ], - ]), - }, - ); + const promise = this.fetchOkImpl(`${url}/merge?int64_as_str=1`, { + method: "POST", + body: JSON.stringify([ + [ + String(first.segmentId), + ...first.position.map((val, i) => val * annotationToNanometers[i]), + ], + [ + String(second.segmentId), + ...second.position.map((val, i) => val * annotationToNanometers[i]), + ], + ]), + }); try { const response = await promise; @@ -1660,23 +1654,19 @@ class GrapheneGraphServerInterface { return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); } - const promise = fetchSpecialOk( - this.credentialsProvider, - `${url}/split?int64_as_str=1`, - { - method: "POST", - body: JSON.stringify({ - sources: first.map((x) => [ - String(x.segmentId), - ...x.position.map((val, i) => val * annotationToNanometers[i]), - ]), - sinks: second.map((x) => [ - String(x.segmentId), - ...x.position.map((val, i) => val * annotationToNanometers[i]), - ]), - }), - }, - ); + const promise = this.fetchOkImpl(`${url}/split?int64_as_str=1`, { + method: "POST", + body: JSON.stringify({ + sources: first.map((x) => [ + String(x.segmentId), + ...x.position.map((val, i) => val * annotationToNanometers[i]), + ]), + sinks: second.map((x) => [ + String(x.segmentId), + ...x.position.map((val, i) => val * annotationToNanometers[i]), + ]), + }), + }); const response = await withErrorMessageHTTP(promise, { initialMessage: `Splitting ${first.length} sources from ${second.length} sinks`, @@ -1693,17 +1683,19 @@ class GrapheneGraphServerInterface { async filterLatestRoots(segments: Uint64[]): Promise { const url = `${this.url}/is_latest_roots`; - const promise = fetchSpecialOk(this.credentialsProvider, url, { + const promise = this.fetchOkImpl(url, { method: "POST", body: JSON.stringify({ node_ids: segments.map((x) => x.toJSON()), }), }); - const response = await withErrorMessageHTTP(promise, { - errorPrefix: "Could not check latest: ", - }); - const jsonResp = await response.json(); + const jsonResp = await withErrorMessageHTTP( + promise.then((response) => response.json()), + { + errorPrefix: "Could not check latest: ", + }, + ); const res: Uint64[] = []; for (const [i, isLatest] of jsonResp.is_latest.entries()) { @@ -1721,14 +1713,13 @@ class GrapheneGraphSource extends SegmentationGraphSource { constructor( public info: GrapheneMultiscaleVolumeInfo, - credentialsProvider: SpecialProtocolCredentialsProvider, private chunkSource: GrapheneMultiscaleVolumeChunkSource, public state: GrapheneState, ) { super(); this.graphServer = new GrapheneGraphServerInterface( + chunkSource.sharedKvStoreContext, info.app!.segmentationUrl, - credentialsProvider, ); } @@ -1827,9 +1818,7 @@ class ChunkedGraphChunkSource } class GrapheneChunkedGraphChunkSource extends WithParameters( - WithCredentialsProvider()( - ChunkedGraphChunkSource, - ), + WithSharedKvStoreContext(ChunkedGraphChunkSource), ChunkedGraphSourceParameters, ) {} diff --git a/src/datasource/graphene/register_default.ts b/src/datasource/graphene/register_default.ts index e256a146fb..a0532a80b6 100644 --- a/src/datasource/graphene/register_default.ts +++ b/src/datasource/graphene/register_default.ts @@ -16,5 +16,8 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { GrapheneDataSource } from "#src/datasource/graphene/frontend.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -registerProvider("graphene", () => new GrapheneDataSource()); +registerProvider( + new KvStoreBasedDataSourceLegacyUrlAdapter(new GrapheneDataSource()), +); diff --git a/src/datasource/index.ts b/src/datasource/index.ts index 398f887f08..746dc22b36 100644 --- a/src/datasource/index.ts +++ b/src/datasource/index.ts @@ -22,12 +22,21 @@ import type { CoordinateSpaceTransform, CoordinateTransformSpecification, } from "#src/coordinate_transform.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import type { LocalDataSource } from "#src/datasource/local.js"; import { - emptyValidCoordinateSpace, - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; + AutoDetectRegistry, + autoDetectFormat, +} from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { + extractQueryAndFragment, + finalPipelineUrlComponent, + parsePipelineUrlComponent, + splitPipelineUrl, +} from "#src/kvstore/url.js"; import type { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import type { SegmentPropertyMap } from "#src/segmentation_display_state/property_map.js"; import type { SegmentationGraphSource } from "#src/segmentation_graph/source.js"; @@ -43,19 +52,12 @@ import { applyCompletionOffset, getPrefixMatchesWithDescriptions, } from "#src/util/completion.js"; -import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; -import { createIdentity } from "#src/util/matrix.js"; +import { type ProgressOptions } from "#src/util/progress_listener.js"; import type { Trackable } from "#src/util/trackable.js"; export type CompletionResult = BasicCompletionResult; -export class RedirectError extends Error { - constructor(public redirectTarget: string) { - super(`Redirected to: ${redirectTarget}`); - } -} - /** * Returns the length of the prefix of path that corresponds to the "group", according to the * specified separator. @@ -93,9 +95,7 @@ export function suggestLayerNameBasedOnSeparator( return path.substring(groupIndex); } -export interface GetDataSourceOptionsBase { - chunkManager: ChunkManager; - abortSignal?: AbortSignal; +export interface GetDataSourceOptionsBase extends Partial { url: string; transform: CoordinateTransformSpecification | undefined; globalCoordinateSpace: WatchableValueInterface; @@ -103,11 +103,10 @@ export interface GetDataSourceOptionsBase { } export interface GetDataSourceOptions extends GetDataSourceOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - abortSignal: AbortSignal; - providerProtocol: string; - credentialsManager: CredentialsManager; + signal: AbortSignal; + providerScheme: string; } export interface ConvertLegacyUrlOptionsBase { @@ -116,24 +115,9 @@ export interface ConvertLegacyUrlOptionsBase { } export interface ConvertLegacyUrlOptions extends ConvertLegacyUrlOptionsBase { - registry: DataSourceProviderRegistry; - providerUrl: string; - providerProtocol: string; -} - -export interface NormalizeUrlOptionsBase { - url: string; -} - -export interface NormalizeUrlOptions extends NormalizeUrlOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - providerProtocol: string; -} - -export enum LocalDataSource { - annotations = 0, - equivalences = 1, + providerScheme: string; } export interface DataSubsource { @@ -147,17 +131,14 @@ export interface DataSubsource { segmentationGraph?: SegmentationGraphSource; } -export interface CompleteUrlOptionsBase { +export interface CompleteUrlOptionsBase extends Partial { url: string; - abortSignal?: AbortSignal; - chunkManager: ChunkManager; } export interface CompleteUrlOptions extends CompleteUrlOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - abortSignal: AbortSignal; - credentialsManager: CredentialsManager; + signal: AbortSignal; } export interface DataSubsourceEntry { @@ -196,20 +177,23 @@ export interface DataSource { modelTransform: CoordinateSpaceTransform; canChangeModelSpaceRank?: boolean; state?: Trackable; + canonicalUrl?: string; } -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging -export interface DataSourceProvider { - /** - * Returns a suggested layer name for the given volume source. - */ - suggestLayerName?(path: string): string; +export interface DataSourceRedirect { + // Canonical URL of the source. + canonicalUrl?: string; - /** - * Returns the length of the prefix of path that is its 'group'. This is used for suggesting a - * default URL for adding a new layer. - */ - findSourceGroup?(path: string): number; + // Target URL. + targetUrl: string; +} + +export type DataSourceLookupResult = DataSource | DataSourceRedirect; + +export interface DataSourceWithRedirectInfo extends DataSource { + // Canonical URL prior to any redirects. + originalCanonicalUrl?: string; + redirectLog: Set; } export interface DataSubsourceSpecification { @@ -222,6 +206,9 @@ export interface DataSourceSpecification { enableDefaultSubsources: boolean; subsources: Map; state?: any; + + // Indicates that the spec was set manually in the UI. + setManually?: boolean; } export function makeEmptyDataSourceSpecification(): DataSourceSpecification { @@ -233,220 +220,233 @@ export function makeEmptyDataSourceSpecification(): DataSourceSpecification { }; } -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging -export abstract class DataSourceProvider extends RefCounted { - abstract description?: string; +export interface DataSourceProvider { + scheme: string; + description?: string; + // Exclude from completion list. + hidden?: boolean; - abstract get(options: GetDataSourceOptions): Promise; + get(options: GetDataSourceOptions): Promise; - normalizeUrl(options: NormalizeUrlOptions): string { - return options.url; - } + convertLegacyUrl?: (options: ConvertLegacyUrlOptions) => string; - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - return options.url; - } + completeUrl?: (options: CompleteUrlOptions) => Promise; +} - async completeUrl(options: CompleteUrlOptions): Promise { - options; - throw null; - } +export interface KvStoreBasedDataSourceProvider { + scheme: string; + description?: string; + singleFile?: boolean; + expectsDirectory?: boolean; + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise; + completeUrl?: ( + options: GetKvStoreBasedDataSourceOptions, + ) => Promise; } -export const localAnnotationsUrl = "local://annotations"; -export const localEquivalencesUrl = "local://equivalences"; +export interface GetKvStoreBasedDataSourceOptions + extends Partial { + registry: DataSourceRegistry; + kvStoreUrl: string; + url: UrlWithParsedScheme; + state?: any; +} -class LocalDataSourceProvider extends DataSourceProvider { - get description() { - return "Local in-memory"; - } +const schemePattern = /^(?:([a-zA-Z][a-zA-Z0-9-+_]*):\/\/)?(.*)$/; - async get(options: GetDataSourceOptions): Promise { - switch (options.url) { - case localAnnotationsUrl: { - const { transform } = options; - let modelTransform: CoordinateSpaceTransform; - if (transform === undefined) { - const baseSpace = options.globalCoordinateSpace.value; - const { rank, names, scales, units } = baseSpace; - const inputSpace = makeCoordinateSpace({ - rank, - scales, - units, - names: names.map((_, i) => `${i}`), - }); - const outputSpace = makeCoordinateSpace({ - rank, - scales, - units, - names, - }); - modelTransform = { - rank, - sourceRank: rank, - inputSpace, - outputSpace, - transform: createIdentity(Float64Array, rank + 1), - }; - } else { - modelTransform = makeIdentityTransform(emptyValidCoordinateSpace); - } - return { - modelTransform, - canChangeModelSpaceRank: true, - subsources: [ - { - id: "default", - default: true, - subsource: { - local: LocalDataSource.annotations, - }, - }, - ], - }; - } - case localEquivalencesUrl: { - return { - modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), - canChangeModelSpaceRank: false, - subsources: [ - { - id: "default", - default: true, - subsource: { - local: LocalDataSource.equivalences, - }, - }, - ], - }; - } - } - throw new Error("Invalid local data source URL"); +export class DataSourceRegistry extends RefCounted { + get credentialsManager(): SharedCredentialsManager { + return this.sharedKvStoreContext.credentialsManager; } - async completeUrl(options: CompleteUrlOptions) { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - options.providerUrl, - [ - { - value: "annotations", - description: "Annotations stored in the JSON state", - }, - { - value: "equivalences", - description: - "Segmentation equivalence graph stored in the JSON state", - }, - ], - (x) => x.value, - (x) => x.description, - ), - }; + get chunkManager(): ChunkManager { + return this.sharedKvStoreContext.chunkManager; } -} - -const protocolPattern = /^(?:([a-zA-Z][a-zA-Z0-9-+_]*):\/\/)?(.*)$/; -export class DataSourceProviderRegistry extends RefCounted { - constructor(public credentialsManager: CredentialsManager) { + constructor(public sharedKvStoreContext: SharedKvStoreContext) { super(); } - dataSources = new Map>([ - ["local", new LocalDataSourceProvider()], - ]); + dataSources = new Map(); + kvStoreBasedDataSources = new Map(); + autoDetectRegistry = new AutoDetectRegistry(); - register(name: string, dataSource: Owned) { - this.dataSources.set(name, this.registerDisposer(dataSource)); + register(provider: DataSourceProvider) { + this.dataSources.set(provider.scheme, provider); + } + registerKvStoreBasedProvider(provider: KvStoreBasedDataSourceProvider) { + this.kvStoreBasedDataSources.set(provider.scheme, provider); } getProvider(url: string): [DataSourceProvider, string, string] { - const m = url.match(protocolPattern); + const m = url.match(schemePattern); if (m === null || m[1] === undefined) { throw new Error( - `Data source URL must have the form "://".`, + `Data source URL must have the form "://".`, ); } - const [, providerProtocol, providerUrl] = m; - const factory = this.dataSources.get(providerProtocol); + const [, providerScheme, providerUrl] = m; + const factory = this.dataSources.get(providerScheme); if (factory === undefined) { throw new Error( - `Unsupported data source: ${JSON.stringify(providerProtocol)}.`, + `Unsupported data source: ${JSON.stringify(providerScheme)}.`, ); } - return [factory, providerUrl, providerProtocol]; + return [factory, providerUrl, providerScheme]; } - async get(options: GetDataSourceOptionsBase): Promise { - const redirectLog = new Set(); - const { abortSignal } = options; - let url: string = options.url; + private async autoDetectFormat(options: GetDataSourceOptionsBase) { + const { matches, url } = await autoDetectFormat({ + url: options.url, + kvStoreContext: this.sharedKvStoreContext.kvStoreContext, + signal: options.signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + autoDetectFile: () => this.autoDetectRegistry.fileSpec, + }); + if (matches.length !== 1) { + let message: string; + if (matches.length === 0) { + message = "no format detected"; + } else { + message = `multiple formats detected: ${JSON.stringify(matches)}`; + } + throw new Error( + `Failed to auto-detect data source for ${JSON.stringify(options.url)}: ${message}`, + ); + } + return `${url}|${matches[0].suffix}`; + } + + private async resolveKvStoreBasedDataSource( + options: GetDataSourceOptionsBase, + ): Promise { while (true) { - const [provider, providerUrl, providerProtocol] = this.getProvider( - options.url, + const finalPart = parsePipelineUrlComponent( + finalPipelineUrlComponent(options.url), ); - redirectLog.add(options.url); - try { - return provider.get({ + const dataSourceProvider = this.kvStoreBasedDataSources.get( + finalPart.scheme, + ); + if (dataSourceProvider === undefined) { + // Attempt to auto-detect format. + const newUrl = await this.autoDetectFormat(options); + options = { ...options, url: newUrl }; + continue; + } + return await dataSourceProvider.get({ + registry: this, + url: finalPart, + kvStoreUrl: options.url.substring( + 0, + options.url.length - finalPart.url.length - 1, + ), + signal: options.signal, + progressListener: options.progressListener, + state: options.state, + }); + } + } + + private async resolvePipeline( + options: GetDataSourceOptionsBase, + ): Promise { + const pipelineParts = splitPipelineUrl(options.url); + + const basePart = pipelineParts[0]; + const baseScheme = basePart.scheme; + + // Check kvstore providers + { + const provider = + this.sharedKvStoreContext.kvStoreContext.baseKvStoreProviders.get( + baseScheme, + ); + if (provider !== undefined) { + return await this.resolveKvStoreBasedDataSource(options); + } + } + + if (pipelineParts.length !== 1) { + throw new Error(`${baseScheme}: scheme does not support | URL pipelines`); + } + + const suffix = basePart.suffix ?? ""; + if (!suffix.startsWith("//")) { + throw new Error(`${baseScheme}: URLs must start with "${baseScheme}://"`); + } + + const providerUrl = suffix.substring(2); + + // Check non-kvstore-based providers + { + const provider = this.dataSources.get(baseScheme); + if (provider !== undefined) { + return await provider.get({ ...options, - url, - providerProtocol, + url: pipelineParts[0].url, + providerScheme: baseScheme, providerUrl, registry: this, - abortSignal: abortSignal ?? new AbortController().signal, - credentialsManager: this.credentialsManager, + signal: options.signal ?? new AbortController().signal, }); - } catch (e) { - if (e instanceof RedirectError) { - const redirect = e.redirectTarget; - if (redirectLog.has(redirect)) { - throw Error( - `Layer source redirection contains loop: ${JSON.stringify( - Array.from(redirectLog), - )}`, - ); - } - if (redirectLog.size >= 10) { - throw Error( - `Too many layer source redirections: ${JSON.stringify( - Array.from(redirectLog), - )}`, - ); - } - url = redirect; - continue; - } - throw e; } } + + throw new Error(`Unsupported scheme: ${baseScheme}:`); } - convertLegacyUrl(options: ConvertLegacyUrlOptionsBase): string { - try { - const [provider, providerUrl, providerProtocol] = this.getProvider( - options.url, - ); - return provider.convertLegacyUrl({ - ...options, - providerUrl, - providerProtocol, - registry: this, - }); - } catch { - return options.url; + async get( + options: GetDataSourceOptionsBase, + ): Promise { + const redirectLog = new Set(); + let url: string = options.url; + // Trim any trailing "|" characters. + url = url.replace(/\|+$/, ""); + let originalCanonicalUrl: string | undefined; + while (true) { + redirectLog.add(url); + const dataSource = await this.resolvePipeline({ ...options, url }); + if (originalCanonicalUrl === undefined) { + originalCanonicalUrl = dataSource.canonicalUrl; + } + if ("targetUrl" in dataSource) { + const { targetUrl } = dataSource; + if (redirectLog.has(targetUrl)) { + throw Error( + `Layer source redirection contains loop: ${JSON.stringify([ + ...redirectLog, + targetUrl, + ])}`, + ); + } + if (redirectLog.size >= 10) { + throw Error( + `Too many layer source redirections: ${JSON.stringify([ + ...redirectLog, + targetUrl, + ])}`, + ); + } + url = targetUrl; + continue; + } + return { ...dataSource, redirectLog, originalCanonicalUrl }; } } - normalizeUrl(options: NormalizeUrlOptionsBase): string { + // Converts legacy precomputed mesh and skeleton datasource URLs. + convertLegacyUrl(options: ConvertLegacyUrlOptionsBase): string { try { - const [provider, providerUrl, providerProtocol] = this.getProvider( + const [provider, providerUrl, providerScheme] = this.getProvider( options.url, ); - return provider.normalizeUrl({ + if (provider.convertLegacyUrl === undefined) return options.url; + return provider.convertLegacyUrl({ ...options, providerUrl, - providerProtocol, + providerScheme: providerScheme, registry: this, }); } catch { @@ -457,52 +457,209 @@ export class DataSourceProviderRegistry extends RefCounted { async completeUrl( options: CompleteUrlOptionsBase, ): Promise { - // Check if url matches a protocol. Note that protocolPattern always matches. - const { url, abortSignal } = options; - const protocolMatch = url.match(protocolPattern)!; - const protocol = protocolMatch[1]; - if (protocol === undefined) { - return Promise.resolve({ - offset: 0, + // Check if url matches a scheme. Note that schemePattern always matches. + const { signal } = options; + + const { url } = options; + + const finalComponent = finalPipelineUrlComponent(url); + const parsedFinalComponent = parsePipelineUrlComponent(finalComponent); + const { scheme } = parsedFinalComponent; + + // Check if we need to complete a scheme. + if ( + finalComponent === url && + !(parsedFinalComponent.suffix ?? "").startsWith("//") + ) { + const providers: { + scheme: string; + description?: string; + }[] = []; + const add = ( + iterable: Iterable, + predicate?: (provider: Provider) => boolean, + ) => { + for (const provider of iterable) { + if (predicate?.(provider) === false) continue; + providers.push(provider); + } + }; + + if (finalComponent === url) { + add( + this.sharedKvStoreContext.kvStoreContext.baseKvStoreProviders.values(), + ); + add(this.dataSources.values(), (provider) => provider.hidden !== true); + } else { + add(this.kvStoreBasedDataSources.values()); + add( + this.sharedKvStoreContext.kvStoreContext.kvStoreAdapterProviders.values(), + ); + } + + const schemeSuffix = finalComponent === url ? "//" : ""; + return { + offset: url.length - finalComponent.length, completions: getPrefixMatchesWithDescriptions( - url, - this.dataSources, - ([name]) => `${name}://`, - ([, factory]) => factory.description, + scheme, + providers, + ({ scheme }) => `${scheme}:${schemeSuffix}`, + ({ description }) => description, ), - }); + }; } - const factory = this.dataSources.get(protocol); - if (factory !== undefined) { - const completions = await factory.completeUrl({ - registry: this, - url, - providerUrl: protocolMatch[2], - chunkManager: options.chunkManager, - abortSignal: abortSignal ?? new AbortController().signal, - credentialsManager: this.credentialsManager, + + if (parsedFinalComponent.suffix === undefined) { + const prevPipelineUrl = options.url.substring( + 0, + options.url.length - finalComponent.length - 1, + ); + const { matches } = await autoDetectFormat({ + url: prevPipelineUrl, + kvStoreContext: this.sharedKvStoreContext.kvStoreContext, + signal: options.signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + autoDetectFile: () => this.autoDetectRegistry.fileSpec, }); - return applyCompletionOffset(protocol.length + 3, completions); + if (matches.length === 0) { + throw new Error( + `Failed to auto-detect data source for ${JSON.stringify(prevPipelineUrl)}`, + ); + } + return { + offset: url.length - finalComponent.length, + completions: getPrefixMatchesWithDescriptions( + parsedFinalComponent.scheme, + matches, + ({ suffix }) => suffix, + ({ description }) => description, + ), + }; + } + + if (finalComponent === url) { + // Single component pipeline. + const provider = this.dataSources.get(scheme); + if (provider !== undefined) { + // Non-kvstore-based protocol. + if (provider.completeUrl === undefined) throw null; + const completions = await provider.completeUrl({ + registry: this, + url: options.url, + providerUrl: parsedFinalComponent.suffix!.substring(2), + signal: signal ?? new AbortController().signal, + progressListener: options.progressListener, + }); + return applyCompletionOffset(scheme.length + 3, completions); + } + } + + { + const provider = this.kvStoreBasedDataSources.get(scheme); + if (provider !== undefined) { + if (provider.completeUrl === undefined) throw null; + const completions = await provider.completeUrl({ + registry: this, + signal: signal ?? new AbortController().signal, + progressListener: options.progressListener, + kvStoreUrl: url.substring(0, url.length - finalComponent.length - 1), + url: parsedFinalComponent, + }); + return applyCompletionOffset( + url.length - + finalComponent.length + + parsedFinalComponent.scheme.length + + 1, + completions, + ); + } } - throw null; + + return await getKvStoreCompletions(this.sharedKvStoreContext, { + url, + signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + }); } - suggestLayerName(url: string) { - let [dataSource, path] = this.getProvider(url); - if (path.endsWith("/")) { - path = path.substring(0, path.length - 1); + suggestLayerName(url: string): string | undefined { + const parts = splitPipelineUrl(url); + for (let i = parts.length - 1; i >= 0; --i) { + let { suffix } = parts[i]; + if (!suffix) continue; + suffix = suffix.replace(/^\/+/, "").replace(/\/+$/, ""); + if (!suffix) continue; + return suggestLayerNameBasedOnSeparator(suffix); } - const suggestor = dataSource.suggestLayerName; - if (suggestor !== undefined) { - return suggestor(path); + return undefined; + } +} + +export class KvStoreBasedDataSourceLegacyUrlAdapter + implements DataSourceProvider +{ + constructor( + public base: KvStoreBasedDataSourceProvider, + public scheme = base.scheme, + ) {} + + get hidden() { + return true; + } + + get description() { + return this.base.description; + } + + private parseProviderUrl(url: string) { + if (url.includes("|")) { + throw new Error("Only a single pipeline component supported"); } - return suggestLayerNameBasedOnSeparator(path); + const { base, queryAndFragment } = extractQueryAndFragment(url); + return { + kvStoreUrl: base, + queryAndFragment, + url: parsePipelineUrlComponent(`${this.base.scheme}:${queryAndFragment}`), + }; + } + + get(options: GetDataSourceOptions): Promise { + const { kvStoreUrl, url } = this.parseProviderUrl(options.providerUrl); + return this.base.get({ + registry: options.registry, + url, + kvStoreUrl, + state: options.state, + signal: options.signal, + progressListener: options.progressListener, + }); } - findSourceGroup(url: string) { - const [dataSource, path, dataSourceName] = this.getProvider(url); - const helper = - dataSource.findSourceGroup || findSourceGroupBasedOnSeparator; - return helper(path) + dataSourceName.length + 3; + async completeUrl(options: CompleteUrlOptions): Promise { + const { kvStoreUrl, url, queryAndFragment } = this.parseProviderUrl( + options.providerUrl, + ); + if (queryAndFragment === "") { + return await getKvStoreCompletions( + options.registry.sharedKvStoreContext, + { + url: options.providerUrl, + signal: options.signal, + progressListener: options.progressListener, + singlePipelineComponent: true, + directoryOnly: this.base.expectsDirectory, + }, + ); + } + if (!this.base.completeUrl) throw null; + return this.base.completeUrl({ + registry: options.registry, + signal: options.signal, + progressListener: options.progressListener, + kvStoreUrl, + url, + }); } } diff --git a/src/datasource/kvstore_completions.ts b/src/datasource/kvstore_completions.ts new file mode 100644 index 0000000000..05a8f80ab2 --- /dev/null +++ b/src/datasource/kvstore_completions.ts @@ -0,0 +1,141 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { CompletionResult } from "#src/datasource/index.js"; +import type { AutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { listKvStore } from "#src/kvstore/index.js"; +import { + encodePathForUrl, + finalPipelineUrlComponent, +} from "#src/kvstore/url.js"; +import type { CompletionWithDescription } from "#src/util/completion.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; + +export async function getKvStoreCompletions( + sharedKvStoreContext: SharedKvStoreContext, + options: { + url: string; + signal?: AbortSignal; + progressListener?: ProgressListener; + directoryOnly?: boolean; + autoDetectDirectory?: () => AutoDetectDirectorySpec; + singlePipelineComponent?: boolean; + }, +): Promise { + const { url, autoDetectDirectory } = options; + const kvStore = sharedKvStoreContext.kvStoreContext.getKvStore(url); + if (kvStore.store.getUrl(kvStore.path) !== url) { + // URL is valid but lacks final "/" terminator, skip completion. + // + // This avoids attempting to access e.g. `gs://bucke` as the user is typing + // `gs://bucket/`. + throw null; + } + const results = await listKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + responseKeys: "url", + }); + + const finalComponent = finalPipelineUrlComponent(url); + + // Infallible pattern + const [, directoryPath, namePrefix] = finalComponent.match( + /^((?:[a-zA-Z][a-zA-Z0-9-+.]*:)(?:.*\/)?)([^/]*)$/, + )!; + const offset = url.length - namePrefix.length; + const matches: CompletionWithDescription[] = []; + const directoryOffset = + url.length - finalComponent.length + directoryPath.length; + for (const entry of results.directories) { + matches.push({ value: entry.substring(directoryOffset) + "/" }); + } + if (!options.directoryOnly) { + const matchSuffix = options.singlePipelineComponent === true ? "" : "|"; + for (const entry of results.entries) { + matches.push({ + value: entry.key.substring(directoryOffset) + matchSuffix, + }); + } + } + + let defaultCompletion: string | undefined; + + if (autoDetectDirectory !== undefined && namePrefix === "") { + const names = new Set(); + for (const entry of results.entries) { + names.add(entry.key.substring(directoryOffset)); + } + const pipelineMatches = await autoDetectDirectory().match({ + url, + fileNames: names, + signal: options.signal, + }); + for (const match of pipelineMatches) { + matches.push({ + value: `|${match.suffix}`, + description: match.description, + }); + } + if (pipelineMatches.length === 1) { + defaultCompletion = `|${pipelineMatches[0].suffix}`; + } + } + return { offset, completions: matches, defaultCompletion }; +} + +export async function getKvStorePathCompletions( + sharedKvStoreContext: SharedKvStoreContext, + options: { + baseUrl: string; + path: string; + signal?: AbortSignal; + progressListener?: ProgressListener; + directoryOnly?: boolean; + }, +): Promise { + const { baseUrl, path } = options; + const { store, path: basePath } = + sharedKvStoreContext.kvStoreContext.getKvStore(baseUrl); + if (!store.list) { + throw new Error("Listing not supported"); + } + + const fullPath = basePath + path; + + const fullOffset = Math.max(basePath.length, fullPath.lastIndexOf("/") + 1); + + const results = await store.list(fullPath, { + signal: options.signal, + progressListener: options.progressListener, + }); + + const matches: CompletionWithDescription[] = []; + for (const entry of results.directories) { + matches.push({ + value: encodePathForUrl(entry.substring(fullOffset) + "/"), + }); + } + if (!options.directoryOnly) { + for (const entry of results.entries) { + matches.push({ + value: encodePathForUrl(entry.key.substring(fullOffset)), + }); + } + } + return { offset: fullOffset - basePath.length, completions: matches }; +} diff --git a/src/datasource/local.ts b/src/datasource/local.ts new file mode 100644 index 0000000000..4df6dc0443 --- /dev/null +++ b/src/datasource/local.ts @@ -0,0 +1,132 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + emptyValidCoordinateSpace, + makeCoordinateSpace, + makeIdentityTransform, + type CoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import type { + CompleteUrlOptions, + DataSource, + GetDataSourceOptions, + DataSourceProvider, +} from "#src/datasource/index.js"; +import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; +import { createIdentity } from "#src/util/matrix.js"; + +export const localAnnotationsUrl = "local://annotations"; +export const localEquivalencesUrl = "local://equivalences"; + +export enum LocalDataSource { + annotations = 0, + equivalences = 1, +} + +export class LocalDataSourceProvider implements DataSourceProvider { + get scheme() { + return "local"; + } + get description() { + return "Local in-memory"; + } + + async get(options: GetDataSourceOptions): Promise { + switch (options.url) { + case localAnnotationsUrl: { + const { transform } = options; + let modelTransform: CoordinateSpaceTransform; + if (transform === undefined) { + const baseSpace = options.globalCoordinateSpace.value; + const { rank, names, scales, units } = baseSpace; + const inputSpace = makeCoordinateSpace({ + rank, + scales, + units, + names: names.map((_, i) => `${i}`), + }); + const outputSpace = makeCoordinateSpace({ + rank, + scales, + units, + names, + }); + modelTransform = { + rank, + sourceRank: rank, + inputSpace, + outputSpace, + transform: createIdentity(Float64Array, rank + 1), + }; + } else { + modelTransform = makeIdentityTransform(emptyValidCoordinateSpace); + } + return { + modelTransform, + canChangeModelSpaceRank: true, + subsources: [ + { + id: "default", + default: true, + subsource: { + local: LocalDataSource.annotations, + }, + }, + ], + }; + } + case localEquivalencesUrl: { + return { + modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), + canChangeModelSpaceRank: false, + subsources: [ + { + id: "default", + default: true, + subsource: { + local: LocalDataSource.equivalences, + }, + }, + ], + }; + } + } + throw new Error("Invalid local data source URL"); + } + + async completeUrl(options: CompleteUrlOptions) { + return { + offset: 0, + completions: getPrefixMatchesWithDescriptions( + options.providerUrl, + [ + { + value: "annotations", + description: "Annotations stored in the JSON state", + }, + { + value: "equivalences", + description: + "Segmentation equivalence graph stored in the JSON state", + }, + ], + (x) => x.value, + (x) => x.description, + ), + }; + } +} diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index 0a20bd745d..6e1a7fcb9d 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -18,24 +18,21 @@ import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/n5/base.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { Endianness } from "#src/util/endian.js"; import { decodeGzip } from "#src/util/gzip.js"; -import { isNotFoundError } from "#src/util/http_request.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; async function decodeChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, encoding: VolumeChunkEncoding, ) { @@ -66,7 +63,7 @@ async function decodeChunk( case VolumeChunkEncoding.BLOSC: buffer = await requestAsyncComputation( decodeBlosc, - abortSignal, + signal, [buffer.buffer], buffer, ); @@ -74,7 +71,7 @@ async function decodeChunk( case VolumeChunkEncoding.ZSTD: buffer = await requestAsyncComputation( decodeZstd, - abortSignal, + signal, [buffer.buffer], buffer, ); @@ -82,7 +79,7 @@ async function decodeChunk( } await decodeRawChunk( chunk, - abortSignal, + signal, buffer.buffer, Endianness.BIG, buffer.byteOffset, @@ -92,31 +89,32 @@ async function decodeChunk( @registerSharedObject() export class PrecomputedVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { - const { parameters } = this; + private chunkKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + async download(chunk: VolumeChunk, signal: AbortSignal) { + const { parameters, chunkKvStore } = this; const { chunkGridPosition } = chunk; - let url = parameters.url; + let path = chunkKvStore.path; const rank = this.spec.rank; for (let i = 0; i < rank; ++i) { - url += `/${chunkGridPosition[i]}`; - } - try { - const response = await fetchSpecialOk(this.credentialsProvider, url, { - signal: abortSignal, - }); - await decodeChunk( - chunk, - abortSignal, - await response.arrayBuffer(), - parameters.encoding, - ); - } catch (e) { - if (!isNotFoundError(e)) throw e; + if (i !== 0) { + path += "/"; + } + path += `${chunkGridPosition[i]}`; } + const response = await chunkKvStore.store.read(path, { + signal, + }); + if (response === undefined) return; + await decodeChunk( + chunk, + signal, + await response.response.arrayBuffer(), + parameters.encoding, + ); } } diff --git a/src/datasource/n5/frontend.ts b/src/datasource/n5/frontend.ts index e76695b2ad..3c9f5856c4 100644 --- a/src/datasource/n5/frontend.ts +++ b/src/datasource/n5/frontend.ts @@ -21,10 +21,11 @@ * * https://github.com/saalfeldlab/n5-viewer * https://github.com/bigdataviewer/bigdataviewer-core/blob/master/BDV%20N5%20format.md + * + * https://github.com/janelia-cellmap/schemas/blob/master/multiscale.md */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { CoordinateArray, @@ -34,17 +35,28 @@ import { makeCoordinateSpace, makeIdentityTransform, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { getKvStorePathCompletions } from "#src/datasource/kvstore_completions.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/n5/base.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { CompletionResult, KvStoreContext } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + ensureNoQueryOrFragmentParameters, + ensurePathIsDirectory, + joinPath, + kvstoreEnsureDirectoryPipelineUrl, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -57,9 +69,6 @@ import { VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; -import type { Borrowed } from "#src/util/disposable.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError, parseUrl } from "#src/util/http_request.js"; import { expectArray, parseArray, @@ -75,19 +84,12 @@ import { verifyStringArray, } from "#src/util/json.js"; import { createHomogeneousScaleMatrix } from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { scaleByExp10, unitFromJson } from "#src/util/si_units.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; class N5VolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} @@ -103,12 +105,11 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } constructor( - chunkManager: Borrowed, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public multiscaleMetadata: MultiscaleMetadata, public scales: (ScaleMetadata | undefined)[], ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); let dataType: DataType | undefined; let baseScaleIndex: number | undefined; scales.forEach((scale, i) => { @@ -128,7 +129,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou if (dataType === undefined) { throw new Error("At least one scale must be specified."); } - const baseDownsamplingInfo = multiscaleMetadata.scales[baseScaleIndex!]!; + const baseDownsamplingInfo = scales[baseScaleIndex!]!; const baseScale = scales[baseScaleIndex!]!; this.dataType = dataType; this.volumeType = VolumeType.IMAGE; @@ -143,7 +144,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou { transform: createHomogeneousScaleMatrix( Float64Array, - baseDownsamplingInfo.downsamplingFactor, + baseDownsamplingInfo.downsamplingFactors, /*square=*/ false, ), box: { @@ -158,14 +159,12 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou getSources(volumeSourceOptions: VolumeSourceOptions) { const { scales, rank } = this; - const scalesDownsamplingInfo = this.multiscaleMetadata.scales; return transposeNestedArrays( (scales.filter((scale) => scale !== undefined) as ScaleMetadata[]).map( - (scale, i) => { - const scaleDownsamplingInfo = scalesDownsamplingInfo[i]; + (scale) => { const transform = createHomogeneousScaleMatrix( Float32Array, - scaleDownsamplingInfo.downsamplingFactor, + scale.downsamplingFactors, ); return makeDefaultVolumeChunkSpecifications({ rank, @@ -180,10 +179,10 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou chunkSource: this.chunkManager.getChunkSource( N5VolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: scaleDownsamplingInfo.url, + url: scale.url, encoding: scale.encoding, }, }, @@ -201,146 +200,209 @@ interface MultiscaleMetadata { url: string; attributes: any; modelSpace: CoordinateSpace; - scales: { readonly url: string; readonly downsamplingFactor: Float64Array }[]; + scales: ( + | { + readonly url: string; + readonly downsamplingFactors?: Float64Array; + } + | undefined + )[]; } -class ScaleMetadata { +interface ScaleMetadata { + url: string; dataType: DataType; encoding: VolumeChunkEncoding; - size: Float32Array; - chunkSize: Uint32Array; + size: Float32Array; + chunkSize: Uint32Array; + downsamplingFactors: Float64Array; +} - constructor(obj: any) { - verifyObject(obj); - this.dataType = verifyObjectProperty(obj, "dataType", (x) => - verifyEnumString(x, DataType), - ); - this.size = Float32Array.from( - verifyObjectProperty(obj, "dimensions", (x) => - parseArray(x, verifyPositiveInt), - ), +function parseScaleMetadata( + url: string, + obj: any, + scaleIndex: number, + downsamplingFactors?: Float64Array, +): ScaleMetadata { + verifyObject(obj); + const dataType = verifyObjectProperty(obj, "dataType", (x) => + verifyEnumString(x, DataType), + ); + const size = Float32Array.from( + verifyObjectProperty(obj, "dimensions", (x) => + parseArray(x, verifyPositiveInt), + ), + ); + const chunkSize = verifyObjectProperty(obj, "blockSize", (x) => + parseFixedLengthArray(new Uint32Array(size.length), x, verifyPositiveInt), + ); + + let encoding: VolumeChunkEncoding | undefined; + verifyOptionalObjectProperty(obj, "compression", (compression) => { + encoding = verifyObjectProperty(compression, "type", (x) => + verifyEnumString(x, VolumeChunkEncoding), ); - this.chunkSize = verifyObjectProperty(obj, "blockSize", (x) => - parseFixedLengthArray( - new Uint32Array(this.size.length), - x, - verifyPositiveInt, - ), + if ( + encoding === VolumeChunkEncoding.GZIP && + verifyOptionalObjectProperty( + compression, + "useZlib", + verifyBoolean, + false, + ) === true + ) { + encoding = VolumeChunkEncoding.ZLIB; + } + }); + if (encoding === undefined) { + encoding = verifyObjectProperty(obj, "compressionType", (x) => + verifyEnumString(x, VolumeChunkEncoding), ); + } - let encoding: VolumeChunkEncoding | undefined; - verifyOptionalObjectProperty(obj, "compression", (compression) => { - encoding = verifyObjectProperty(compression, "type", (x) => - verifyEnumString(x, VolumeChunkEncoding), - ); - if ( - encoding === VolumeChunkEncoding.GZIP && - verifyOptionalObjectProperty( - compression, - "useZlib", - verifyBoolean, - false, - ) === true - ) { - encoding = VolumeChunkEncoding.ZLIB; + if (downsamplingFactors === undefined) { + downsamplingFactors = verifyOptionalObjectProperty( + obj, + "downsamplingFactors", + (x) => + parseFixedLengthArray( + new Float64Array(size.length), + x, + verifyFinitePositiveFloat, + ), + ); + if (downsamplingFactors === undefined) { + if (scaleIndex === 0) { + downsamplingFactors = new Float64Array(size.length); + downsamplingFactors.fill(1); + } else { + throw new Error("Expected downsamplingFactors attribute"); } - }); - if (encoding === undefined) { - encoding = verifyObjectProperty(obj, "compressionType", (x) => - verifyEnumString(x, VolumeChunkEncoding), - ); } - this.encoding = encoding; } + + return { url, dataType, encoding, size, chunkSize, downsamplingFactors }; } function getAllScales( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, multiscaleMetadata: MultiscaleMetadata, + options: Partial, ): Promise<(ScaleMetadata | undefined)[]> { return Promise.all( - multiscaleMetadata.scales.map(async (scale) => { - const attributes = await getAttributes( - chunkManager, - credentialsProvider, + multiscaleMetadata.scales.map(async (scale, scaleIndex) => { + if (scale === undefined) return undefined; + const { attributes } = (await getAttributes( + sharedKvStoreContext, scale.url, true, - ); + options, + ))!; if (attributes === undefined) return undefined; - return new ScaleMetadata(attributes); + try { + return parseScaleMetadata( + scale.url, + attributes, + scaleIndex, + scale.downsamplingFactors, + ); + } catch (e) { + throw new Error(`Error parsing array metadata at ${scale.url}`, { + cause: e, + }); + } }), ); } -function getAttributesJsonUrls(url: string): string[] { - let { protocol, host, path } = parseUrl(url); - if (path.endsWith("/")) { - path = path.substring(0, path.length - 1); - } - const urls: string[] = []; +function getAttributesJsonUrls( + kvStoreContext: KvStoreContext, + url: string, +): { attributesJsonUrl: string; directoryUrl: string; relativePath: string }[] { + const kvStore = kvStoreContext.getKvStore(url); + const urls: { + attributesJsonUrl: string; + directoryUrl: string; + relativePath: string; + }[] = []; + let path = kvStore.path.substring(0, kvStore.path.length - 1); while (true) { - urls.push(`${protocol}://${host}${path}/attributes.json`); + const directoryPath = ensurePathIsDirectory(path); + urls.push({ + attributesJsonUrl: kvStore.store.getUrl( + joinPath(path, "attributes.json"), + ), + directoryUrl: kvStore.store.getUrl(directoryPath), + relativePath: kvStore.path.substring(directoryPath.length), + }); + if (path === "") break; const index = path.lastIndexOf("/"); - if (index === -1) break; path = path.substring(0, index); } return urls; } function getIndividualAttributesJson( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "n5:attributes.json", url, - credentialsProvider: getObjectId(credentialsProvider), }, - () => - fetchSpecialOk(credentialsProvider, url, {}) - .then((response) => response.json()) - .then((j) => { - try { - return verifyObject(j); - } catch (e) { - throw new Error( - `Error reading attributes from ${url}: ${e.message}`, - ); - } - }) - .catch((e) => { - if (isNotFoundError(e)) { - if (required) return undefined; - return {}; - } - throw e; - }), + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading n5 metadata from ${url}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(url, { + ...progressOptions, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + const json = await response.response.json(); + try { + return verifyObject(json); + } catch (e) { + throw new Error(`Error reading attributes from ${url}`, { cause: e }); + } + }, ); } async function getAttributes( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, required: boolean, -): Promise { - const attributesJsonUrls = getAttributesJsonUrls(url); + options: Partial, +): Promise< + { attributes: unknown; rootUrl: string; pathFromRoot: string } | undefined +> { + const attributesJsonUrls = getAttributesJsonUrls( + sharedKvStoreContext.kvStoreContext, + url, + ); const metadata = await Promise.all( attributesJsonUrls.map((u, i) => getIndividualAttributesJson( - chunkManager, - credentialsProvider, - u, + sharedKvStoreContext, + u.attributesJsonUrl, required && i === attributesJsonUrls.length - 1, + options, ), ), ); - if (metadata.indexOf(undefined) !== -1) return undefined; + const rootIndex = metadata.findLastIndex((x) => x !== undefined); + if (rootIndex === -1) return undefined; metadata.reverse(); - return Object.assign({}, ...metadata); + const rootInfo = attributesJsonUrls[rootIndex]; + return { + attributes: Object.assign({}, ...metadata.filter((x) => x !== undefined)), + rootUrl: rootInfo.directoryUrl, + pathFromRoot: rootInfo.relativePath, + }; } function verifyRank(existing: number, n: number) { @@ -386,10 +448,12 @@ function getDefaultAxes(rank: number) { return axes; } -function getMultiscaleMetadata( +async function getMultiscaleMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, attributes: any, -): MultiscaleMetadata { + progressOptions: ProgressOptions, +): Promise { verifyObject(attributes); let rank = -1; @@ -409,8 +473,8 @@ function getMultiscaleMetadata( return units; }); let defaultUnit = { unit: "m", exponent: -9 }; - let singleDownsamplingFactors: Float64Array | undefined; - let allDownsamplingFactors: Float64Array[] | undefined; + let singleDownsamplingFactors: Float64Array | undefined; + let allDownsamplingFactors: Float64Array[] | undefined; verifyOptionalObjectProperty(attributes, "downsamplingFactors", (dObj) => { const { single, all, rank: curRank } = parseDownsamplingFactors(dObj); rank = verifyRank(rank, curRank); @@ -499,17 +563,33 @@ function getMultiscaleMetadata( }); if (dimensions === undefined) { if (allDownsamplingFactors === undefined) { - throw new Error( - "Not valid single-resolution or multi-resolution dataset", + const scaleDirectories = await findScaleDirectories( + sharedKvStoreContext, + url, + progressOptions, ); + if (scaleDirectories.length === 0) { + throw new Error( + "Not valid single-resolution or multi-resolution dataset", + ); + } + return { + modelSpace, + url, + attributes, + scales: scaleDirectories.map((name) => ({ + url: `${url}${name}/`, + downsamplingFactors: undefined, + })), + }; } return { modelSpace, url, attributes, scales: allDownsamplingFactors.map((f, i) => ({ - url: `${url}/s${i}`, - downsamplingFactor: f, + url: `${url}s${i}/`, + downsamplingFactors: f, })), }; } @@ -521,45 +601,80 @@ function getMultiscaleMetadata( modelSpace, url, attributes, - scales: [{ url, downsamplingFactor: singleDownsamplingFactors }], + scales: [{ url, downsamplingFactors: singleDownsamplingFactors }], }; } -export class N5DataSource extends DataSourceProvider { +async function findScaleDirectories( + sharedKvStoreContext: SharedKvStoreContext, + url: string, + progressOptions: ProgressOptions, +): Promise { + const result = await sharedKvStoreContext.kvStoreContext.list(url, { + responseKeys: "suffix", + ...progressOptions, + }); + const scaleDirectories: string[] = []; + for (const directory of result.directories) { + if (directory.match(/^s(?:0|[1-9][0-9]*)$/)) { + const scale = Number(directory.substring(1)); + scaleDirectories[scale] = directory; + } + } + return scaleDirectories; +} + +export class N5DataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "n5"; + } + get expectsDirectory() { + return true; + } get description() { return "N5 data source"; } - get(options: GetDataSourceOptions): Promise { - let { providerUrl } = options; - if (providerUrl.endsWith("/")) { - providerUrl = providerUrl.substring(0, providerUrl.length - 1); - } - return options.chunkManager.memoize.getUncounted( - { type: "n5:MultiscaleVolumeChunkSource", providerUrl }, - async () => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); - const attributes = await getAttributes( - options.chunkManager, - credentialsProvider, + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureNoQueryOrFragmentParameters(options.url); + const url = kvstoreEnsureDirectoryPipelineUrl( + pipelineUrlJoin( + kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + options.url.suffix ?? "", + ), + ); + const { sharedKvStoreContext } = options.registry; + return options.registry.chunkManager.memoize.getAsync( + { type: "n5:MultiscaleVolumeChunkSource", url }, + options, + async (progressOptions) => { + const attributeResult = await getAttributes( + sharedKvStoreContext, url, false, + progressOptions, + ); + if (attributeResult === undefined) { + throw new Error("N5 metadata not found"); + } + const { attributes, rootUrl, pathFromRoot } = attributeResult; + const multiscaleMetadata = await getMultiscaleMetadata( + sharedKvStoreContext, + url, + attributes, + progressOptions, ); - const multiscaleMetadata = getMultiscaleMetadata(url, attributes); const scales = await getAllScales( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleMetadata, + progressOptions, ); const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleMetadata, scales, ); return { + canonicalUrl: `${rootUrl}|${options.url.scheme}:${pathFromRoot}`, modelTransform: makeIdentityTransform(volume.modelSpace), subsources: [ { @@ -584,11 +699,25 @@ export class N5DataSource extends DataSourceProvider { ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, - ); + async completeUrl( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + ensureNoQueryOrFragmentParameters(options.url); + return getKvStorePathCompletions(options.registry.sharedKvStoreContext, { + baseUrl: kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + path: options.url.suffix ?? "", + directoryOnly: true, + signal: options.signal, + progressListener: options.progressListener, + }); } } + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["attributes.json"]), { + suffix: "n5:", + description: "N5", + }), + ); +} diff --git a/src/datasource/n5/register_default.ts b/src/datasource/n5/register_default.ts index dddddbb211..7732860e74 100644 --- a/src/datasource/n5/register_default.ts +++ b/src/datasource/n5/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { N5DataSource } from "#src/datasource/n5/frontend.js"; +import { + registerKvStoreBasedDataProvider, + dataSourceAutoDetectRegistry, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + N5DataSource, + registerAutoDetect, +} from "#src/datasource/n5/frontend.js"; -registerProvider("n5", () => new N5DataSource()); +const provider = new N5DataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/nggraph/frontend.ts b/src/datasource/nggraph/frontend.ts index bd3e53c461..8578c9cf6d 100644 --- a/src/datasource/nggraph/frontend.ts +++ b/src/datasource/nggraph/frontend.ts @@ -16,7 +16,7 @@ import { debounce } from "lodash-es"; import type { ChunkManager } from "#src/chunk_manager/frontend.js"; -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import { CredentialsProvider, makeCredentialsGetter, @@ -27,8 +27,8 @@ import type { DataSource, DataSubsourceEntry, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import type { Credentials } from "#src/datasource/nggraph/credentials_provider.js"; import { NggraphCredentialsProvider } from "#src/datasource/nggraph/credentials_provider.js"; import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; @@ -47,6 +47,7 @@ import { StatusMessage } from "#src/status.js"; import type { Uint64Set } from "#src/uint64_set.js"; import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import type { RequestInitWithProgress } from "#src/util/http_request.js"; import { parseArray, verifyFiniteFloat, @@ -609,7 +610,7 @@ function fetchWithNggraphCredentials( path: string, init: RequestInit, ): Promise { - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, `${serverUrl}${path}`, init, @@ -701,7 +702,7 @@ function nggraphGraphFetch( serverUrl: string, entityName: string, path: string, - init: RequestInit, + init: RequestInitWithProgress, ): Promise { return fetchWithNggraphCredentials( getEntityCredentialsProvider(chunkManager, serverUrl, entityName), @@ -732,41 +733,46 @@ function parseListResponse(response: any) { ); } -export class NggraphDataSource extends DataSourceProvider { +export class NggraphDataSource implements DataSourceProvider { + get scheme() { + return "nggraph"; + } get description() { return "nggraph data source"; } get(options: GetDataSourceOptions): Promise { const { serverUrl, id } = parseNggraphUrl(options.providerUrl); - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "nggraph:get", serverUrl, id }, - async (): Promise => { + options, + async (progressOptions): Promise => { const entityCredentialsProvider = getEntityCredentialsProvider( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, ); - const { entityType } = (await entityCredentialsProvider.get()) - .credentials; + const { entityType } = ( + await entityCredentialsProvider.get(undefined, progressOptions) + ).credentials; if (entityType !== "graph") { throw new Error( `Unsupported entity type: ${JSON.stringify(entityType)}`, ); } const { datasource_url: baseSegmentation } = await nggraphGraphFetch( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, "/graph/config", - { method: "POST" }, + { method: "POST", ...progressOptions }, ); const baseSegmentationDataSource = await options.registry.get({ ...options, url: baseSegmentation, }); const segmentationGraph = new NggraphSegmentationGraphSource( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, ); @@ -789,13 +795,20 @@ export class NggraphDataSource extends DataSourceProvider { async completeUrl(options: CompleteUrlOptions): Promise { const { serverUrl, id } = parseNggraphUrl(options.providerUrl); - const list = await options.chunkManager.memoize.getUncounted( + const list = await options.registry.chunkManager.memoize.getAsync( { type: "nggraph:list", serverUrl }, - async () => { + options, + async (progressOptions) => { return parseListResponse( - await nggraphServerFetch(options.chunkManager, serverUrl, "/list", { - method: "POST", - }), + await nggraphServerFetch( + options.registry.chunkManager, + serverUrl, + "/list", + { + method: "POST", + ...progressOptions, + }, + ), ); }, ); diff --git a/src/datasource/nggraph/register_default.ts b/src/datasource/nggraph/register_default.ts index 82c0754698..99e3c0dede 100644 --- a/src/datasource/nggraph/register_default.ts +++ b/src/datasource/nggraph/register_default.ts @@ -17,4 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { NggraphDataSource } from "#src/datasource/nggraph/frontend.js"; -registerProvider("nggraph", () => new NggraphDataSource()); +registerProvider(new NggraphDataSource()); diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index 1235cd6981..34c62465e7 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -16,23 +16,20 @@ import type { NIFTI2 } from "nifti-reader-js"; import { isCompressed, NIFTI1, readHeader, readImage } from "nifti-reader-js"; -import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; -import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; -import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, VolumeSourceParameters, } from "#src/datasource/nifti/base.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { DataType } from "#src/sliceview/volume/base.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { Endianness } from "#src/util/endian.js"; import { kOneVec, @@ -43,10 +40,7 @@ import { } from "#src/util/geom.js"; import { decodeGzip } from "#src/util/gzip.js"; import * as matrix from "#src/util/matrix.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import type { RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerSharedObject } from "#src/worker_rpc.js"; @@ -56,11 +50,15 @@ export class NiftiFileData { } async function decodeNiftiFile( - buffer: ArrayBuffer, - _cancellationToken: AbortSignal, + readResponse: ReadResponse | undefined, + options: ProgressOptions, ) { + if (readResponse === undefined) { + throw new Error("Not found"); + } + let buffer = await readResponse.response.arrayBuffer(); if (isCompressed(buffer)) { - buffer = await decodeGzip(buffer, "gzip"); + buffer = await decodeGzip(buffer, "gzip", options.signal); } const data = new NiftiFileData(); data.uncompressedData = buffer; @@ -73,40 +71,24 @@ async function decodeNiftiFile( } function getNiftiFileData( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContextCounterpart: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - abortSignal: AbortSignal, + options: Partial, ) { - return GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - decodeNiftiFile, + return getCachedDecodedUrl( + sharedKvStoreContextCounterpart, url, - getPriority, - abortSignal, + decodeNiftiFile, + options, ); } -const NIFTI_HEADER_INFO_PRIORITY = 1000; - async function getNiftiHeaderInfo( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - abortSignal: AbortSignal, + options: Partial, ) { - const data = await getNiftiFileData( - chunkManager, - credentialsProvider, - url, - () => ({ - priorityTier: ChunkPriorityTier.VISIBLE, - priority: NIFTI_HEADER_INFO_PRIORITY, - }), - abortSignal, - ); + const data = await getNiftiFileData(sharedKvStoreContext, url, options); return data.header; } @@ -165,174 +147,161 @@ const DATA_TYPE_CONVERSIONS = new Map([ registerPromiseRPC( GET_NIFTI_VOLUME_INFO_RPC_ID, - async function (x, abortSignal): RPCPromise { - const chunkManager = this.getRef(x.chunkManager); - const credentialsProvider = this.getOptionalRef< - SharedCredentialsProviderCounterpart< - Exclude - > - >(x.credentialsProvider); - try { - const header = await getNiftiHeaderInfo( - chunkManager, - credentialsProvider, - x.url, - abortSignal, + async function (x, progressOptions): RPCPromise { + const sharedKvStoreContext = this.get( + x.sharedKvStoreContext, + ) as SharedKvStoreContextCounterpart; + const header = await getNiftiHeaderInfo( + sharedKvStoreContext, + x.url, + progressOptions, + ); + const dataTypeInfo = DATA_TYPE_CONVERSIONS.get(header.datatypeCode); + if (dataTypeInfo === undefined) { + throw new Error( + "Unsupported data type: " + + `${NiftiDataType[header.datatypeCode] || header.datatypeCode}.`, ); - const dataTypeInfo = DATA_TYPE_CONVERSIONS.get(header.datatypeCode); - if (dataTypeInfo === undefined) { - throw new Error( - "Unsupported data type: " + - `${NiftiDataType[header.datatypeCode] || header.datatypeCode}.`, - ); - } - let spatialInvScale = 1; - let spatialUnit = ""; - switch (header.xyzt_units & NIFTI1.SPATIAL_UNITS_MASK) { - case NIFTI1.UNITS_METER: - spatialInvScale = 1; - spatialUnit = "m"; - break; - case NIFTI1.UNITS_MM: - spatialInvScale = 1e3; - spatialUnit = "m"; - break; - case NIFTI1.UNITS_MICRON: - spatialInvScale = 1e6; - spatialUnit = "m"; - break; - } + } + let spatialInvScale = 1; + let spatialUnit = ""; + switch (header.xyzt_units & NIFTI1.SPATIAL_UNITS_MASK) { + case NIFTI1.UNITS_METER: + spatialInvScale = 1; + spatialUnit = "m"; + break; + case NIFTI1.UNITS_MM: + spatialInvScale = 1e3; + spatialUnit = "m"; + break; + case NIFTI1.UNITS_MICRON: + spatialInvScale = 1e6; + spatialUnit = "m"; + break; + } - let timeUnit = ""; - let timeInvScale = 1; - switch (header.xyzt_units & NIFTI1.TEMPORAL_UNITS_MASK) { - case NIFTI1.UNITS_SEC: - timeUnit = "s"; - timeInvScale = 1; - break; - case NIFTI1.UNITS_MSEC: - timeUnit = "s"; - timeInvScale = 1e3; - break; - case NIFTI1.UNITS_USEC: - timeUnit = "s"; - timeInvScale = 1e6; - break; - case NIFTI1.UNITS_HZ: - timeUnit = "Hz"; - timeInvScale = 1; - break; - case NIFTI1.UNITS_RADS: - timeUnit = "rad/s"; - timeInvScale = 1; - break; - } - let units: string[] = [ - spatialUnit, - spatialUnit, - spatialUnit, - timeUnit, - "", - "", - "", - ]; - let sourceScales = Float64Array.of( - header.pixDims[1] / spatialInvScale, - header.pixDims[2] / spatialInvScale, - header.pixDims[3] / spatialInvScale, - header.pixDims[4] / timeInvScale, - header.pixDims[5], - header.pixDims[6], - header.pixDims[7], - ); - let viewScales = Float64Array.of( - 1 / spatialInvScale, - 1 / spatialInvScale, - 1 / spatialInvScale, - 1 / timeInvScale, - 1, - 1, - 1, - ); - let sourceNames = ["i", "j", "k", "m", "c^", "c1^", "c2^"]; - let viewNames = ["x", "y", "z", "t", "c^", "c1^", "c2^"]; - const rank = header.dims[0]; - sourceNames = sourceNames.slice(0, rank); - viewNames = viewNames.slice(0, rank); - units = units.slice(0, rank); - sourceScales = sourceScales.slice(0, rank); - viewScales = viewScales.slice(0, rank); - const { quatern_b, quatern_c, quatern_d } = header; - const quatern_a = Math.sqrt( - 1.0 - - quatern_b * quatern_b - - quatern_c * quatern_c - - quatern_d * quatern_d, - ); - const qfac = header.pixDims[0] === -1 ? -1 : 1; - const qoffset = vec3.fromValues( - header.qoffset_x, - header.qoffset_y, - header.qoffset_z, - ); - // https://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields/nifti1fields_pages/qsform.html - const method3Transform = convertAffine(header.affine); - method3Transform; - const method2Transform = translationRotationScaleZReflectionToMat4( - mat4.create(), - qoffset, - quat.fromValues(quatern_b, quatern_c, quatern_d, quatern_a), - kOneVec, - qfac, - ); - const transform = matrix.createIdentity(Float64Array, rank + 1); - const copyRank = Math.min(3, rank); - for (let row = 0; row < copyRank; ++row) { - for (let col = 0; col < copyRank; ++col) { - transform[col * (rank + 1) + row] = method2Transform[col * 4 + row]; - } - transform[rank * (rank + 1) + row] = method2Transform[12 + row]; + let timeUnit = ""; + let timeInvScale = 1; + switch (header.xyzt_units & NIFTI1.TEMPORAL_UNITS_MASK) { + case NIFTI1.UNITS_SEC: + timeUnit = "s"; + timeInvScale = 1; + break; + case NIFTI1.UNITS_MSEC: + timeUnit = "s"; + timeInvScale = 1e3; + break; + case NIFTI1.UNITS_USEC: + timeUnit = "s"; + timeInvScale = 1e6; + break; + case NIFTI1.UNITS_HZ: + timeUnit = "Hz"; + timeInvScale = 1; + break; + case NIFTI1.UNITS_RADS: + timeUnit = "rad/s"; + timeInvScale = 1; + break; + } + let units: string[] = [ + spatialUnit, + spatialUnit, + spatialUnit, + timeUnit, + "", + "", + "", + ]; + let sourceScales = Float64Array.of( + header.pixDims[1] / spatialInvScale, + header.pixDims[2] / spatialInvScale, + header.pixDims[3] / spatialInvScale, + header.pixDims[4] / timeInvScale, + header.pixDims[5], + header.pixDims[6], + header.pixDims[7], + ); + let viewScales = Float64Array.of( + 1 / spatialInvScale, + 1 / spatialInvScale, + 1 / spatialInvScale, + 1 / timeInvScale, + 1, + 1, + 1, + ); + let sourceNames = ["i", "j", "k", "m", "c^", "c1^", "c2^"]; + let viewNames = ["x", "y", "z", "t", "c^", "c1^", "c2^"]; + const rank = header.dims[0]; + sourceNames = sourceNames.slice(0, rank); + viewNames = viewNames.slice(0, rank); + units = units.slice(0, rank); + sourceScales = sourceScales.slice(0, rank); + viewScales = viewScales.slice(0, rank); + const { quatern_b, quatern_c, quatern_d } = header; + const quatern_a = Math.sqrt( + 1.0 - + quatern_b * quatern_b - + quatern_c * quatern_c - + quatern_d * quatern_d, + ); + const qfac = header.pixDims[0] === -1 ? -1 : 1; + const qoffset = vec3.fromValues( + header.qoffset_x, + header.qoffset_y, + header.qoffset_z, + ); + // https://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields/nifti1fields_pages/qsform.html + const method3Transform = convertAffine(header.affine); + method3Transform; + const method2Transform = translationRotationScaleZReflectionToMat4( + mat4.create(), + qoffset, + quat.fromValues(quatern_b, quatern_c, quatern_d, quatern_a), + kOneVec, + qfac, + ); + const transform = matrix.createIdentity(Float64Array, rank + 1); + const copyRank = Math.min(3, rank); + for (let row = 0; row < copyRank; ++row) { + for (let col = 0; col < copyRank; ++col) { + transform[col * (rank + 1) + row] = method2Transform[col * 4 + row]; } - const info: NiftiVolumeInfo = { - rank, - sourceNames, - viewNames, - units, - sourceScales, - viewScales, - description: header.description, - transform, - dataType: dataTypeInfo.dataType, - volumeSize: Uint32Array.from(header.dims.slice(1, 1 + rank)), - }; - return { value: info }; - } finally { - chunkManager.dispose(); - credentialsProvider?.dispose(); + transform[rank * (rank + 1) + row] = method2Transform[12 + row]; } + const info: NiftiVolumeInfo = { + rank, + sourceNames, + viewNames, + units, + sourceScales, + viewScales, + description: header.description, + transform, + dataType: dataTypeInfo.dataType, + volumeSize: Uint32Array.from(header.dims.slice(1, 1 + rank)), + }; + return { value: info }; }, ); @registerSharedObject() export class NiftiVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeSourceParameters, ) { - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const data = await getNiftiFileData( - this.chunkManager, - this.credentialsProvider, + this.sharedKvStoreContext, this.parameters.url, - () => ({ priorityTier: chunk.priorityTier, priority: chunk.priority }), - abortSignal, + { signal }, ); const imageBuffer = readImage(data.header, data.uncompressedData); await decodeRawChunk( chunk, - abortSignal, + signal, imageBuffer, data.header.littleEndian ? Endianness.LITTLE : Endianness.BIG, ); diff --git a/src/datasource/nifti/frontend.ts b/src/datasource/nifti/frontend.ts index 4243fc20f5..35bdceeeb3 100644 --- a/src/datasource/nifti/frontend.ts +++ b/src/datasource/nifti/frontend.ts @@ -20,28 +20,29 @@ */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { - getCredentialsProviderCounterpart, - WithCredentialsProvider, -} from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { - CompleteUrlOptions, - DataSource, - GetDataSourceOptions, + type DataSource, + type GetKvStoreBasedDataSourceOptions, + type KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, VolumeSourceParameters, } from "#src/datasource/nifti/base.js"; +import type { + AutoDetectFileOptions, + AutoDetectFileSpec, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { makeVolumeChunkSpecificationWithDefaultCompression, @@ -51,27 +52,22 @@ import { MultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; +import { Endianness } from "#src/util/endian.js"; import * as matrix from "#src/util/matrix.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; class NiftiVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeSourceParameters, ) {} export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSource { constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public url: string, public info: NiftiVolumeInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); } get dataType() { return this.info.dataType; @@ -103,7 +99,7 @@ export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSourc chunkSource: this.chunkManager.getChunkSource( NiftiVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { url: this.url }, }, @@ -116,47 +112,37 @@ export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSourc } function getNiftiVolumeInfo( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, - abortSignal?: AbortSignal, + options: Partial, ) { - return chunkManager.rpc!.promiseInvoke( + return sharedKvStoreContext.chunkManager.rpc!.promiseInvoke( GET_NIFTI_VOLUME_INFO_RPC_ID, { - chunkManager: chunkManager.addCounterpartRef(), - credentialsProvider: - getCredentialsProviderCounterpart( - chunkManager, - credentialsProvider, - ), + sharedKvStoreContext: sharedKvStoreContext.rpcId, url: url, }, - abortSignal, + { signal: options.signal, progressListener: options.progressListener }, ); } function getDataSource( - chunkManager: ChunkManager, - credentialsManager: CredentialsManager, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "nifti/getVolume", url }, - async () => { - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); + options, + async (progressOptions) => { const info = await getNiftiVolumeInfo( - chunkManager, - credentialsProvider, - parsedUrl, + sharedKvStoreContext, + url, + progressOptions, ); const volume = new NiftiMultiscaleVolumeChunkSource( - chunkManager, - credentialsProvider, - parsedUrl, + sharedKvStoreContext, + url, info, ); const box = { @@ -177,6 +163,7 @@ function getDataSource( units: info.units, }); const dataSource: DataSource = { + canonicalUrl: `${url}|nifti:`, subsources: [ { id: "default", @@ -204,23 +191,70 @@ function getDataSource( ); } -export class NiftiDataSource extends DataSourceProvider { +export class NiftiDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "nifti"; + } get description() { - return "Single NIfTI file"; + return "NIfTI"; } - get(options: GetDataSourceOptions): Promise { + get singleFile() { + return true; + } + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); return getDataSource( - options.chunkManager, - options.credentialsManager, - options.providerUrl, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + options, ); } +} - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, +function getAutoDetectSpec( + headerSize: number, + magicStringOffset: number, + magicString: string, + version: string, +): AutoDetectFileSpec { + async function match(options: AutoDetectFileOptions) { + const { prefix } = options; + if (prefix.length < magicStringOffset + magicString.length) return []; + const dv = new DataView( + prefix.buffer, + prefix.byteOffset, + prefix.byteLength, ); + let endianness: Endianness; + if (dv.getInt32(0, /*littleEndian=*/ true) === headerSize) { + endianness = Endianness.LITTLE; + } else if (dv.getInt32(0, /*littleEndian=*/ false) === headerSize) { + endianness = Endianness.BIG; + } else { + return []; + } + for (let i = 0; i < magicString.length; ++i) { + if (magicString.charCodeAt(i) !== prefix[i + magicStringOffset]) + return []; + } + + return [ + { + suffix: "nifti:", + description: `NIfTI ${version} (${Endianness[endianness].toLowerCase()}-endian)`, + }, + ]; } + return { + prefixLength: magicStringOffset + magicString.length, + suffixLength: 0, + match, + }; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat(getAutoDetectSpec(348, 344, "n+1\0", "v1")); + registry.registerFileFormat( + getAutoDetectSpec(540, 4, "n+2\0\r\n\x1a\n", "v2"), + ); } diff --git a/src/datasource/nifti/register_default.ts b/src/datasource/nifti/register_default.ts index cdf9a6c4ee..41ed086d2f 100644 --- a/src/datasource/nifti/register_default.ts +++ b/src/datasource/nifti/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { NiftiDataSource } from "#src/datasource/nifti/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + NiftiDataSource, + registerAutoDetect, +} from "#src/datasource/nifti/frontend.js"; -registerProvider("nifti", () => new NiftiDataSource()); +const provider = new NiftiDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/obj/backend.ts b/src/datasource/obj/backend.ts index bc5f42c798..27554ccc35 100644 --- a/src/datasource/obj/backend.ts +++ b/src/datasource/obj/backend.ts @@ -16,17 +16,26 @@ import { parseOBJFromArrayBuffer } from "#src/async_computation/obj_mesh_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** - * This needs to be a global function, because it identifies the instance of GenericSharedDataSource + * This needs to be a global function, because it identifies the instance of SimpleAsyncCache * to use. */ -function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { +async function parse( + readResponse: ReadResponse | undefined, + progressOptions: Partial, +) { + if (readResponse === undefined) { + throw new Error("Not found"); + } + const buffer = await readResponse.response.arrayBuffer(); return requestAsyncComputation( parseOBJFromArrayBuffer, - abortSignal, + progressOptions.signal, [buffer], buffer, ); @@ -34,13 +43,6 @@ function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { registerSingleMeshFactory("obj", { description: "OBJ", - getMesh: (chunkManager, credentialsProvider, url, getPriority, abortSignal) => - GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - parse, - url, - getPriority, - abortSignal, - ), + getMesh: (sharedKvStoreContext, url, options) => + getCachedDecodedUrl(sharedKvStoreContext, url, parse, options), }); diff --git a/src/datasource/obj/frontend.ts b/src/datasource/obj/frontend.ts index e2d9ab15a6..19d2c6a8ce 100644 --- a/src/datasource/obj/frontend.ts +++ b/src/datasource/obj/frontend.ts @@ -19,24 +19,31 @@ import { makeIdentityTransform, } from "#src/coordinate_transform.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -export class ObjDataSource extends DataSourceProvider { +export class ObjDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "obj"; + } get description() { - return "Wavefront OBJ mesh file"; + return "Wavefront OBJ mesh"; + } + + get singleFile() { + return true; } - async get(options: GetDataSourceOptions): Promise { + async get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); const meshSource = await getSingleMeshSource( - options.chunkManager, - options.credentialsManager, - options.url, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + options, ); const modelSpace = makeCoordinateSpace({ rank: 3, @@ -56,11 +63,4 @@ export class ObjDataSource extends DataSourceProvider { }; return dataSource; } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, - ); - } } diff --git a/src/datasource/obj/register_default.ts b/src/datasource/obj/register_default.ts index 7f846e4743..4e4e2832bd 100644 --- a/src/datasource/obj/register_default.ts +++ b/src/datasource/obj/register_default.ts @@ -14,7 +14,13 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; +import { + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; import { ObjDataSource } from "#src/datasource/obj/frontend.js"; -registerProvider("obj", () => new ObjDataSource()); +const provider = new ObjDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index c7a1eac117..1189847503 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -30,23 +30,24 @@ import { annotationTypeHandlers, annotationTypes, } from "#src/annotation/index.js"; -import type { Chunk, ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, - DataEncoding, - IndexedSegmentPropertySourceParameters, MeshSourceParameters, MultiscaleMeshSourceParameters, - ShardingHashFunction, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/precomputed/base.js"; +import type { + ShardedKvStore, + ShardInfo, +} from "#src/datasource/precomputed/sharded.js"; +import { getShardedKvStoreIfApplicable } from "#src/datasource/precomputed/sharded.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { KvStoreWithPath, ReadResponse } from "#src/kvstore/index.js"; +import { readKvStore } from "#src/kvstore/index.js"; import type { FragmentChunk, ManifestChunk, @@ -64,7 +65,6 @@ import { MultiscaleMeshSource, } from "#src/mesh/backend.js"; import { decodeDracoPartitioned } from "#src/mesh/draco/index.js"; -import { IndexedSegmentPropertySourceBackend } from "#src/segmentation_display_state/backend.js"; import type { SkeletonChunk } from "#src/skeleton/backend.js"; import { SkeletonSource } from "#src/skeleton/backend.js"; import { decodeSkeletonChunk } from "#src/skeleton/decode_precomputed_skeleton.js"; @@ -77,20 +77,8 @@ import { decodePngChunk } from "#src/sliceview/backend_chunk_decoders/png.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; -import { decodeGzip } from "#src/util/gzip.js"; -import { murmurHash3_x86_128Hash64Bits } from "#src/util/hash.js"; -import { isNotFoundError } from "#src/util/http_request.js"; -import { stableStringify } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { encodeZIndexCompressed, @@ -102,251 +90,6 @@ import { registerSharedObject } from "#src/worker_rpc.js"; // Set to true to validate the multiscale index. const DEBUG_MULTISCALE_INDEX = false; -const shardingHashFunctions: Map void> = - new Map([ - [ - ShardingHashFunction.MURMURHASH3_X86_128, - (out) => { - murmurHash3_x86_128Hash64Bits(out, 0, out.low, out.high); - }, - ], - [ShardingHashFunction.IDENTITY, (_out) => {}], - ]); - -interface ShardInfo { - shardUrl: string; - offset: Uint64; -} - -interface DecodedMinishardIndex { - data: Uint32Array; - shardUrl: string; -} - -interface MinishardIndexSource - extends GenericSharedDataSource { - sharding: ShardingParameters; - credentialsProvider: SpecialProtocolCredentialsProvider; -} - -function getMinishardIndexDataSource( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - parameters: { url: string; sharding: ShardingParameters | undefined }, -): MinishardIndexSource | undefined { - const { url, sharding } = parameters; - if (sharding === undefined) return undefined; - const source = GenericSharedDataSource.get< - Uint64, - DecodedMinishardIndex | undefined - >( - chunkManager, - stableStringify({ - type: "precomputed:shardedDataSource", - url, - sharding, - credentialsProvider: getObjectId(credentialsProvider), - }), - { - download: async (shardAndMinishard: Uint64, abortSignal: AbortSignal) => { - const minishard = Uint64.lowMask(new Uint64(), sharding.minishardBits); - Uint64.and(minishard, minishard, shardAndMinishard); - const shard = Uint64.lowMask(new Uint64(), sharding.shardBits); - const temp = new Uint64(); - Uint64.rshift(temp, shardAndMinishard, sharding.minishardBits); - Uint64.and(shard, shard, temp); - const shardUrl = `${url}/${shard - .toString(16) - .padStart(Math.ceil(sharding.shardBits / 4), "0")}.shard`; - // Retrive minishard index start/end offsets. - const shardIndexSize = new Uint64(16); - Uint64.lshift(shardIndexSize, shardIndexSize, sharding.minishardBits); - - // Multiply minishard by 16. - const shardIndexStart = Uint64.lshift(new Uint64(), minishard, 4); - const shardIndexEnd = Uint64.addUint32( - new Uint64(), - shardIndexStart, - 16, - ); - let shardIndexResponse: ArrayBuffer; - try { - shardIndexResponse = await fetchSpecialHttpByteRange( - credentialsProvider, - shardUrl, - shardIndexStart, - shardIndexEnd, - abortSignal, - ); - } catch (e) { - if (isNotFoundError(e)) return { data: undefined, size: 0 }; - throw e; - } - if (shardIndexResponse.byteLength !== 16) { - throw new Error("Failed to retrieve minishard offset"); - } - const shardIndexDv = new DataView(shardIndexResponse); - const minishardStartOffset = new Uint64( - shardIndexDv.getUint32(0, /*littleEndian=*/ true), - shardIndexDv.getUint32(4, /*littleEndian=*/ true), - ); - const minishardEndOffset = new Uint64( - shardIndexDv.getUint32(8, /*littleEndian=*/ true), - shardIndexDv.getUint32(12, /*littleEndian=*/ true), - ); - if (Uint64.equal(minishardStartOffset, minishardEndOffset)) { - return { data: undefined, size: 0 }; - } - // The start/end offsets in the shard index are relative to the end of the shard - // index. - Uint64.add(minishardStartOffset, minishardStartOffset, shardIndexSize); - Uint64.add(minishardEndOffset, minishardEndOffset, shardIndexSize); - - let minishardIndexResponse = await fetchSpecialHttpByteRange( - credentialsProvider, - shardUrl, - minishardStartOffset, - minishardEndOffset, - abortSignal, - ); - if (sharding.minishardIndexEncoding === DataEncoding.GZIP) { - minishardIndexResponse = await decodeGzip( - minishardIndexResponse, - "gzip", - ); - } - if (minishardIndexResponse.byteLength % 24 !== 0) { - throw new Error( - `Invalid minishard index length: ${minishardIndexResponse.byteLength}`, - ); - } - const minishardIndex = new Uint32Array(minishardIndexResponse); - convertEndian32(minishardIndex, Endianness.LITTLE); - - const minishardIndexSize = minishardIndex.byteLength / 24; - let prevEntryKeyLow = 0; - let prevEntryKeyHigh = 0; - // Offsets in the minishard index are relative to the end of the shard index. - let prevStartLow = shardIndexSize.low; - let prevStartHigh = shardIndexSize.high; - for (let i = 0; i < minishardIndexSize; ++i) { - let entryKeyLow = prevEntryKeyLow + minishardIndex[i * 2]; - let entryKeyHigh = prevEntryKeyHigh + minishardIndex[i * 2 + 1]; - if (entryKeyLow >= 4294967296) { - entryKeyLow -= 4294967296; - entryKeyHigh += 1; - } - prevEntryKeyLow = minishardIndex[i * 2] = entryKeyLow; - prevEntryKeyHigh = minishardIndex[i * 2 + 1] = entryKeyHigh; - let startLow = - prevStartLow + minishardIndex[(minishardIndexSize + i) * 2]; - let startHigh = - prevStartHigh + minishardIndex[(minishardIndexSize + i) * 2 + 1]; - if (startLow >= 4294967296) { - startLow -= 4294967296; - startHigh += 1; - } - minishardIndex[(minishardIndexSize + i) * 2] = startLow; - minishardIndex[(minishardIndexSize + i) * 2 + 1] = startHigh; - const sizeLow = minishardIndex[(2 * minishardIndexSize + i) * 2]; - const sizeHigh = minishardIndex[(2 * minishardIndexSize + i) * 2 + 1]; - let endLow = startLow + sizeLow; - let endHigh = startHigh + sizeHigh; - if (endLow >= 4294967296) { - endLow -= 4294967296; - endHigh += 1; - } - prevStartLow = endLow; - prevStartHigh = endHigh; - minishardIndex[(2 * minishardIndexSize + i) * 2] = endLow; - minishardIndex[(2 * minishardIndexSize + i) * 2 + 1] = endHigh; - } - return { - data: { data: minishardIndex, shardUrl }, - size: minishardIndex.byteLength, - }; - }, - encodeKey: (key: Uint64) => key.toString(), - sourceQueueLevel: 1, - }, - ) as MinishardIndexSource; - source.sharding = sharding; - source.credentialsProvider = credentialsProvider; - return source; -} - -function findMinishardEntry( - minishardIndex: DecodedMinishardIndex, - key: Uint64, -): { startOffset: Uint64; endOffset: Uint64 } | undefined { - const minishardIndexData = minishardIndex.data; - const minishardIndexSize = minishardIndexData.length / 6; - const keyLow = key.low; - const keyHigh = key.high; - for (let i = 0; i < minishardIndexSize; ++i) { - if ( - minishardIndexData[i * 2] !== keyLow || - minishardIndexData[i * 2 + 1] !== keyHigh - ) { - continue; - } - const startOffset = new Uint64( - minishardIndexData[(minishardIndexSize + i) * 2], - minishardIndexData[(minishardIndexSize + i) * 2 + 1], - ); - const endOffset = new Uint64( - minishardIndexData[(2 * minishardIndexSize + i) * 2], - minishardIndexData[(2 * minishardIndexSize + i) * 2 + 1], - ); - return { startOffset, endOffset }; - } - return undefined; -} - -async function getShardedData( - minishardIndexSource: MinishardIndexSource, - chunk: Chunk, - key: Uint64, - abortSignal: AbortSignal, -): Promise<{ shardInfo: ShardInfo; data: ArrayBuffer } | undefined> { - const { sharding } = minishardIndexSource; - const hashFunction = shardingHashFunctions.get(sharding.hash)!; - const hashCode = Uint64.rshift(new Uint64(), key, sharding.preshiftBits); - hashFunction(hashCode); - const shardAndMinishard = Uint64.lowMask( - new Uint64(), - sharding.minishardBits + sharding.shardBits, - ); - Uint64.and(shardAndMinishard, shardAndMinishard, hashCode); - const getPriority = () => ({ - priorityTier: chunk.priorityTier, - priority: chunk.priority, - }); - const minishardIndex = await minishardIndexSource.getData( - shardAndMinishard, - getPriority, - abortSignal, - ); - if (minishardIndex === undefined) return undefined; - const minishardEntry = findMinishardEntry(minishardIndex, key); - if (minishardEntry === undefined) return undefined; - const { startOffset, endOffset } = minishardEntry; - let data = await fetchSpecialHttpByteRange( - minishardIndexSource.credentialsProvider, - minishardIndex.shardUrl, - startOffset, - endOffset, - abortSignal, - ); - if (minishardIndexSource.sharding.dataEncoding === DataEncoding.GZIP) { - data = await decodeGzip(data, "gzip"); - } - return { - data, - shardInfo: { shardUrl: minishardIndex.shardUrl, offset: startOffset }, - }; -} - function getOrNotFoundError(v: T | undefined) { if (v === undefined) throw new Error("not found"); return v; @@ -365,16 +108,17 @@ chunkDecoders.set(VolumeChunkEncoding.JXL, decodeJxlChunk); @registerSharedObject() export class PrecomputedVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { chunkDecoder = chunkDecoders.get(this.parameters.encoding)!; - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.sharding, ); gridShape = (() => { @@ -386,36 +130,25 @@ export class PrecomputedVolumeChunkSource extends WithParameters( return gridShape; })(); - async download(chunk: VolumeChunk, abortSignal: AbortSignal): Promise { - const { parameters } = this; - - const { minishardIndexSource } = this; - let response: ArrayBuffer | undefined; - if (minishardIndexSource === undefined) { - let url: string; + async download(chunk: VolumeChunk, signal: AbortSignal): Promise { + const { shardedKvStore } = this; + let readResponse: ReadResponse | undefined; + if (shardedKvStore === undefined) { + const { kvStore } = this; + let path: string; { // chunkPosition must not be captured, since it will be invalidated by the next call to // computeChunkBounds. const chunkPosition = this.computeChunkBounds(chunk); const chunkDataSize = chunk.chunkDataSize!; - url = - `${parameters.url}/${chunkPosition[0]}-${ + path = + `${kvStore.path}${chunkPosition[0]}-${ chunkPosition[0] + chunkDataSize[0] }_` + `${chunkPosition[1]}-${chunkPosition[1] + chunkDataSize[1]}_` + `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; } - try { - response = await fetchSpecialOk(this.credentialsProvider, url, { - signal: abortSignal, - }).then((response) => response.arrayBuffer()); - } catch (e) { - if (isNotFoundError(e)) { - response = undefined; - } else { - throw e; - } - } + readResponse = await kvStore.store.read(path, { signal }); } else { this.computeChunkBounds(chunk); const { gridShape } = this; @@ -424,7 +157,6 @@ export class PrecomputedVolumeChunkSource extends WithParameters( const yBits = Math.ceil(Math.log2(gridShape[1])); const zBits = Math.ceil(Math.log2(gridShape[2])); const chunkIndex = encodeZIndexCompressed3d( - new Uint64(), xBits, yBits, zBits, @@ -432,17 +164,14 @@ export class PrecomputedVolumeChunkSource extends WithParameters( chunkGridPosition[1], chunkGridPosition[2], ); - response = ( - await getShardedData( - minishardIndexSource, - chunk, - chunkIndex, - abortSignal, - ) - )?.data; + readResponse = await shardedKvStore.read(chunkIndex, { signal }); } - if (response !== undefined) { - await this.chunkDecoder(chunk, abortSignal, response); + if (readResponse !== undefined) { + await this.chunkDecoder( + chunk, + signal, + await readResponse.response.arrayBuffer(), + ); } } } @@ -470,29 +199,30 @@ export function decodeFragmentChunk( @registerSharedObject() export class PrecomputedMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MeshSource, - ), + WithSharedKvStoreContextCounterpart(MeshSource), MeshSourceParameters, ) { - async download(chunk: ManifestChunk, abortSignal: AbortSignal) { - const { parameters } = this; - const response = await fetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.objectId}:${parameters.lod}`, - { signal: abortSignal }, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + async download(chunk: ManifestChunk, signal: AbortSignal) { + const { parameters, kvStore } = this; + const response = await readKvStore( + kvStore.store, + `${kvStore.path}${chunk.objectId}:${parameters.lod}`, + { signal, throwIfMissing: true }, ); - decodeManifestChunk(chunk, await response.json()); + decodeManifestChunk(chunk, await response.response.json()); } - async downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { - const { parameters } = this; - const response = await fetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.fragmentId}`, - { signal: abortSignal }, + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { + const { kvStore } = this; + const response = await readKvStore( + kvStore.store, + `${kvStore.path}${chunk.fragmentId}`, + { signal, throwIfMissing: true }, ); - decodeFragmentChunk(chunk, await response.arrayBuffer()); + decodeFragmentChunk(chunk, await response.response.arrayBuffer()); } } @@ -740,146 +470,128 @@ async function decodeMultiscaleFragmentChunk( @registerSharedObject() // export class PrecomputedMultiscaleMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MultiscaleMeshSource, - ), + WithSharedKvStoreContextCounterpart(MultiscaleMeshSource), MultiscaleMeshSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - { url: this.parameters.url, sharding: this.parameters.metadata.sharding }, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.metadata.sharding, ); async download( chunk: PrecomputedMultiscaleManifestChunk, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { - const { parameters, minishardIndexSource } = this; - let data: ArrayBuffer; - if (minishardIndexSource === undefined) { - data = await fetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.objectId}.index`, - { signal: abortSignal }, - ).then((response) => response.arrayBuffer()); + const { shardedKvStore } = this; + let readResponse: ReadResponse | undefined; + if (shardedKvStore === undefined) { + const { kvStore } = this; + readResponse = await kvStore.store.read( + `${kvStore.path}${chunk.objectId}.index`, + { signal }, + ); } else { - ({ data, shardInfo: chunk.shardInfo } = getOrNotFoundError( - await getShardedData( - minishardIndexSource, - chunk, - chunk.objectId, - abortSignal, - ), - )); + ({ response: readResponse, shardInfo: chunk.shardInfo } = + getOrNotFoundError( + await shardedKvStore.readWithShardInfo(chunk.objectId.toBigInt(), { + signal, + }), + )); } + + const data = await getOrNotFoundError(readResponse).response.arrayBuffer(); + decodeMultiscaleManifestChunk(chunk, data); } async downloadFragment( chunk: MultiscaleFragmentChunk, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { - const { parameters } = this; + const { kvStore } = this; const manifestChunk = chunk.manifestChunk! as PrecomputedMultiscaleManifestChunk; const chunkIndex = chunk.chunkIndex; const { shardInfo, offsets } = manifestChunk; const startOffset = offsets[chunkIndex]; const endOffset = offsets[chunkIndex + 1]; - let requestUrl: string; - let adjustedStartOffset: Uint64 | number; - let adjustedEndOffset: Uint64 | number; + let requestPath: string; + let adjustedStartOffset: number; + let adjustedEndOffset: number; if (shardInfo !== undefined) { - requestUrl = shardInfo.shardUrl; + requestPath = shardInfo.shardPath; const fullDataSize = offsets[offsets.length - 1]; - let startLow = shardInfo.offset.low - fullDataSize + startOffset; - let startHigh = shardInfo.offset.high; - let endLow = startLow + endOffset - startOffset; - let endHigh = startHigh; - while (startLow < 0) { - startLow += 4294967296; - startHigh -= 1; - } - while (endLow < 0) { - endLow += 4294967296; - endHigh -= 1; - } - while (endLow > 4294967296) { - endLow -= 4294967296; - endHigh += 1; - } - adjustedStartOffset = new Uint64(startLow, startHigh); - adjustedEndOffset = new Uint64(endLow, endHigh); + const start = shardInfo.offset - fullDataSize + startOffset; + const end = start + endOffset - startOffset; + adjustedStartOffset = start; + adjustedEndOffset = end; } else { - requestUrl = `${parameters.url}/${manifestChunk.objectId}`; + requestPath = `${kvStore.path}${manifestChunk.objectId}`; adjustedStartOffset = startOffset; adjustedEndOffset = endOffset; } - const response = await fetchSpecialHttpByteRange( - this.credentialsProvider, - requestUrl, - adjustedStartOffset, - adjustedEndOffset, - abortSignal, + const readResponse = await readKvStore(kvStore.store, requestPath, { + signal, + byteRange: { + offset: adjustedStartOffset, + length: adjustedEndOffset - adjustedStartOffset, + }, + throwIfMissing: true, + strictByteRange: true, + }); + await decodeMultiscaleFragmentChunk( + chunk, + await readResponse.response.arrayBuffer(), ); - await decodeMultiscaleFragmentChunk(chunk, response); } } async function fetchByUint64( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - chunk: Chunk, - minishardIndexSource: MinishardIndexSource | undefined, + chunkSource: { + kvStore: KvStoreWithPath; + shardedKvStore: ShardedKvStore | undefined; + }, id: Uint64, - abortSignal: AbortSignal, -) { - if (minishardIndexSource === undefined) { - try { - return await fetchSpecialOk(credentialsProvider, `${url}/${id}`, { - signal: abortSignal, - }).then((response) => response.arrayBuffer()); - } catch (e) { - if (isNotFoundError(e)) return undefined; - throw e; - } + signal: AbortSignal, +): Promise { + const { shardedKvStore } = chunkSource; + if (shardedKvStore === undefined) { + const { kvStore } = chunkSource; + return kvStore.store.read(`${kvStore.path}${id}`, { + signal, + }); + } else { + return shardedKvStore.read(id.toBigInt(), { signal }); } - const result = await getShardedData( - minishardIndexSource, - chunk, - id, - abortSignal, - ); - if (result === undefined) return undefined; - return result.data; } @registerSharedObject() // export class PrecomputedSkeletonSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - SkeletonSource, - ), + WithSharedKvStoreContextCounterpart(SkeletonSource), SkeletonSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - { url: this.parameters.url, sharding: this.parameters.metadata.sharding }, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.metadata.sharding, ); - async download(chunk: SkeletonChunk, abortSignal: AbortSignal) { + async download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const response = getOrNotFoundError( - await fetchByUint64( - this.credentialsProvider, - parameters.url, - chunk, - this.minishardIndexSource, - chunk.objectId, - abortSignal, - ), + await fetchByUint64(this, chunk.objectId, signal), + ); + decodeSkeletonChunk( + chunk, + await response.response.arrayBuffer(), + parameters.metadata.vertexAttributes, ); - decodeSkeletonChunk(chunk, response, parameters.metadata.vertexAttributes); } } @@ -1022,52 +734,39 @@ function parseSingleAnnotation( @registerSharedObject() // export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - AnnotationGeometryChunkSourceBackend, - ), + WithSharedKvStoreContextCounterpart(AnnotationGeometryChunkSourceBackend), AnnotationSpatialIndexSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.sharding, ); declare parent: PrecomputedAnnotationSourceBackend; - async download(chunk: AnnotationGeometryChunk, abortSignal: AbortSignal) { - const { parameters } = this; - - const { minishardIndexSource } = this; + async download(chunk: AnnotationGeometryChunk, signal: AbortSignal) { + const { shardedKvStore } = this; const { parent } = this; - let response: ArrayBuffer | undefined; + let response: ReadResponse | undefined; const { chunkGridPosition } = chunk; - if (minishardIndexSource === undefined) { - const url = `${parameters.url}/${chunkGridPosition.join("_")}`; - try { - response = await fetchSpecialOk(this.credentialsProvider, url, { - signal: abortSignal, - }).then((response) => response.arrayBuffer()); - } catch (e) { - if (!isNotFoundError(e)) throw e; - } + if (shardedKvStore === undefined) { + const { kvStore } = this; + const path = `${kvStore.path}/${chunkGridPosition.join("_")}`; + response = await kvStore.store.read(path, { signal }); } else { const { upperChunkBound } = this.spec; const { chunkGridPosition } = chunk; const chunkIndex = encodeZIndexCompressed( - new Uint64(), chunkGridPosition, upperChunkBound, ); - const result = await getShardedData( - minishardIndexSource, - chunk, - chunkIndex, - abortSignal, - ); - if (result !== undefined) response = result.data; + response = await shardedKvStore.read(chunkIndex, { signal }); } if (response !== undefined) { chunk.data = parseAnnotations( - response, + await response.response.arrayBuffer(), parent.parameters, parent.annotationPropertySerializer, ); @@ -1077,19 +776,26 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete @registerSharedObject() // export class PrecomputedAnnotationSourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - AnnotationSource, - ), + WithSharedKvStoreContextCounterpart(AnnotationSource), AnnotationSourceParameters, ) { - private byIdMinishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters.byId, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.byId.url, ); - private relationshipIndexSource = this.parameters.relationships.map((x) => - getMinishardIndexDataSource(this.chunkManager, this.credentialsProvider, x), + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.byId.sharding, ); + private relationshipIndexSource = this.parameters.relationships.map((x) => { + const kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore(x.url); + const shardedKvStore = getShardedKvStoreIfApplicable( + this, + kvStore, + x.sharding, + ); + return { kvStore, shardedKvStore }; + }); annotationPropertySerializer = new AnnotationPropertySerializer( this.parameters.rank, annotationTypeHandlers[this.parameters.type].serializedBytes( @@ -1101,45 +807,30 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( async downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - abortSignal: AbortSignal, + signal: AbortSignal, ) { - const { parameters } = this; const response = await fetchByUint64( - this.credentialsProvider, - parameters.relationships[relationshipIndex].url, - chunk, this.relationshipIndexSource[relationshipIndex], chunk.objectId, - abortSignal, + signal, ); if (response !== undefined) { chunk.data = parseAnnotations( - response, + await response.response.arrayBuffer(), this.parameters, this.annotationPropertySerializer, ); } } - async downloadMetadata( - chunk: AnnotationMetadataChunk, - abortSignal: AbortSignal, - ) { - const { parameters } = this; + async downloadMetadata(chunk: AnnotationMetadataChunk, signal: AbortSignal) { const id = Uint64.parseString(chunk.key!); - const response = await fetchByUint64( - this.credentialsProvider, - parameters.byId.url, - chunk, - this.byIdMinishardIndexSource, - id, - abortSignal, - ); + const response = await fetchByUint64(this, id, signal); if (response === undefined) { chunk.annotation = null; } else { chunk.annotation = parseSingleAnnotation( - response, + await response.response.arrayBuffer(), this.parameters, this.annotationPropertySerializer, chunk.key!, @@ -1147,17 +838,3 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( } } } - -@registerSharedObject() -export class PrecomputedIndexedSegmentPropertySourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - IndexedSegmentPropertySourceBackend, - ), - IndexedSegmentPropertySourceParameters, -) { - minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, - ); -} diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index 52d29ecba4..bf532e0bbb 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -24,7 +24,6 @@ import { makeDataBoundsBoundingBoxAnnotationSet, parseAnnotationPropertySpecs, } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { BoundingBox, @@ -37,16 +36,15 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { - CompleteUrlOptions, - ConvertLegacyUrlOptions, - DataSource, - DataSubsourceEntry, - GetDataSourceOptions, - NormalizeUrlOptions, +import { + KvStoreBasedDataSourceLegacyUrlAdapter, + type ConvertLegacyUrlOptions, + type DataSource, + type DataSourceLookupResult, + type DataSubsourceEntry, + type GetKvStoreBasedDataSourceOptions, + type KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider, RedirectError } from "#src/datasource/index.js"; import type { MultiscaleMeshMetadata, ShardingParameters, @@ -56,7 +54,6 @@ import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, DataEncoding, - IndexedSegmentPropertySourceParameters, MeshSourceParameters, MultiscaleMeshSourceParameters, ShardingHashFunction, @@ -64,6 +61,16 @@ import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/precomputed/base.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { KvStoreContext } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + kvstoreEnsureDirectoryPipelineUrl, + parseUrlSuffix, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import { VertexPositionFormat } from "#src/mesh/base.js"; import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import type { @@ -71,7 +78,6 @@ import type { InlineSegmentPropertyMap, } from "#src/segmentation_display_state/property_map.js"; import { - IndexedSegmentPropertySource, normalizeInlineSegmentPropertyMap, SegmentPropertyMap, } from "#src/segmentation_display_state/property_map.js"; @@ -90,10 +96,7 @@ import { } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { mat4, vec3 } from "#src/util/geom.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -113,34 +116,27 @@ import { verifyOptionalBoolean, } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { Uint64 } from "#src/util/uint64.js"; export class PrecomputedVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} class PrecomputedMeshSource extends WithParameters( - WithCredentialsProvider()(MeshSource), + WithSharedKvStoreContext(MeshSource), MeshSourceParameters, ) {} class PrecomputedMultiscaleMeshSource extends WithParameters( - WithCredentialsProvider()(MultiscaleMeshSource), + WithSharedKvStoreContext(MultiscaleMeshSource), MultiscaleMeshSourceParameters, ) {} class PrecomputedSkeletonSource extends WithParameters( - WithCredentialsProvider()(SkeletonSource), + WithSharedKvStoreContext(SkeletonSource), SkeletonSourceParameters, ) { get skeletonVertexCoordinatesInVoxels() { @@ -151,20 +147,6 @@ class PrecomputedSkeletonSource extends WithParameters( } } -export function resolvePath(a: string, b: string) { - const outputParts = a.split("/"); - for (const part of b.split("/")) { - if (part === "..") { - if (outputParts.length !== 0) { - outputParts.length = outputParts.length - 1; - continue; - } - } - outputParts.push(part); - } - return outputParts.join("/"); -} - class ScaleInfo { key: string; encoding: VolumeChunkEncoding; @@ -325,12 +307,11 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun } constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public url: string, public info: MultiscaleVolumeInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); } getSources(volumeSourceOptions: VolumeSourceOptions) { @@ -380,10 +361,15 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun chunkSource: this.chunkManager.getChunkSource( PrecomputedVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: resolvePath(this.url, scaleInfo.key), + url: kvstoreEnsureDirectoryPipelineUrl( + this.sharedKvStoreContext.kvStoreContext.resolveRelativePath( + this.url, + scaleInfo.key, + ), + ), encoding: scaleInfo.encoding, sharding: scaleInfo.sharding, }, @@ -400,44 +386,36 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun } const MultiscaleAnnotationSourceBase = WithParameters( - WithCredentialsProvider()( - MultiscaleAnnotationSource, - ), + WithSharedKvStoreContext(MultiscaleAnnotationSource), AnnotationSourceParameters, ); class PrecomputedAnnotationSpatialIndexSource extends WithParameters( - WithCredentialsProvider()( - AnnotationGeometryChunkSource, - ), + WithSharedKvStoreContext(AnnotationGeometryChunkSource), AnnotationSpatialIndexSourceParameters, ) {} interface PrecomputedAnnotationSourceOptions { metadata: AnnotationMetadata; parameters: AnnotationSourceParameters; - credentialsProvider: SpecialProtocolCredentialsProvider; + sharedKvStoreContext: SharedKvStoreContext; } export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase { declare key: any; metadata: AnnotationMetadata; - credentialsProvider: SpecialProtocolCredentialsProvider; declare OPTIONS: PrecomputedAnnotationSourceOptions; - constructor( - chunkManager: ChunkManager, - options: PrecomputedAnnotationSourceOptions, - ) { + constructor(options: PrecomputedAnnotationSourceOptions) { const { parameters } = options; - super(chunkManager, { + super(options.sharedKvStoreContext.chunkManager, { rank: parameters.rank, relationships: parameters.relationships.map((x) => x.name), properties: parameters.properties, + sharedKvStoreContext: options.sharedKvStoreContext, parameters, } as any); this.readonly = true; this.metadata = options.metadata; - this.credentialsProvider = options.credentialsProvider; } getSources(): SliceViewSingleResolutionSource[][] { @@ -448,7 +426,7 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase chunkSource: this.chunkManager.getChunkSource( PrecomputedAnnotationSpatialIndexSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, parent: this, spec, parameters: spatialIndexLevel.parameters, @@ -462,14 +440,16 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase } function getLegacyMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, parameters: MeshSourceParameters, ) { - return chunkManager.getChunkSource(PrecomputedMeshSource, { - parameters, - credentialsProvider, - }); + return sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedMeshSource, + { + parameters, + sharedKvStoreContext, + }, + ); } function parseTransform(data: any): mat4 { @@ -533,20 +513,20 @@ function parseMeshMetadata(data: any): ParsedMeshMetadata { } async function getMeshMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { - let metadata: any; - try { - metadata = await getJsonMetadata(chunkManager, credentialsProvider, url); - } catch (e) { - if (isNotFoundError(e)) { - // If we fail to fetch the info file, assume it is the legacy - // single-resolution mesh format. - return { metadata: undefined }; - } - throw e; + const metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ false, + options, + ); + if (metadata === undefined) { + // If the info file is missing, assume it is the legacy + // single-resolution mesh format. + return { metadata: undefined }; } return parseMeshMetadata(metadata); } @@ -649,14 +629,15 @@ function parseSkeletonMetadata(data: any): ParsedSkeletonMetadata { } async function getSkeletonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const metadata = await getJsonMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + /*required=*/ true, + options, ); return parseSkeletonMetadata(metadata); } @@ -670,18 +651,18 @@ function getDefaultCoordinateSpace() { } async function getMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { const { metadata, segmentPropertyMap } = await getMeshMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + options, ); if (metadata === undefined) { return { - source: getLegacyMeshSource(chunkManager, credentialsProvider, { + source: getLegacyMeshSource(sharedKvStoreContext, { url, lod: 0, }), @@ -701,57 +682,71 @@ async function getMeshSource( ); } return { - source: chunkManager.getChunkSource(PrecomputedMultiscaleMeshSource, { - credentialsProvider, - parameters: { url, metadata }, - format: { - fragmentRelativeVertices: true, - vertexPositionFormat, + source: sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedMultiscaleMeshSource, + { + sharedKvStoreContext, + parameters: { url, metadata }, + format: { + fragmentRelativeVertices: true, + vertexPositionFormat, + }, }, - }), + ), transform: metadata.transform, segmentPropertyMap, }; } async function getSkeletonSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { const { metadata, segmentPropertyMap } = await getSkeletonMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + options, ); return { - source: chunkManager.getChunkSource(PrecomputedSkeletonSource, { - credentialsProvider, - parameters: { - url, - metadata, + source: sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedSkeletonSource, + { + sharedKvStoreContext, + parameters: { + url, + metadata, + }, }, - }), + ), transform: metadata.transform, segmentPropertyMap, }; } -function getJsonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, +export function getJsonMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, + required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "precomputed:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - return await fetchSpecialOk(credentialsProvider, `${url}/info`, {}).then( - (response) => response.json(), - ); + options, + async (options) => { + const infoUrl = pipelineUrlJoin(url, "info"); + using _span = new ProgressSpan(options.progressListener, { + message: `Reading neuroglancer_precomputed metadata from ${infoUrl}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(infoUrl, { + ...options, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -766,15 +761,14 @@ function getSubsourceToModelSubspaceTransform(info: MultiscaleVolumeInfo) { } async function getVolumeDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, + options: Partial, ): Promise { const info = parseMultiscaleVolumeInfo(metadata); const volume = new PrecomputedMultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, url, info, ); @@ -796,18 +790,19 @@ async function getVolumeDataSource( }, ]; if (info.segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, info.segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.segmentPropertyMap, + ), ); - const segmentPropertyMap = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMap = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -815,11 +810,13 @@ async function getVolumeDataSource( }); } if (info.mesh !== undefined) { - const meshUrl = resolvePath(url, info.mesh); + const meshUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath(url, info.mesh), + ); const { source: meshSource, transform } = await getMeshSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, meshUrl, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -836,11 +833,16 @@ async function getVolumeDataSource( }); } if (info.skeletons !== undefined) { - const skeletonsUrl = resolvePath(url, info.skeletons); + const skeletonsUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.skeletons, + ), + ); const { source: skeletonSource, transform } = await getSkeletonSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, skeletonsUrl, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -860,15 +862,15 @@ async function getVolumeDataSource( } async function getSkeletonsDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const { source: skeletons, transform, segmentPropertyMap, - } = await getSkeletonSource(options.chunkManager, credentialsProvider, url); + } = await getSkeletonSource(sharedKvStoreContext, url, options); const subsources: DataSubsourceEntry[] = [ { id: "default", @@ -878,18 +880,19 @@ async function getSkeletonsDataSource( }, ]; if (segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + segmentPropertyMap, + ), ); - const segmentPropertyMapData = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMapData = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -902,10 +905,17 @@ async function getSkeletonsDataSource( }; } -function parseKeyAndShardingSpec(url: string, obj: any) { +function parseKeyAndShardingSpec( + kvStoreContext: KvStoreContext, + url: string, + obj: any, +) { verifyObject(obj); + const relativePath = verifyObjectProperty(obj, "key", verifyString); return { - url: resolvePath(url, verifyObjectProperty(obj, "key", verifyString)), + url: kvstoreEnsureDirectoryPipelineUrl( + kvStoreContext.resolveRelativePath(url, relativePath), + ), sharding: verifyObjectProperty(obj, "sharding", parseShardingParameters), }; } @@ -921,6 +931,7 @@ class AnnotationMetadata { parameters: AnnotationSourceParameters; spatialIndices: AnnotationSpatialIndexLevelMetadata[]; constructor( + kvStoreContext: KvStoreContext, public url: string, metadata: any, ) { @@ -970,7 +981,7 @@ class AnnotationMetadata { "relationships", (relsObj) => parseArray(relsObj, (relObj) => { - const common = parseKeyAndShardingSpec(url, relObj); + const common = parseKeyAndShardingSpec(kvStoreContext, url, relObj); const name = verifyObjectProperty(relObj, "id", verifyString); return { ...common, name }; }), @@ -981,7 +992,7 @@ class AnnotationMetadata { parseAnnotationPropertySpecs, ), byId: verifyObjectProperty(metadata, "by_id", (obj) => - parseKeyAndShardingSpec(url, obj), + parseKeyAndShardingSpec(kvStoreContext, url, obj), ), }; this.spatialIndices = verifyObjectProperty( @@ -990,7 +1001,7 @@ class AnnotationMetadata { (spatialObj) => parseArray(spatialObj, (levelObj) => { const common: AnnotationSpatialIndexSourceParameters = - parseKeyAndShardingSpec(url, levelObj); + parseKeyAndShardingSpec(kvStoreContext, url, levelObj); const gridShape = verifyObjectProperty(levelObj, "grid_shape", (j) => parseFixedLengthArray(new Float32Array(rank), j, verifyPositiveInt), ); @@ -1038,13 +1049,16 @@ class AnnotationMetadata { } } -async function getAnnotationDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, +function getAnnotationDataSource( + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, -): Promise { - const info = new AnnotationMetadata(url, metadata); +): DataSource { + const info = new AnnotationMetadata( + sharedKvStoreContext.kvStoreContext, + url, + metadata, + ); const dataSource: DataSource = { modelTransform: makeIdentityTransform(info.coordinateSpace), subsources: [ @@ -1052,10 +1066,10 @@ async function getAnnotationDataSource( id: "default", default: true, subsource: { - annotation: options.chunkManager.getChunkSource( + annotation: sharedKvStoreContext.chunkManager.getChunkSource( PrecomputedAnnotationSource, { - credentialsProvider, + sharedKvStoreContext, metadata: info, parameters: info.parameters, }, @@ -1068,15 +1082,15 @@ async function getAnnotationDataSource( } async function getMeshDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const { source: mesh, transform, segmentPropertyMap, - } = await getMeshSource(options.chunkManager, credentialsProvider, url); + } = await getMeshSource(sharedKvStoreContext, url, options); const subsources: DataSubsourceEntry[] = [ { id: "default", @@ -1086,18 +1100,19 @@ async function getMeshDataSource( }, ]; if (segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + segmentPropertyMap, + ), ); - const segmentPropertyMapData = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMapData = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -1233,44 +1248,7 @@ function parseInlinePropertyMap(data: unknown): InlineSegmentPropertyMap { return normalizeInlineSegmentPropertyMap({ ids, properties }); } -export const PrecomputedIndexedSegmentPropertySource = WithParameters( - WithCredentialsProvider()( - IndexedSegmentPropertySource, - ), - IndexedSegmentPropertySourceParameters, -); - -// function parseIndexedPropertyMap(data: unknown): { -// sharding: ShardingParameters|undefined, -// properties: readonly Readonly[] -// } { -// verifyObject(data); -// const sharding = verifyObjectProperty(data, 'sharding', parseShardingParameters); -// const properties = verifyObjectProperty( -// data, 'properties', -// propertiesObj => parseArray(propertiesObj, (propertyObj): IndexedSegmentProperty => { -// const id = verifyObjectProperty(propertyObj, 'id', verifyString); -// const description = verifyOptionalObjectProperty(propertyObj, 'description', verifyString); -// const type = verifyObjectProperty(propertyObj, 'type', type => { -// if (type !== 'string') { -// throw new Error(`Invalid property type: ${JSON.stringify(type)}`); -// } -// return type; -// }); -// return {id, description, type}; -// })); -// return {sharding, properties}; -// } - -export function getSegmentPropertyMap( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - data: unknown, - url: string, -): SegmentPropertyMap { - chunkManager; - credentialsProvider; - url; +export function getSegmentPropertyMap(data: unknown): SegmentPropertyMap { try { const t = verifyObjectProperty(data, "@type", verifyString); if (t !== "neuroglancer_segment_properties") { @@ -1283,25 +1261,13 @@ export function getSegmentPropertyMap( "inline", parseInlinePropertyMap, ); - // const indexedProperties = verifyOptionalObjectProperty(data, 'indexed', indexedObj => { - // const {sharding, properties} = parseIndexedPropertyMap(indexedObj); - // return chunkManager.getChunkSource( - // PrecomputedIndexedSegmentPropertySource, - // {credentialsProvider, properties, parameters: {sharding, url}}); - // }); return new SegmentPropertyMap({ inlineProperties }); } catch (e) { throw new Error(`Error parsing segment property map: ${e.message}`); } } -async function getSegmentPropertyMapDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - metadata: unknown, -): Promise { - options; +function getSegmentPropertyMapDataSource(metadata: unknown): DataSource { return { modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), subsources: [ @@ -1309,12 +1275,7 @@ async function getSegmentPropertyMapDataSource( id: "default", default: true, subsource: { - segmentPropertyMap: getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, - url, - ), + segmentPropertyMap: getSegmentPropertyMap(metadata), }, }, ], @@ -1340,54 +1301,47 @@ export function unparseProviderUrl(url: string, parameters: any) { return url; } -export class PrecomputedDataSource extends DataSourceProvider { - get description() { - return "Precomputed file-backed data source"; +export class PrecomputedDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "neuroglancer-precomputed"; } - - normalizeUrl(options: NormalizeUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get expectsDirectory() { + return true; } - - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - if (options.type === "mesh") { - parameters.type = "mesh"; - } - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get description() { + return "Neuroglancer Precomputed data source"; } - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + const { authorityAndPath, query, fragment } = parseUrlSuffix( + options.url.suffix, ); - return options.chunkManager.memoize.getUncounted( - { type: "precomputed:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, + if (query) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: query parameters not supported`, + ); + } + if (authorityAndPath) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: non-empty path not supported`, + ); + } + const parameters = parseQueryStringParameters(fragment ?? ""); + const url = kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl); + return options.registry.chunkManager.memoize.getAsync( + { type: "precomputed:get", url, parameters }, + options, + async (progressOptions) => { + const { sharedKvStoreContext } = options.registry; + const metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ parameters.type !== "mesh", + progressOptions, ); - let metadata: any; - try { - metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - url, - ); - } catch (e) { - if (isNotFoundError(e)) { - if (parameters.type === "mesh") { - return await getMeshDataSource(options, credentialsProvider, url); - } - } - throw e; - } + const canonicalUrl = `${url}|${options.url.scheme}:`; verifyObject(metadata); const redirect = verifyOptionalObjectProperty( metadata, @@ -1395,52 +1349,74 @@ export class PrecomputedDataSource extends DataSourceProvider { verifyString, ); if (redirect !== undefined) { - throw new RedirectError(redirect); + return { canonicalUrl, targetUrl: redirect }; } const t = verifyOptionalObjectProperty(metadata, "@type", verifyString); + let dataSource: DataSource; switch (t) { case "neuroglancer_skeletons": - return await getSkeletonsDataSource( - options, - credentialsProvider, + dataSource = await getSkeletonsDataSource( + sharedKvStoreContext, url, + progressOptions, ); + break; case "neuroglancer_multilod_draco": case "neuroglancer_legacy_mesh": - return await getMeshDataSource(options, credentialsProvider, url); - case "neuroglancer_annotations_v1": - return await getAnnotationDataSource( - options, - credentialsProvider, + dataSource = await getMeshDataSource( + sharedKvStoreContext, url, - metadata, + progressOptions, ); - case "neuroglancer_segment_properties": - return await getSegmentPropertyMapDataSource( - options, - credentialsProvider, + break; + case "neuroglancer_annotations_v1": + dataSource = getAnnotationDataSource( + sharedKvStoreContext, url, metadata, ); + break; + case "neuroglancer_segment_properties": + dataSource = getSegmentPropertyMapDataSource(metadata); + break; case "neuroglancer_multiscale_volume": case undefined: - return await getVolumeDataSource( - options, - credentialsProvider, + dataSource = await getVolumeDataSource( + sharedKvStoreContext, url, metadata, + progressOptions, ); + break; default: throw new Error(`Invalid type: ${JSON.stringify(t)}`); } + dataSource.canonicalUrl = canonicalUrl; + return dataSource; }, ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, - ); +} + +export class PrecomputedLegacyUrlDataSource extends KvStoreBasedDataSourceLegacyUrlAdapter { + constructor() { + super(new PrecomputedDataSource(), "precomputed"); } + + convertLegacyUrl(options: ConvertLegacyUrlOptions): string { + const { url, parameters } = parseProviderUrl(options.providerUrl); + if (options.type === "mesh") { + parameters.type = "mesh"; + } + return options.providerScheme + "://" + unparseProviderUrl(url, parameters); + } +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["info"]), { + suffix: "neuroglancer-precomputed:", + description: "Neuroglancer Precomputed data source", + }), + ); } diff --git a/src/datasource/precomputed/register_default.ts b/src/datasource/precomputed/register_default.ts index ae5ed2d680..154b42bb80 100644 --- a/src/datasource/precomputed/register_default.ts +++ b/src/datasource/precomputed/register_default.ts @@ -14,7 +14,17 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { PrecomputedDataSource } from "#src/datasource/precomputed/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { + PrecomputedDataSource, + PrecomputedLegacyUrlDataSource, + registerAutoDetect, +} from "#src/datasource/precomputed/frontend.js"; -registerProvider("precomputed", () => new PrecomputedDataSource()); +registerKvStoreBasedDataProvider(new PrecomputedDataSource()); +registerProvider(new PrecomputedLegacyUrlDataSource()); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/precomputed/sharded.ts b/src/datasource/precomputed/sharded.ts new file mode 100644 index 0000000000..55d9bc8b71 --- /dev/null +++ b/src/datasource/precomputed/sharded.ts @@ -0,0 +1,312 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import { + DataEncoding, + ShardingHashFunction, + type ShardingParameters, +} from "#src/datasource/precomputed/base.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + ByteRange, + DriverReadOptions, + FileHandle, + KvStoreWithPath, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { KvStoreFileHandle, readFileHandle } from "#src/kvstore/index.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { convertEndian64, Endianness } from "#src/util/endian.js"; +import { murmurHash3_x86_128Hash64Bits_Bigint } from "#src/util/hash.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const shardingHashFunctions: Map< + ShardingHashFunction, + (input: bigint) => bigint +> = new Map([ + [ + ShardingHashFunction.MURMURHASH3_X86_128, + (input) => murmurHash3_x86_128Hash64Bits_Bigint(/*seed=*/ 0, input), + ], + [ShardingHashFunction.IDENTITY, (input) => input], +]); + +export interface ShardInfo { + shardPath: string; + offset: number; +} + +interface DecodedMinishardIndex { + data: BigUint64Array; + shardPath: string; +} + +type MinishardIndexCache = SimpleAsyncCache< + bigint, + DecodedMinishardIndex | undefined +>; + +function decodeFileHandle(handle: FileHandle, encoding: DataEncoding) { + if (encoding === DataEncoding.GZIP) { + handle = new GzipFileHandle(handle, "gzip"); + } + return handle; +} + +function makeMinishardIndexCache( + chunkManager: ChunkManager, + base: KvStoreWithPath, + sharding: ShardingParameters, +): MinishardIndexCache { + return new SimpleAsyncCache(chunkManager.addRef(), { + encodeKey: (key) => key.toString(), + get: async ( + shardAndMinishard: bigint, + progressOptions: Partial, + ) => { + const minishard = + shardAndMinishard & ((1n << BigInt(sharding.minishardBits)) - 1n); + const shard = + ((1n << BigInt(sharding.shardBits)) - 1n) & + (shardAndMinishard >> BigInt(sharding.minishardBits)); + const shardPath = + base.path + + shard.toString(16).padStart(Math.ceil(sharding.shardBits / 4), "0") + + ".shard"; + + const shardFileHandle = new KvStoreFileHandle(base.store, shardPath); + + // Retrive minishard index start/end offsets. + const shardIndexSize = BigInt(16) << BigInt(sharding.minishardBits); + + // Multiply minishard by 16. + const shardIndexStart = minishard << 4n; + const response = await readFileHandle(shardFileHandle, { + ...progressOptions, + byteRange: { offset: Number(shardIndexStart), length: 16 }, + strictByteRange: true, + }); + if (response === undefined) { + return { data: undefined, size: 0 }; + } + const shardIndexResponse = await response.response.arrayBuffer(); + const shardIndexDv = new DataView(shardIndexResponse); + let minishardStartOffset = shardIndexDv.getBigUint64( + 0, + /*littleEndian=*/ true, + ); + let minishardEndOffset = shardIndexDv.getBigUint64( + 8, + /*littleEndian=*/ true, + ); + if (minishardStartOffset === minishardEndOffset) { + return { data: undefined, size: 0 }; + } + // The start/end offsets in the shard index are relative to the end of the shard + // index. + minishardStartOffset += shardIndexSize; + minishardEndOffset += shardIndexSize; + + const minishardIndexBuffer = await ( + await readFileHandle( + decodeFileHandle( + new FileByteRangeHandle(shardFileHandle, { + offset: Number(minishardStartOffset), + length: Number(minishardEndOffset - minishardStartOffset), + }), + sharding.minishardIndexEncoding, + ), + { + ...progressOptions, + strictByteRange: true, + throwIfMissing: true, + }, + ) + ).response.arrayBuffer(); + if (minishardIndexBuffer.byteLength % 24 !== 0) { + throw new Error( + `Invalid minishard index length: ${minishardIndexBuffer.byteLength}`, + ); + } + const minishardIndex = new BigUint64Array(minishardIndexBuffer); + convertEndian64(minishardIndex, Endianness.LITTLE); + + const minishardIndexSize = minishardIndex.byteLength / 24; + let prevEntryKey = 0n; + // Offsets in the minishard index are relative to the end of the shard index. + let prevStart = shardIndexSize; + for (let i = 0; i < minishardIndexSize; ++i) { + const entryKey = prevEntryKey + minishardIndex[i]; + prevEntryKey = minishardIndex[i] = entryKey; + const start = prevStart + minishardIndex[minishardIndexSize + i]; + minishardIndex[minishardIndexSize + i] = start; + const size = minishardIndex[2 * minishardIndexSize + i]; + const end = start + size; + prevStart = end; + minishardIndex[2 * minishardIndexSize + i] = end; + } + return { + data: { data: minishardIndex, shardPath }, + size: minishardIndex.byteLength, + }; + }, + }); +} + +function findMinishardEntry( + minishardIndex: DecodedMinishardIndex, + key: bigint, +): ByteRange | undefined { + const minishardIndexData = minishardIndex.data; + const minishardIndexSize = minishardIndexData.length / 3; + for (let i = 0; i < minishardIndexSize; ++i) { + if (minishardIndexData[i] !== key) { + continue; + } + const startOffset = minishardIndexData[minishardIndexSize + i]; + const endOffset = minishardIndexData[2 * minishardIndexSize + i]; + + return { + offset: Number(startOffset), + length: Number(endOffset - startOffset), + }; + } + return undefined; +} + +export class ShardedKvStore + extends RefCounted + implements ReadableKvStore +{ + private minishardIndexCache: Owned; + + constructor( + chunkManager: ChunkManager, + private base: KvStoreWithPath, + private sharding: ShardingParameters, + ) { + super(); + this.minishardIndexCache = this.registerDisposer( + makeMinishardIndexCache(chunkManager, base, sharding), + ); + } + + getUrl(key: bigint): string { + return `chunk ${key} in ${this.base.store.getUrl(this.base.path)}`; + } + + async findKey( + key: bigint, + progressOptions: Partial, + ): Promise<{ minishardEntry: ByteRange; shardInfo: ShardInfo } | undefined> { + const { sharding } = this; + const hashFunction = shardingHashFunctions.get(sharding.hash)!; + const hashCode = hashFunction(key >> BigInt(sharding.preshiftBits)); + const shardAndMinishard = + hashCode & + ((1n << BigInt(sharding.minishardBits + sharding.shardBits)) - 1n); + const minishardIndex = await this.minishardIndexCache.get( + shardAndMinishard, + progressOptions, + ); + if (minishardIndex === undefined) return undefined; + const minishardEntry = findMinishardEntry(minishardIndex, key); + if (minishardEntry === undefined) return undefined; + return { + minishardEntry, + shardInfo: { + shardPath: minishardIndex.shardPath, + offset: minishardEntry.offset, + }, + }; + } + + async readWithShardInfo( + key: bigint, + options: DriverReadOptions, + ): Promise< + | { + response: ReadResponse; + shardInfo: ShardInfo; + } + | undefined + > { + const { sharding } = this; + const findResult = await this.findKey(key, options); + if (findResult === undefined) return undefined; + const { minishardEntry, shardInfo } = findResult; + return { + response: (await decodeFileHandle( + new FileByteRangeHandle( + new KvStoreFileHandle(this.base.store, shardInfo.shardPath), + minishardEntry, + ), + sharding.dataEncoding, + ).read(options))!, + shardInfo, + }; + } + + async stat( + key: bigint, + options: StatOptions, + ): Promise { + const findResult = await this.findKey(key, options); + if (findResult === undefined) return undefined; + const { sharding } = this; + if (sharding.dataEncoding !== DataEncoding.RAW) { + return { totalSize: undefined }; + } else { + return { totalSize: findResult.minishardEntry.length }; + } + } + + async read( + key: bigint, + options: DriverReadOptions, + ): Promise { + const response = await this.readWithShardInfo(key, options); + if (response === undefined) return undefined; + return response.response; + } + + get supportsOffsetReads() { + return this.sharding.dataEncoding === DataEncoding.RAW; + } + get supportsSuffixReads() { + return this.sharding.dataEncoding === DataEncoding.RAW; + } +} + +export function getShardedKvStoreIfApplicable( + chunkSource: RefCounted & { + chunkManager: ChunkManager; + }, + base: KvStoreWithPath, + sharding: ShardingParameters | undefined, +) { + if (sharding === undefined) return undefined; + return chunkSource.registerDisposer( + new ShardedKvStore(chunkSource.chunkManager, base, sharding), + ); +} diff --git a/src/datasource/python/backend.ts b/src/datasource/python/backend.ts index a947a19311..988e7533be 100644 --- a/src/datasource/python/backend.ts +++ b/src/datasource/python/backend.ts @@ -55,7 +55,7 @@ export class PythonVolumeChunkSource extends WithParameters( chunkDecoder = chunkDecoders.get(this.parameters["encoding"])!; encoding = VolumeChunkEncoding[this.parameters.encoding].toLowerCase(); - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; let path = `../../neuroglancer/${this.encoding}/${parameters.key}/${parameters.scaleKey}`; { @@ -71,9 +71,9 @@ export class PythonVolumeChunkSource extends WithParameters( } } const response = await fetchOk(new URL(path, parameters.baseUrl).href, { - signal: abortSignal, + signal: signal, }); - await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -105,13 +105,13 @@ export class PythonMeshSource extends WithParameters( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, abortSignal: AbortSignal) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/mesh/${parameters.key}/${ chunk.manifestChunk!.objectId }`; return fetchOk(new URL(requestPath, parameters.baseUrl).href, { - signal: abortSignal, + signal: signal, }) .then((response) => response.arrayBuffer()) .then((response) => decodeFragmentChunk(chunk, response)); @@ -123,11 +123,11 @@ export class PythonSkeletonSource extends WithParameters( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, abortSignal: AbortSignal) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/skeleton/${parameters.key}/${chunk.objectId}`; return fetchOk(new URL(requestPath, parameters.baseUrl).href, { - signal: abortSignal, + signal: signal, }) .then((response) => response.arrayBuffer()) .then((response) => diff --git a/src/datasource/python/frontend.ts b/src/datasource/python/frontend.ts index dbd188502b..a417a68e30 100644 --- a/src/datasource/python/frontend.ts +++ b/src/datasource/python/frontend.ts @@ -65,7 +65,6 @@ import { VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; -import { Borrowed, Owned } from "#src/util/disposable.js"; import { fetchOk } from "#src/util/http_request.js"; import { parseFixedLengthArray, @@ -94,20 +93,18 @@ function WithPythonDataSource< >, >(Base: TBase) { type Options = InstanceType["OPTIONS"] & { - dataSource: Borrowed; + dataSource: PythonDataSource; generation: number; }; class C extends Base { declare OPTIONS: Options; - dataSource: Owned; + dataSource: PythonDataSource; generation: number; declare parameters: PythonSourceParameters; constructor(...args: any[]) { super(...args); const options: Options = args[1]; - const dataSource = (this.dataSource = this.registerDisposer( - options.dataSource.addRef(), - )); + const dataSource = (this.dataSource = options.dataSource); this.generation = options.generation; const key = options.parameters.key; dataSource.registerSource(key, this); @@ -238,7 +235,7 @@ export class PythonMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSour // TODO(jbms): Properly handle reference counting of `dataSource`. constructor( - public dataSource: Borrowed, + public dataSource: PythonDataSource, chunkManager: ChunkManager, public key: string, public response: any, @@ -480,17 +477,19 @@ function getVolumeDataSource( options: GetDataSourceOptions, key: string, ) { - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "python:VolumeDataSource", key }, - async () => { + options, + async (progressOptions) => { const response = await ( await fetchOk( new URL(`../../neuroglancer/info/${key}`, window.location.href).href, + progressOptions, ) ).json(); const volume = new PythonMultiscaleVolumeChunkSource( dataSourceProvider, - options.chunkManager, + options.registry.chunkManager, key, response, ); @@ -527,14 +526,17 @@ function getVolumeDataSource( default: true, subsourceToModelSubspaceTransform, subsource: { - mesh: options.chunkManager.getChunkSource(PythonMeshSource, { - dataSource: dataSourceProvider, - generation: volume.generation, - parameters: { - baseUrl: window.location.href, - key: key, + mesh: options.registry.chunkManager.getChunkSource( + PythonMeshSource, + { + dataSource: dataSourceProvider, + generation: volume.generation, + parameters: { + baseUrl: window.location.href, + key: key, + }, }, - }), + ), }, }); } @@ -548,15 +550,17 @@ function getSkeletonDataSource( options: GetDataSourceOptions, key: string, ) { - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "python:SkeletonDataSource", key }, - async () => { + options, + async (progressOptions) => { const response = await ( await fetchOk( new URL( `../../neuroglancer/skeletoninfo/${key}`, window.location.href, ).href, + progressOptions, ) ).json(); const { baseModelSpace, subsourceToModelTransform } = @@ -567,7 +571,7 @@ function getSkeletonDataSource( (x) => verifyObjectAsMap(x, parseVertexAttributeInfo), ); const generation = verifyObjectProperty(response, "generation", (x) => x); - const skeletonSource = options.chunkManager.getChunkSource( + const skeletonSource = options.registry.chunkManager.getChunkSource( PythonSkeletonSource, { dataSource: dataSourceProvider, @@ -597,10 +601,14 @@ function getSkeletonDataSource( ); } -export class PythonDataSource extends DataSourceProvider { +export class PythonDataSource implements DataSourceProvider { private sources = new Map>(); sourceGenerations = new Map(); + get scheme() { + return "python"; + } + registerSource(key: string, source: PythonChunkSource) { let existingSet = this.sources.get(key); if (existingSet === undefined) { diff --git a/src/datasource/python/register_default.ts b/src/datasource/python/register_default.ts new file mode 100644 index 0000000000..d70ae3dfdb --- /dev/null +++ b/src/datasource/python/register_default.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { registerProvider } from "#src/datasource/default_provider.js"; +import { PythonDataSource } from "#src/datasource/python/frontend.js"; + +registerProvider(new PythonDataSource()); diff --git a/src/datasource/render/backend.ts b/src/datasource/render/backend.ts index 97b5176cd4..bd78682201 100644 --- a/src/datasource/render/backend.ts +++ b/src/datasource/render/backend.ts @@ -31,15 +31,11 @@ import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); chunkDecoders.set( "jpg", - async ( - chunk: VolumeChunk, - abortSignal: AbortSignal, - response: ArrayBuffer, - ) => { + async (chunk: VolumeChunk, signal: AbortSignal, response: ArrayBuffer) => { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - abortSignal, + signal, [response], new Uint8Array(response), undefined, @@ -48,11 +44,11 @@ chunkDecoders.set( 3, true, ); - await postProcessRawData(chunk, abortSignal, decoded); + await postProcessRawData(chunk, signal, decoded); }, ); -chunkDecoders.set("raw16", (chunk, abortSignal, response) => { - return decodeRawChunk(chunk, abortSignal, response, Endianness.BIG); +chunkDecoders.set("raw16", (chunk, signal, response) => { + return decodeRawChunk(chunk, signal, response, Endianness.BIG); }); @registerSharedObject() @@ -91,7 +87,7 @@ export class TileChunkSource extends WithParameters( return query_params.join("&"); })(); - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; const { chunkGridPosition } = chunk; @@ -122,8 +118,8 @@ export class TileChunkSource extends WithParameters( const path = `/render-ws/v1/owner/${parameters.owner}/project/${parameters.project}/stack/${parameters.stack}/z/${chunkPosition[2]}/box/${chunkPosition[0]},${chunkPosition[1]},${xTileSize},${yTileSize},${scale}/${imageMethod}`; const response = await fetchOk( `${parameters.baseUrl}${path}?${this.queryString}`, - { signal: abortSignal }, + { signal: signal }, ); - await this.chunkDecoder(chunk, abortSignal, await response.arrayBuffer()); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } diff --git a/src/datasource/render/frontend.ts b/src/datasource/render/frontend.ts index 6fd9b0225d..46d700430e 100644 --- a/src/datasource/render/frontend.ts +++ b/src/datasource/render/frontend.ts @@ -32,8 +32,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { TileChunkSourceParameters } from "#src/datasource/render/base.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; @@ -64,6 +64,7 @@ import { verifyOptionalString, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; const VALID_ENCODINGS = new Set(["jpg", "raw16"]); @@ -505,11 +506,13 @@ export function getOwnerInfo( chunkManager: ChunkManager, hostname: string, owner: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "render:getOwnerInfo", hostname, owner }, - () => - fetchOk(`${hostname}/render-ws/v1/owner/${owner}/stacks`) + options, + (progressOptions) => + fetchOk(`${hostname}/render-ws/v1/owner/${owner}/stacks`, progressOptions) .then((response) => response.json()) .then(parseOwnerInfo), ); @@ -519,7 +522,11 @@ const pathPattern = /^([^/?]+)(?:\/([^/?]+))?(?:\/([^/?]+))(?:\/([^/?]*))?(?:\?(.*))?$/; const urlPattern = /^((?:(?:(?:http|https):\/\/[^,/]+)[^/?]))\/(.*)$/; -function getVolume(chunkManager: ChunkManager, datasourcePath: string) { +function getVolume( + chunkManager: ChunkManager, + datasourcePath: string, + options: Partial, +) { let hostname: string; let path: string; { @@ -543,10 +550,16 @@ function getVolume(chunkManager: ChunkManager, datasourcePath: string) { const parameters = parseQueryStringParameters(match[5] || ""); - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "render:MultiscaleVolumeChunkSource", hostname, path }, - async () => { - const ownerInfo = await getOwnerInfo(chunkManager, hostname, owner); + options, + async (progressOptions) => { + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + owner, + progressOptions, + ); const volume = new RenderMultiscaleVolumeChunkSource( chunkManager, hostname, @@ -599,6 +612,7 @@ export async function stackAndProjectCompleter( chunkManager: ChunkManager, hostname: string, path: string, + options: Partial, ): Promise { const stackMatch = path.match( /^(?:([^/]+)(?:\/([^/]*))?(?:\/([^/]*))?(\/.*?)?)?$/, @@ -613,7 +627,12 @@ export async function stackAndProjectCompleter( } if (stackMatch[3] === undefined) { const projectPrefix = stackMatch[2] || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const completions = getPrefixMatchesWithDescriptions( projectPrefix, ownerInfo.projects, @@ -624,7 +643,12 @@ export async function stackAndProjectCompleter( } if (stackMatch[4] === undefined) { const stackPrefix = stackMatch[3] || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const projectInfo = ownerInfo.projects.get(stackMatch[2]); if (projectInfo === undefined) { throw null; @@ -643,7 +667,12 @@ export async function stackAndProjectCompleter( }; } const channelPrefix = stackMatch[4].substr(1) || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const projectInfo = ownerInfo.projects.get(stackMatch[2]); if (projectInfo === undefined) { throw null; @@ -673,6 +702,7 @@ export async function stackAndProjectCompleter( export async function volumeCompleter( url: string, chunkManager: ChunkManager, + options: Partial, ): Promise { const match = url.match(urlPattern); if (match === null) { @@ -686,18 +716,30 @@ export async function volumeCompleter( chunkManager, hostname, path, + options, ); return applyCompletionOffset(match![1].length + 1, completions); } -export class RenderDataSource extends DataSourceProvider { +export class RenderDataSource implements DataSourceProvider { + get scheme() { + return "render"; + } get description() { return "Render"; } get(options: GetDataSourceOptions): Promise { - return getVolume(options.chunkManager, options.providerUrl); + return getVolume( + options.registry.chunkManager, + options.providerUrl, + options, + ); } completeUrl(options: CompleteUrlOptions) { - return volumeCompleter(options.providerUrl, options.chunkManager); + return volumeCompleter( + options.providerUrl, + options.registry.chunkManager, + options, + ); } } diff --git a/src/datasource/render/register_default.ts b/src/datasource/render/register_default.ts index ae5a9241a0..3c4f1c8d27 100644 --- a/src/datasource/render/register_default.ts +++ b/src/datasource/render/register_default.ts @@ -17,4 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { RenderDataSource } from "#src/datasource/render/frontend.js"; -registerProvider("render", () => new RenderDataSource()); +registerProvider(new RenderDataSource()); diff --git a/src/datasource/state_share.ts b/src/datasource/state_share.ts index 376ad438cd..27f3184872 100644 --- a/src/datasource/state_share.ts +++ b/src/datasource/state_share.ts @@ -1,10 +1,6 @@ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { HttpKvStore } from "#src/kvstore/http/index.js"; import { StatusMessage } from "#src/status.js"; import { RefCounted } from "#src/util/disposable.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Viewer } from "#src/viewer.js"; import { makeIcon } from "#src/widget/icon.js"; @@ -77,24 +73,32 @@ export class StateShare extends RefCounted { const selectedStateServer = this.selectStateServerElement ? this.selectStateServerElement.value : Object.values(STATE_SERVERS)[0].url; - const protocol = new URL(selectedStateServer).protocol; - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - selectedStateServer, - defaultCredentialsManager, - ); + + const { store, path } = + viewer.dataSourceProvider.sharedKvStoreContext.kvStoreContext.getKvStore( + selectedStateServer, + ); + + if (!(store instanceof HttpKvStore)) { + throw new Error( + `Non-HTTP protocol not supported: ${selectedStateServer}`, + ); + } StatusMessage.forPromise( - fetchSpecialOk(credentialsProvider, parsedUrl, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(viewer.state.toJSON()), - }) + store + .fetchOkImpl(store.baseUrl + path, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(viewer.state.toJSON()), + }) .then((response) => response.json()) .then((res) => { const stateUrlProtcol = new URL(res).protocol; const stateUrlWithoutProtocol = res.substring( stateUrlProtcol.length, ); + const protocol = new URL(selectedStateServer).protocol; const link = `${window.location.origin}/#!${protocol}${stateUrlWithoutProtocol}`; navigator.clipboard.writeText(link).then(() => { StatusMessage.showTemporaryMessage( diff --git a/src/datasource/vtk/backend.ts b/src/datasource/vtk/backend.ts index b2f1f3f586..a3fd399fdc 100644 --- a/src/datasource/vtk/backend.ts +++ b/src/datasource/vtk/backend.ts @@ -16,19 +16,28 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import { parseVTKFromArrayBuffer } from "#src/async_computation/vtk_mesh_request.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import type { SingleMesh } from "#src/single_mesh/backend.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; import { DataType } from "#src/util/data_type.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** - * This needs to be a global function, because it identifies the instance of GenericSharedDataSource + * This needs to be a global function, because it identifies the instance of SimpleAsyncCache * to use. */ -function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { +async function parse( + readResponse: ReadResponse | undefined, + progressOptions: Partial, +) { + if (readResponse === undefined) { + throw new Error("Not found"); + } + const buffer = await readResponse.response.arrayBuffer(); return requestAsyncComputation( parseVTKFromArrayBuffer, - abortSignal, + progressOptions.signal, [buffer], buffer, ); @@ -36,33 +45,31 @@ function parse(buffer: ArrayBuffer, abortSignal: AbortSignal) { registerSingleMeshFactory("vtk", { description: "VTK", - getMesh: (chunkManager, credentialsProvider, url, getPriority, abortSignal) => - GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - parse, + getMesh: async (sharedKvStoreContext, url, options) => { + const mesh = await getCachedDecodedUrl( + sharedKvStoreContext, url, - getPriority, - abortSignal, - ).then((mesh) => { - const result: SingleMesh = { - info: { - numTriangles: mesh.numTriangles, - numVertices: mesh.numVertices, - vertexAttributes: [], - }, - indices: mesh.indices, - vertexPositions: mesh.vertexPositions, + parse, + options, + ); + const result: SingleMesh = { + info: { + numTriangles: mesh.numTriangles, + numVertices: mesh.numVertices, vertexAttributes: [], - }; - for (const attribute of mesh.vertexAttributes) { - result.info.vertexAttributes.push({ - name: attribute.name, - dataType: DataType.FLOAT32, - numComponents: attribute.numComponents, - }); - result.vertexAttributes.push(attribute.data); - } - return result; - }), + }, + indices: mesh.indices, + vertexPositions: mesh.vertexPositions, + vertexAttributes: [], + }; + for (const attribute of mesh.vertexAttributes) { + result.info.vertexAttributes.push({ + name: attribute.name, + dataType: DataType.FLOAT32, + numComponents: attribute.numComponents, + }); + result.vertexAttributes.push(attribute.data); + } + return result; + }, }); diff --git a/src/datasource/vtk/frontend.ts b/src/datasource/vtk/frontend.ts index ce59208e64..824773c572 100644 --- a/src/datasource/vtk/frontend.ts +++ b/src/datasource/vtk/frontend.ts @@ -19,24 +19,30 @@ import { makeIdentityTransform, } from "#src/coordinate_transform.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -export class VtkDataSource extends DataSourceProvider { +export class VtkDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "vtk"; + } get description() { - return "VTK mesh file"; + return "VTK mesh"; + } + get singleFile() { + return true; } - async get(options: GetDataSourceOptions): Promise { + async get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); const meshSource = await getSingleMeshSource( - options.chunkManager, - options.credentialsManager, - options.url, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + options, ); const modelSpace = makeCoordinateSpace({ rank: 3, @@ -56,11 +62,4 @@ export class VtkDataSource extends DataSourceProvider { }; return dataSource; } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, - ); - } } diff --git a/src/datasource/vtk/register_default.ts b/src/datasource/vtk/register_default.ts index 3c3b4e571f..e960750f7b 100644 --- a/src/datasource/vtk/register_default.ts +++ b/src/datasource/vtk/register_default.ts @@ -14,7 +14,13 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; +import { + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; import { VtkDataSource } from "#src/datasource/vtk/frontend.js"; -registerProvider("vtk", () => new VtkDataSource()); +const provider = new VtkDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/datasource/zarr/backend.ts b/src/datasource/zarr/backend.ts index bbcbdda792..7370f7af0e 100644 --- a/src/datasource/zarr/backend.ts +++ b/src/datasource/zarr/backend.ts @@ -20,7 +20,6 @@ import "#src/datasource/zarr/codec/bytes/decode.js"; import "#src/datasource/zarr/codec/crc32c/decode.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; import { applySharding, @@ -30,30 +29,24 @@ import "#src/datasource/zarr/codec/gzip/decode.js"; import "#src/datasource/zarr/codec/sharding_indexed/decode.js"; import "#src/datasource/zarr/codec/transpose/decode.js"; import { ChunkKeyEncoding } from "#src/datasource/zarr/metadata/index.js"; -import { getSpecialProtocolKvStore } from "#src/kvstore/special/index.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @registerSharedObject() export class ZarrVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { private chunkKvStore = applySharding( this.chunkManager, this.parameters.metadata.codecs, - getSpecialProtocolKvStore( - this.credentialsProvider, - this.parameters.url + "/", - ), + this.sharedKvStoreContext.kvStoreContext.getKvStore(this.parameters.url), ); - async download(chunk: VolumeChunk, abortSignal: AbortSignal) { + async download(chunk: VolumeChunk, signal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const { parameters } = this; const { chunkGridPosition } = chunk; @@ -93,15 +86,15 @@ export class ZarrVolumeChunkSource extends WithParameters( const { chunkKvStore } = this; const response = await chunkKvStore.kvStore.read( chunkKvStore.getChunkKey(chunkGridPosition, baseKey), - { abortSignal }, + { signal }, ); if (response !== undefined) { const decoded = await decodeArray( chunkKvStore.decodeCodecs, - response.data, - abortSignal, + new Uint8Array(await response.response.arrayBuffer()), + signal, ); - await postProcessRawData(chunk, abortSignal, decoded); + await postProcessRawData(chunk, signal, decoded); } } } diff --git a/src/datasource/zarr/codec/blosc/decode.ts b/src/datasource/zarr/codec/blosc/decode.ts index a6c47d725a..6931f9c8dc 100644 --- a/src/datasource/zarr/codec/blosc/decode.ts +++ b/src/datasource/zarr/codec/blosc/decode.ts @@ -23,11 +23,11 @@ import { CodecKind } from "#src/datasource/zarr/codec/index.js"; registerCodec({ name: "blosc", kind: CodecKind.bytesToBytes, - decode(configuration: Configuration, encoded, abortSignal: AbortSignal) { + decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; return requestAsyncComputation( decodeBlosc, - abortSignal, + signal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/codec/bytes/decode.ts b/src/datasource/zarr/codec/bytes/decode.ts index e38c163a0f..d94353e097 100644 --- a/src/datasource/zarr/codec/bytes/decode.ts +++ b/src/datasource/zarr/codec/bytes/decode.ts @@ -28,9 +28,9 @@ registerCodec({ configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded, - abortSignal: AbortSignal, + signal: AbortSignal, ) { - abortSignal; + signal; const { dataType, chunkShape } = decodedArrayInfo; const numElements = chunkShape.reduce((a, b) => a * b, 1); const bytesPerElement = DATA_TYPE_BYTES[dataType]; diff --git a/src/datasource/zarr/codec/crc32c/decode.ts b/src/datasource/zarr/codec/crc32c/decode.ts index f225f18cee..6cf60c8c01 100644 --- a/src/datasource/zarr/codec/crc32c/decode.ts +++ b/src/datasource/zarr/codec/crc32c/decode.ts @@ -23,13 +23,9 @@ const checksumSize = 4; registerCodec({ name: "crc32c", kind: CodecKind.bytesToBytes, - async decode( - configuration: Configuration, - encoded, - abortSignal: AbortSignal, - ) { + async decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; - abortSignal; + signal; if (encoded.length < checksumSize) { throw new Error( `Expected buffer of size at least ${checksumSize} bytes but received: ${encoded.length} bytes`, diff --git a/src/datasource/zarr/codec/decode.ts b/src/datasource/zarr/codec/decode.ts index dcc4726e0b..2cc3ea9184 100644 --- a/src/datasource/zarr/codec/decode.ts +++ b/src/datasource/zarr/codec/decode.ts @@ -20,7 +20,7 @@ import type { CodecChainSpec, } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { ReadableKvStore } from "#src/kvstore/index.js"; +import type { KvStoreWithPath, ReadableKvStore } from "#src/kvstore/index.js"; import type { RefCounted } from "#src/util/disposable.js"; export interface Codec { @@ -34,7 +34,7 @@ export interface ArrayToArrayCodec extends Codec { configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: ArrayBufferView, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise>; } @@ -44,7 +44,7 @@ export interface ArrayToBytesCodec extends Codec { configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded: Uint8Array, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise>; } @@ -67,7 +67,7 @@ export interface BytesToBytesCodec extends Codec { decode( configuration: Configuration, encoded: Uint8Array, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise>; } @@ -95,7 +95,7 @@ export function registerCodec( export async function decodeArray( codecs: CodecChainSpec, encoded: Uint8Array, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise> { const bytesToBytes = codecs[CodecKind.bytesToBytes]; for (let i = bytesToBytes.length; i--; ) { @@ -104,7 +104,7 @@ export async function decodeArray( if (impl === undefined) { throw new Error(`Unsupported codec: ${JSON.stringify(codec.name)}`); } - encoded = await impl.decode(codec.configuration, encoded, abortSignal); + encoded = await impl.decode(codec.configuration, encoded, signal); } let decoded: ArrayBufferView; @@ -118,7 +118,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[codecs.arrayInfo.length - 1], encoded, - abortSignal, + signal, ); } @@ -133,7 +133,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[i], decoded, - abortSignal, + signal, ); } @@ -143,7 +143,7 @@ export async function decodeArray( export function applySharding( chunkManager: ChunkManager, codecs: CodecChainSpec, - baseKvStore: ReadableKvStore, + baseKvStore: KvStoreWithPath, ): { kvStore: ReadableKvStore; getChunkKey: ( @@ -152,7 +152,7 @@ export function applySharding( ) => unknown; decodeCodecs: CodecChainSpec; } { - let kvStore: ReadableKvStore = baseKvStore; + let kvStore: ReadableKvStore = baseKvStore.store; let curCodecs = codecs; while (true) { const { shardingInfo } = curCodecs; @@ -172,11 +172,13 @@ export function applySharding( const decodeCodecs = curCodecs; + const pathPrefix = baseKvStore.path; + function getChunkKey( chunkGridPosition: ArrayLike, baseKey: string, ): unknown { - let key: unknown = baseKey; + let key: unknown = pathPrefix + baseKey; const rank = chunkGridPosition.length; let curCodecs = codecs; while (curCodecs.shardingInfo !== undefined) { diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 75a713416e..f2f9263df7 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -26,14 +26,10 @@ for (const [name, compressionFormat] of [ registerCodec({ name, kind: CodecKind.bytesToBytes, - async decode( - configuration: Configuration, - encoded, - abortSignal: AbortSignal, - ) { + async decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; return new Uint8Array( - await decodeGzip(encoded, compressionFormat, abortSignal), + await decodeGzip(encoded, compressionFormat, signal), ); }, }); diff --git a/src/datasource/zarr/codec/sharding_indexed/decode.ts b/src/datasource/zarr/codec/sharding_indexed/decode.ts index 68ad0adf39..dbcb08bdaf 100644 --- a/src/datasource/zarr/codec/sharding_indexed/decode.ts +++ b/src/datasource/zarr/codec/sharding_indexed/decode.ts @@ -21,27 +21,80 @@ import { registerCodec, } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { Configuration } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import type { + Configuration, + IndexConfiguration, +} from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; import { ShardIndexLocation } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; import type { ByteRangeRequest, ReadableKvStore, - ReadOptions, + DriverReadOptions, ReadResponse, + StatResponse, + StatOptions, + ByteRange, } from "#src/kvstore/index.js"; -import { composeByteRangeRequest } from "#src/kvstore/index.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; type ShardIndex = BigUint64Array | undefined; const MISSING_VALUE = BigInt("18446744073709551615"); +type ShardIndexCache = SimpleAsyncCache; + +function makeIndexCache( + chunkManager: ChunkManager, + base: ReadableKvStore, + configuration: IndexConfiguration, +): ShardIndexCache { + return new SimpleAsyncCache(chunkManager.addRef(), { + get: async (key: BaseKey, progressOptions: ProgressOptions) => { + const { indexCodecs } = configuration; + const encodedSize = + indexCodecs.encodedSize[indexCodecs.encodedSize.length - 1]; + let byteRange: ByteRangeRequest; + switch (configuration.indexLocation) { + case ShardIndexLocation.START: + byteRange = { offset: 0, length: encodedSize! }; + break; + case ShardIndexLocation.END: + byteRange = { suffixLength: encodedSize! }; + break; + } + const response = await base.read(key, { + ...progressOptions, + byteRange, + }); + if (response === undefined) { + return { size: 0, data: undefined }; + } + const index = await decodeArray( + configuration.indexCodecs, + new Uint8Array(await response.response.arrayBuffer()), + progressOptions.signal, + ); + return { + size: index.byteLength, + data: new BigUint64Array( + index.buffer, + index.byteOffset, + index.byteLength / 8, + ), + }; + }, + }); +} + class ShardedKvStore extends RefCounted implements ReadableKvStore<{ base: BaseKey; subChunk: number[] }> { - private indexCache: Owned>; + private indexCache: Owned>; private indexStrides: number[]; constructor( private configuration: Configuration, @@ -50,42 +103,7 @@ class ShardedKvStore ) { super(); this.indexCache = this.registerDisposer( - new SimpleAsyncCache(chunkManager.addRef(), { - get: async (key: BaseKey, abortSignal: AbortSignal) => { - const { indexCodecs } = configuration; - const encodedSize = - indexCodecs.encodedSize[indexCodecs.encodedSize.length - 1]; - let byteRange: ByteRangeRequest; - switch (configuration.indexLocation) { - case ShardIndexLocation.START: - byteRange = { offset: 0, length: encodedSize! }; - break; - case ShardIndexLocation.END: - byteRange = { suffixLength: encodedSize! }; - break; - } - const response = await base.read(key, { - abortSignal, - byteRange, - }); - if (response === undefined) { - return { size: 0, data: undefined }; - } - const index = await decodeArray( - configuration.indexCodecs, - response.data, - abortSignal, - ); - return { - size: index.byteLength, - data: new BigUint64Array( - index.buffer, - index.byteOffset, - index.byteLength / 8, - ), - }; - }, - }), + makeIndexCache(chunkManager, base, configuration), ); const { subChunkGridShape } = this.configuration; const rank = subChunkGridShape.length; @@ -105,11 +123,14 @@ class ShardedKvStore } } - async read( - key: { base: BaseKey; subChunk: number[] }, - options: ReadOptions, - ): Promise { - const shardIndex = await this.indexCache.get(key.base, options.abortSignal); + private async findKey( + key: { + base: BaseKey; + subChunk: number[]; + }, + progressOptions: Partial, + ): Promise { + const shardIndex = await this.indexCache.get(key.base, progressOptions); if (shardIndex === undefined) { // Shard not present. return undefined; @@ -128,42 +149,42 @@ class ShardedKvStore // Sub-chunk not present. return undefined; } - const fullByteRange = { + return { offset: Number(dataOffset), length: Number(dataLength), }; - const { outer: outerByteRange, inner: innerByteRange } = - composeByteRangeRequest(fullByteRange, options.byteRange); - if (outerByteRange.length === 0) { - return { - data: new Uint8Array(0), - dataRange: innerByteRange, - totalSize: fullByteRange.length, - }; - } - const response = await this.base.read(key.base, { - abortSignal: options.abortSignal, - byteRange: outerByteRange, - }); - if (response === undefined) { - // Shard unexpectedly deleted. - return undefined; - } - if ( - response.dataRange.offset !== outerByteRange.offset || - response.dataRange.length !== outerByteRange.length - ) { - throw new Error( - `Received truncated response, expected ${JSON.stringify( - outerByteRange, - )} but received ${JSON.stringify(response.dataRange)}`, - ); - } - return { - data: response.data, - dataRange: innerByteRange, - totalSize: fullByteRange.length, - }; + } + + async stat( + key: { base: BaseKey; subChunk: number[] }, + options: StatOptions, + ): Promise { + const fullByteRange = await this.findKey(key, options); + if (fullByteRange === undefined) return undefined; + return { totalSize: fullByteRange.length }; + } + + async read( + key: { base: BaseKey; subChunk: number[] }, + options: DriverReadOptions, + ): Promise { + const fullByteRange = await this.findKey(key, options); + if (fullByteRange === undefined) return undefined; + return new FileByteRangeHandle( + new KvStoreFileHandle(this.base, key.base), + fullByteRange, + ).read(options); + } + + getUrl(key: { base: BaseKey; subChunk: number[] }): string { + return `subchunk ${JSON.stringify(key.subChunk)} within shard ${this.base.getUrl(key.base)}`; + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; } } diff --git a/src/datasource/zarr/codec/sharding_indexed/resolve.ts b/src/datasource/zarr/codec/sharding_indexed/resolve.ts index 58fd2212d5..53aa858d02 100644 --- a/src/datasource/zarr/codec/sharding_indexed/resolve.ts +++ b/src/datasource/zarr/codec/sharding_indexed/resolve.ts @@ -38,9 +38,12 @@ export enum ShardIndexLocation { END, } -export interface Configuration { +export interface IndexConfiguration { indexCodecs: CodecChainSpec; indexLocation: ShardIndexLocation; +} + +export interface Configuration extends IndexConfiguration { subChunkCodecs: CodecChainSpec; subChunkShape: number[]; subChunkGridShape: number[]; diff --git a/src/datasource/zarr/codec/transpose/decode.ts b/src/datasource/zarr/codec/transpose/decode.ts index 6eafd6bb90..3b15e228a6 100644 --- a/src/datasource/zarr/codec/transpose/decode.ts +++ b/src/datasource/zarr/codec/transpose/decode.ts @@ -26,10 +26,10 @@ registerCodec({ configuration: Configuration, decodedArrayInfo: CodecArrayInfo, encoded, - abortSignal: AbortSignal, + signal: AbortSignal, ) { decodedArrayInfo; - abortSignal; + signal; configuration; return encoded; }, diff --git a/src/datasource/zarr/codec/zstd/decode.ts b/src/datasource/zarr/codec/zstd/decode.ts index eed9654ab7..157ebf7a57 100644 --- a/src/datasource/zarr/codec/zstd/decode.ts +++ b/src/datasource/zarr/codec/zstd/decode.ts @@ -23,11 +23,11 @@ import type { Configuration } from "#src/datasource/zarr/codec/zstd/resolve.js"; registerCodec({ name: "zstd", kind: CodecKind.bytesToBytes, - decode(configuration: Configuration, encoded, abortSignal: AbortSignal) { + decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; return requestAsyncComputation( decodeZstd, - abortSignal, + signal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/frontend.ts b/src/datasource/zarr/frontend.ts index 8cb1ee27e3..3060a75fe6 100644 --- a/src/datasource/zarr/frontend.ts +++ b/src/datasource/zarr/frontend.ts @@ -18,7 +18,6 @@ import "#src/datasource/zarr/codec/blosc/resolve.js"; import "#src/datasource/zarr/codec/zstd/resolve.js"; import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { CoordinateSpace } from "#src/coordinate_transform.js"; import { @@ -26,13 +25,12 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { getKvStorePathCompletions } from "#src/datasource/kvstore_completions.js"; import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; import "#src/datasource/zarr/codec/bytes/resolve.js"; import "#src/datasource/zarr/codec/crc32c/resolve.js"; @@ -53,6 +51,16 @@ import { } from "#src/datasource/zarr/metadata/parse.js"; import type { OmeMultiscaleMetadata } from "#src/datasource/zarr/ome.js"; import { parseOmeMetadata } from "#src/datasource/zarr/ome.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { CompletionResult } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + kvstoreEnsureDirectoryPipelineUrl, + parseUrlSuffix, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -69,27 +77,17 @@ import { applyCompletionOffset, completeQueryStringParametersFromTable, } from "#src/util/completion.js"; -import type { Borrowed } from "#src/util/disposable.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError } from "#src/util/http_request.js"; import { parseQueryStringParameters, verifyObject, verifyOptionalObjectProperty, } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; class ZarrVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} @@ -109,11 +107,10 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } constructor( - chunkManager: Borrowed, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public multiscale: ZarrMultiscaleInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); this.volumeType = VolumeType.IMAGE; } @@ -160,7 +157,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou chunkSource: this.chunkManager.getChunkSource( ZarrVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { url: scale.url, @@ -177,25 +174,27 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } function getJsonResource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + description: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "zarr:json", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - try { - return await fetchSpecialOk(credentialsProvider, url, {}).then( - (response) => response.json(), - ); - } catch (e) { - if (isNotFoundError(e)) return undefined; - throw e; - } + options, + async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Reading ${description} from ${url}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read( + url, + options, + ); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -294,26 +293,19 @@ function getMultiscaleInfoForSingleArray( } async function resolveOmeMultiscale( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, multiscale: OmeMultiscaleMetadata, options: { explicitDimensionSeparator: DimensionSeparator | undefined; zarrVersion: 2 | 3; - }, + } & Partial, ): Promise { const scaleZarrMetadata = await Promise.all( multiscale.scales.map(async (scale) => { - const metadata = await getMetadata( - chunkManager, - credentialsProvider, - scale.url, - { - zarrVersion: options.zarrVersion, - expectedNodeType: "array", - explicitDimensionSeparator: options.explicitDimensionSeparator, - }, - ); + const metadata = await getMetadata(sharedKvStoreContext, scale.url, { + ...options, + expectedNodeType: "array", + }); if (metadata === undefined) { throw new Error( `zarr v{zarrVersion} array metadata not found at ${scale.url}`, @@ -383,19 +375,28 @@ async function resolveOmeMultiscale( } async function getMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, options: { zarrVersion?: 2 | 3 | undefined; expectedNodeType?: NodeType | undefined; explicitDimensionSeparator?: DimensionSeparator | undefined; - }, + } & Partial, ): Promise { if (options.zarrVersion === 2) { const [zarray, zattrs] = await Promise.all([ - getJsonResource(chunkManager, credentialsProvider, `${url}/.zarray`), - getJsonResource(chunkManager, credentialsProvider, `${url}/.zattrs`), + getJsonResource( + sharedKvStoreContext, + `${url}.zarray`, + "zarr v2 array metadata", + options, + ), + getJsonResource( + sharedKvStoreContext, + `${url}.zattrs`, + "zarr v2 attributes", + options, + ), ]); if (zarray === undefined) { if (zattrs === undefined) { @@ -421,9 +422,10 @@ async function getMetadata( } if (options.zarrVersion === 3) { const zarrJson = await getJsonResource( - chunkManager, - credentialsProvider, - `${url}/zarr.json`, + sharedKvStoreContext, + `${url}zarr.json`, + "zarr v3 metadata", + options, ); if (zarrJson === undefined) return undefined; if (options.explicitDimensionSeparator !== undefined) { @@ -434,11 +436,11 @@ async function getMetadata( return parseV3Metadata(zarrJson, options.expectedNodeType); } const [v2Result, v3Result] = await Promise.all([ - getMetadata(chunkManager, credentialsProvider, url, { + getMetadata(sharedKvStoreContext, url, { ...options, zarrVersion: 2, }), - getMetadata(chunkManager, credentialsProvider, url, { + getMetadata(sharedKvStoreContext, url, { ...options, zarrVersion: 3, }), @@ -449,49 +451,64 @@ async function getMetadata( return v2Result ?? v3Result; } -export class ZarrDataSource extends DataSourceProvider { - constructor(public zarrVersion: 2 | 3 | undefined = undefined) { - super(); +function resolveUrl(options: GetKvStoreBasedDataSourceOptions) { + const { + authorityAndPath: additionalPath, + query, + fragment, + } = parseUrlSuffix(options.url.suffix); + + if (query) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: query parameters not supported`, + ); + } + return { + kvStoreUrl: kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + additionalPath: additionalPath ?? "", + fragment, + }; +} + +export class ZarrDataSource implements KvStoreBasedDataSourceProvider { + constructor(public zarrVersion: 2 | 3 | undefined = undefined) {} + get scheme() { + return `zarr${this.zarrVersion ?? ""}`; + } + get expectsDirectory() { + return true; } get description() { const versionStr = this.zarrVersion === undefined ? "" : ` v${this.zarrVersion}`; return `Zarr${versionStr} data source`; } - get(options: GetDataSourceOptions): Promise { - // Pattern is infallible. - let [, providerUrl, query] = - options.providerUrl.match(/([^?]*)(?:\?(.*))?$/)!; - const parameters = parseQueryStringParameters(query || ""); + get(options: GetKvStoreBasedDataSourceOptions): Promise { + let { kvStoreUrl, additionalPath, fragment } = resolveUrl(options); + kvStoreUrl = kvstoreEnsureDirectoryPipelineUrl( + pipelineUrlJoin(kvStoreUrl, additionalPath), + ); + const parameters = parseQueryStringParameters(fragment || ""); verifyObject(parameters); const dimensionSeparator = verifyOptionalObjectProperty( parameters, "dimension_separator", parseDimensionSeparator, ); - if (providerUrl.endsWith("/")) { - providerUrl = providerUrl.substring(0, providerUrl.length - 1); - } - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "zarr:MultiscaleVolumeChunkSource", - providerUrl, + kvStoreUrl, dimensionSeparator, }, - async () => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); - const metadata = await getMetadata( - options.chunkManager, - credentialsProvider, - url, - { - zarrVersion: this.zarrVersion, - explicitDimensionSeparator: dimensionSeparator, - }, - ); + options, + async (progressOptions) => { + const { sharedKvStoreContext } = options.registry; + const metadata = await getMetadata(sharedKvStoreContext, kvStoreUrl, { + ...progressOptions, + zarrVersion: this.zarrVersion, + explicitDimensionSeparator: dimensionSeparator, + }); if (metadata === undefined) { throw new Error("No zarr metadata found"); } @@ -499,31 +516,34 @@ export class ZarrDataSource extends DataSourceProvider { if (metadata.nodeType === "group") { // May be an OME-zarr multiscale dataset. const multiscale = parseOmeMetadata( - url, + kvStoreUrl, metadata.userAttributes, metadata.zarrVersion, ); if (multiscale === undefined) { - throw new Error("Neithre array nor OME multiscale metadata found"); + throw new Error("Neither array nor OME multiscale metadata found"); } multiscaleInfo = await resolveOmeMultiscale( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscale, { + ...progressOptions, zarrVersion: metadata.zarrVersion, explicitDimensionSeparator: dimensionSeparator, }, ); } else { - multiscaleInfo = getMultiscaleInfoForSingleArray(url, metadata); + multiscaleInfo = getMultiscaleInfoForSingleArray( + kvStoreUrl, + metadata, + ); } const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleInfo, ); return { + canonicalUrl: `${kvStoreUrl}|zarr${metadata.zarrVersion}:`, modelTransform: makeIdentityTransform(volume.modelSpace), subsources: [ { @@ -547,23 +567,46 @@ export class ZarrDataSource extends DataSourceProvider { }, ); } - - async completeUrl(options: CompleteUrlOptions) { - // Pattern is infallible. - const [, , query] = options.providerUrl.match(/([^?]*)(?:\?(.*))?$/)!; - if (query !== undefined) { - return applyCompletionOffset( - options.providerUrl.length - query.length, - await completeQueryStringParametersFromTable( - query, - supportedQueryParameters, - ), - ); + async completeUrl( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + const { kvStoreUrl, additionalPath, fragment } = resolveUrl(options); + if (fragment === undefined) { + return getKvStorePathCompletions(options.registry.sharedKvStoreContext, { + baseUrl: kvStoreUrl, + path: additionalPath, + directoryOnly: true, + signal: options.signal, + progressListener: options.progressListener, + }); + } + if (this.zarrVersion === 3) { + throw new Error("URL fragment parameters not supported"); } - return await completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.abortSignal, + return applyCompletionOffset( + options.url.url.length - fragment.length, + await completeQueryStringParametersFromTable( + fragment, + supportedQueryParameters, + ), ); } } + +export function registerAutoDetectV2(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set([".zarray", ".zattrs"]), { + suffix: "zarr2:", + description: "Zarr v2 data source", + }), + ); +} + +export function registerAutoDetectV3(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["zarr.json"]), { + suffix: "zarr3:", + description: "Zarr v3 data source", + }), + ); +} diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index ebeed9b195..e3f049af56 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -188,7 +188,7 @@ function parseMultiscaleScale( "coordinateTransformations", (x) => parseOmeCoordinateTransforms(rank, x), ); - const scaleUrl = `${url}/${path}`; + const scaleUrl = `${url}${path}/`; return { url: scaleUrl, transform }; } diff --git a/src/datasource/zarr/register_default.ts b/src/datasource/zarr/register_default.ts index 7046d2bc82..a1813881b7 100644 --- a/src/datasource/zarr/register_default.ts +++ b/src/datasource/zarr/register_default.ts @@ -14,9 +14,25 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { ZarrDataSource } from "#src/datasource/zarr/frontend.js"; +import { + registerKvStoreBasedDataProvider, + dataSourceAutoDetectRegistry, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + ZarrDataSource, + registerAutoDetectV2, + registerAutoDetectV3, +} from "#src/datasource/zarr/frontend.js"; -registerProvider("zarr", () => new ZarrDataSource()); -registerProvider("zarr2", () => new ZarrDataSource(2)); -registerProvider("zarr3", () => new ZarrDataSource(3)); +for (const provider of [ + new ZarrDataSource(), + new ZarrDataSource(2), + new ZarrDataSource(3), +]) { + registerKvStoreBasedDataProvider(provider); + registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +} +registerAutoDetectV2(dataSourceAutoDetectRegistry); +registerAutoDetectV3(dataSourceAutoDetectRegistry); diff --git a/src/kvstore/auto_detect.ts b/src/kvstore/auto_detect.ts new file mode 100644 index 0000000000..d13f19482d --- /dev/null +++ b/src/kvstore/auto_detect.ts @@ -0,0 +1,332 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreContext } from "#src/kvstore/context.js"; +import { readKvStore } from "#src/kvstore/index.js"; +import { pathIsDirectory } from "#src/kvstore/url.js"; +import { isGzipFormat } from "#src/util/gzip.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export interface AutoDetectDirectoryOptions { + url: string; + fileNames: Set; + signal?: AbortSignal; +} + +export interface AutoDetectMatch { + suffix: string; + description: string; +} + +export interface AutoDetectDirectorySpec { + fileNames: Set; + match: (options: AutoDetectDirectoryOptions) => Promise; +} + +export function simpleFilePresenceAutoDetectDirectorySpec( + fileNames: Set, + match: AutoDetectMatch, +): AutoDetectDirectorySpec { + return { + fileNames, + match: async (options) => { + const detectedFileNames = options.fileNames; + for (const fileName of fileNames) { + if (detectedFileNames.has(fileName)) { + return [match]; + } + } + return []; + }, + }; +} + +export interface AutoDetectFileOptions { + url: string; + prefix: Uint8Array; + suffix?: Uint8Array; + totalSize: number | undefined; + signal?: AbortSignal; +} + +export interface AutoDetectFileSpec { + prefixLength: number; + suffixLength: number; + match: (options: AutoDetectFileOptions) => Promise; +} + +function composeMatchFunctions( + specs: { + match: (options: Options) => Promise; + }[], +): (options: Options) => Promise { + return async (options: Options) => { + const matches: AutoDetectMatch[] = []; + const results = await Promise.allSettled( + specs.map((spec) => spec.match(options)), + ); + for (const result of results) { + if (result.status !== "fulfilled") continue; + matches.push(...result.value); + } + return matches; + }; +} + +export function composeAutoDetectDirectorySpecs( + specs: AutoDetectDirectorySpec[], +): AutoDetectDirectorySpec { + const fileNames = new Set(); + for (const spec of specs) { + for (const fileName of spec.fileNames) { + fileNames.add(fileName); + } + } + return { fileNames, match: composeMatchFunctions(specs) }; +} + +export function composeAutoDetectFileSpecs( + specs: AutoDetectFileSpec[], +): AutoDetectFileSpec { + let prefixLength = 0; + let suffixLength = 0; + for (const spec of specs) { + prefixLength = Math.max(prefixLength, spec.prefixLength); + suffixLength = Math.max(suffixLength, spec.suffixLength); + } + return { prefixLength, suffixLength, match: composeMatchFunctions(specs) }; +} + +export class AutoDetectRegistry { + directorySpecs: AutoDetectDirectorySpec[] = []; + fileSpecs: AutoDetectFileSpec[] = []; + gzipFileSpecs: AutoDetectFileSpec[] = []; + private _directorySpec: AutoDetectDirectorySpec | undefined; + private _fileSpec: AutoDetectFileSpec | undefined; + + registerDirectoryFormat(spec: AutoDetectDirectorySpec) { + this.directorySpecs.push(spec); + this._directorySpec = undefined; + } + + registerFileFormat( + spec: AutoDetectFileSpec, + supportedEncodings?: { gzip?: boolean }, + ) { + this.fileSpecs.push(spec); + if (supportedEncodings?.gzip) { + this.gzipFileSpecs.push(spec); + } + this._fileSpec = undefined; + } + + copyTo(registry: AutoDetectRegistry) { + registry.directorySpecs.push(...this.directorySpecs); + registry.fileSpecs.push(...this.fileSpecs); + registry.gzipFileSpecs.push(...this.gzipFileSpecs); + registry._fileSpec = undefined; + registry._directorySpec = undefined; + } + + get directorySpec() { + return ( + this._directorySpec ?? (this._directorySpec = this.getDirectorySpec()) + ); + } + + private getDirectorySpec() { + return composeAutoDetectDirectorySpecs(this.directorySpecs); + } + + get fileSpec() { + return this._fileSpec ?? (this._fileSpec = this.getFileSpec()); + } + + private getFileSpec() { + const { fileSpecs, gzipFileSpecs } = this; + const specs = [...fileSpecs]; + if (gzipFileSpecs.length > 0) { + specs.push(getGzipFileSpec(composeAutoDetectFileSpecs(gzipFileSpecs))); + } + return composeAutoDetectFileSpecs(specs); + } +} + +export interface AutoDetectFormatOptions extends Partial { + kvStoreContext: KvStoreContext; + url: string; + autoDetectDirectory: () => AutoDetectDirectorySpec; + autoDetectFile: () => AutoDetectFileSpec; +} + +export async function autoDetectFormat( + options: AutoDetectFormatOptions, +): Promise<{ matches: AutoDetectMatch[]; url: string }> { + const kvStore = options.kvStoreContext.getKvStore(options.url); + const { progressListener } = options; + using _span = + progressListener && + new ProgressSpan(progressListener, { + message: `Auto-detecting data format at ${options.url}`, + }); + if (!pathIsDirectory(kvStore.path) || kvStore.store.singleKey === true) { + const statResponse = await kvStore.store.stat(kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + }); + if (statResponse !== undefined) { + // Match as file. + const autoDetectFile = options.autoDetectFile(); + const { totalSize } = statResponse; + let prefix: Uint8Array; + let suffix: Uint8Array | undefined; + if (totalSize !== undefined && autoDetectFile.suffixLength > 0) { + if ( + totalSize <= + autoDetectFile.prefixLength + autoDetectFile.suffixLength + ) { + // Perform a single read + const readResponse = await readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + }); + prefix = suffix = new Uint8Array( + await readResponse.response.arrayBuffer(), + ); + } else { + [prefix, suffix] = await Promise.all( + [ + { offset: 0, length: autoDetectFile.prefixLength }, + { + offset: totalSize - autoDetectFile.suffixLength, + length: autoDetectFile.suffixLength, + }, + ].map((byteRange) => + readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + byteRange, + }) + .then((readResponse) => readResponse.response.arrayBuffer()) + .then((arrayBuffer) => new Uint8Array(arrayBuffer)), + ), + ); + } + } else { + prefix = new Uint8Array( + await ( + await readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + byteRange: { offset: 0, length: autoDetectFile.prefixLength }, + }) + ).response.arrayBuffer(), + ); + } + return { + matches: await autoDetectFile.match({ + url: options.url, + prefix, + suffix, + totalSize, + signal: options.signal, + }), + url: options.url, + }; + } + + if (kvStore.store.singleKey === true) { + return { matches: [], url: options.url }; + } + kvStore.path += "/"; + } + + const autoDetectDirectory = options.autoDetectDirectory(); + const detectedFileNames = new Set(); + await Promise.all( + Array.from(autoDetectDirectory.fileNames, async (fileName) => { + const response = await kvStore.store.stat(kvStore.path + fileName, { + signal: options.signal, + progressListener: options.progressListener, + }); + if (response !== undefined) { + detectedFileNames.add(fileName); + } + }), + ); + const url = kvStore.store.getUrl(kvStore.path); + const matches = await autoDetectDirectory.match({ + url, + fileNames: detectedFileNames, + signal: options.signal, + }); + return { matches, url }; +} + +function getGzipFileSpec(decodedSpec: AutoDetectFileSpec): AutoDetectFileSpec { + // Heuristic, assume gzip adds at most 100 bytes of overhead. + const prefixLength = decodedSpec.prefixLength + 100; + + async function detect( + options: AutoDetectFileOptions, + ): Promise { + if (!isGzipFormat(options.prefix)) return []; + const decompressedStream = new Response(options.prefix).body!.pipeThrough( + new DecompressionStream("gzip"), + { signal: options.signal }, + ); + let decodedPrefix = new Uint8Array(decodedSpec.prefixLength); + // Decode as much as possible. + let totalLength = 0; + + try { + const reader = decompressedStream.getReader(); + while (true) { + let { value } = await reader.read(); + if (value === undefined) break; + const remainingLength = decodedPrefix.length - totalLength; + if (value.length > remainingLength) { + value = value.subarray(0, remainingLength); + } + decodedPrefix.set(value, totalLength); + totalLength += value.length; + if (totalLength === decodedPrefix.length) { + break; + } + } + } catch { + // Ignore failure, likely due to truncated input. + } + decodedPrefix = decodedPrefix.subarray(0, totalLength); + + const matches = await decodedSpec.match({ + url: options.url, + signal: options.signal, + prefix: decodedPrefix, + totalSize: undefined, + }); + return matches.map(({ suffix, description }) => ({ + suffix, + description: `${description} (gzip-compressed)`, + })); + } + + return { prefixLength, suffixLength: 0, match: detect }; +} diff --git a/src/kvstore/backend.ts b/src/kvstore/backend.ts new file mode 100644 index 0000000000..96748c9d13 --- /dev/null +++ b/src/kvstore/backend.ts @@ -0,0 +1,147 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import type { SharedCredentialsManagerCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { KvStoreContext } from "#src/kvstore/context.js"; +import { + frontendBackendIsomorphicKvStoreProviderRegistry, + KvStoreProviderRegistry, +} from "#src/kvstore/register.js"; +import { + LIST_RPC_ID, + READ_RPC_ID, + SHARED_KVSTORE_CONTEXT_RPC_ID, + STAT_RPC_ID, +} from "#src/kvstore/shared_common.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { + registerPromiseRPC, + registerSharedObject, + SharedObjectCounterpart, +} from "#src/worker_rpc.js"; +import type { ByteRange } from "."; + +@registerSharedObject(SHARED_KVSTORE_CONTEXT_RPC_ID) +export class SharedKvStoreContextCounterpart extends SharedObjectCounterpart { + kvStoreContext: KvStoreContext; + + chunkManager: ChunkManager; + credentialsManager: SharedCredentialsManagerCounterpart; + + constructor(rpc: RPC, options: any) { + super(rpc, options); + this.chunkManager = rpc.get(options.chunkManager) as ChunkManager; + this.credentialsManager = rpc.get( + options.credentialsManager, + ) as SharedCredentialsManagerCounterpart; + this.kvStoreContext = new KvStoreContext(); + frontendBackendIsomorphicKvStoreProviderRegistry.applyToContext(this); + backendOnlyKvStoreProviderRegistry.applyToContext(this); + } +} + +export const backendOnlyKvStoreProviderRegistry = + new KvStoreProviderRegistry(); + +export function WithSharedKvStoreContextCounterpart< + TBase extends { new (...args: any[]): SharedObjectCounterpart }, +>(Base: TBase) { + return class extends Base { + sharedKvStoreContext: SharedKvStoreContextCounterpart; + constructor(...args: any[]) { + super(...args); + const options = args[1]; + this.sharedKvStoreContext = this.rpc!.get(options.sharedKvStoreContext); + } + }; +} + +registerPromiseRPC( + STAT_RPC_ID, + async function ( + this: RPC, + options: { sharedKvStoreContext: number; url: string }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextCounterpart = this.get( + options.sharedKvStoreContext, + ); + return { + value: await sharedKvStoreContext.kvStoreContext.stat( + options.url, + progressOptions, + ), + }; + }, +); + +registerPromiseRPC( + READ_RPC_ID, + async function ( + this: RPC, + options: { + sharedKvStoreContext: number; + url: string; + byteRange?: ByteRange; + throwIfMissing?: boolean; + }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextCounterpart = this.get( + options.sharedKvStoreContext, + ); + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + options.url, + { + ...progressOptions, + byteRange: options.byteRange, + throwIfMissing: options.throwIfMissing, + }, + ); + if (readResponse === undefined) { + return { value: undefined }; + } + const arrayBuffer = await readResponse.response.arrayBuffer(); + return { + value: { + data: arrayBuffer, + offset: readResponse.offset, + totalSize: readResponse.totalSize, + }, + transfers: [arrayBuffer], + }; + }, +); + +registerPromiseRPC( + LIST_RPC_ID, + async function ( + this: RPC, + options: { sharedKvStoreContext: number; url: string }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextCounterpart = this.get( + options.sharedKvStoreContext, + ); + const { store, path } = sharedKvStoreContext.kvStoreContext.getKvStore( + options.url, + ); + return { + value: await store.list!(path, progressOptions), + }; + }, +); diff --git a/src/kvstore/byte_range/file_handle.ts b/src/kvstore/byte_range/file_handle.ts new file mode 100644 index 0000000000..865ac9068e --- /dev/null +++ b/src/kvstore/byte_range/file_handle.ts @@ -0,0 +1,94 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + ByteRange, + ByteRangeRequest, + DriverReadOptions, + FileHandle, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { readFileHandle } from "#src/kvstore/index.js"; + +export function composeByteRangeRequest( + outer: ByteRange, + inner: ByteRangeRequest | undefined, +): { outer: ByteRange; inner: ByteRange } { + if (inner === undefined) { + return { outer, inner: { offset: 0, length: outer.length } }; + } + if ("suffixLength" in inner) { + const length = Math.min(outer.length, inner.suffixLength); + return { + outer: { offset: outer.offset + (outer.length - length), length }, + inner: { offset: outer.length - length, length }, + }; + } + if (inner.offset + inner.length > outer.length) { + throw new Error( + `Requested byte range ${JSON.stringify( + inner, + )} not valid for value of length ${outer.length}`, + ); + } + return { + outer: { offset: outer.offset + inner.offset, length: inner.length }, + inner, + }; +} + +export class FileByteRangeHandle implements FileHandle { + constructor( + public base: FileHandle, + public byteRange: ByteRange, + ) {} + + async stat(options: StatOptions): Promise { + options; + return { totalSize: this.byteRange.length }; + } + + async read(options: DriverReadOptions): Promise { + const { byteRange } = this; + const { outer: outerByteRange, inner: innerByteRange } = + composeByteRangeRequest(byteRange, options.byteRange); + if (outerByteRange.length === 0) { + return { + response: new Response(new Uint8Array(0)), + totalSize: byteRange.length, + ...innerByteRange, + }; + } + const response = await readFileHandle(this.base, { + signal: options.signal, + byteRange: outerByteRange, + strictByteRange: true, + throwIfMissing: true, + }); + return { + response: response.response, + totalSize: byteRange.length, + ...innerByteRange, + }; + } + + getUrl() { + const { offset, length } = this.byteRange; + return `${this.base.getUrl()}|range:${offset}-${offset + length}`; + } +} diff --git a/src/kvstore/byte_range/index.ts b/src/kvstore/byte_range/index.ts new file mode 100644 index 0000000000..93c9ae606e --- /dev/null +++ b/src/kvstore/byte_range/index.ts @@ -0,0 +1,75 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import type { + DriverReadOptions, + KvStore, + ReadResponse, + StatOptions, + StatResponse, + FileHandle, + ByteRange, +} from "#src/kvstore/index.js"; + +function parseKey(key: string): ByteRange { + const m = key.match(/^([0-9]+)-([0-9]+)$/); + if (m !== null) { + const begin = Number(m[1]); + const end = Number(m[2]); + if (end >= begin) { + return { offset: begin, length: end - begin }; + } + } + throw new Error( + `Invalid key ${JSON.stringify(key)} for "byte-range:", expected "-"`, + ); +} + +export class ByteRangeKvStore implements KvStore { + constructor(public base: FileHandle) {} + + getUrl(key: string) { + return this.base.getUrl() + `|byte-range:${key}`; + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const { length } = parseKey(key); + options; + return { totalSize: length }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const byteRange = parseKey(key); + return new FileByteRangeHandle(this.base, byteRange).read(options); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } + get singleKey() { + return true; + } +} diff --git a/src/kvstore/byte_range/register.ts b/src/kvstore/byte_range/register.ts new file mode 100644 index 0000000000..4bdacc9f70 --- /dev/null +++ b/src/kvstore/byte_range/register.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ByteRangeKvStore } from "#src/kvstore/byte_range/index.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; + +function byteRangeProvider(): KvStoreAdapterProvider { + return { + scheme: "byte-range", + description: `byte range slicing`, + getKvStore(url, base) { + ensureNoQueryOrFragmentParameters(url); + return { + store: new ByteRangeKvStore( + new KvStoreFileHandle(base.store, base.path), + ), + path: url.suffix ?? "", + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerKvStoreAdapterProvider( + byteRangeProvider, +); diff --git a/src/kvstore/chunk_source_frontend.ts b/src/kvstore/chunk_source_frontend.ts new file mode 100644 index 0000000000..a626923c12 --- /dev/null +++ b/src/kvstore/chunk_source_frontend.ts @@ -0,0 +1,55 @@ +/** + * @license + * Copyright 2017 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file Facilities to simplify defining subclasses of ChunkSource that use a CredentialsProvider. + */ + +import type { + ChunkManager, + ChunkSourceConstructor, + GettableChunkSource, +} from "#src/chunk_manager/frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { RPC } from "#src/worker_rpc.js"; + +/** + * Mixin for adding a credentialsProvider member to a ChunkSource. + */ +export function WithSharedKvStoreContext< + TBase extends ChunkSourceConstructor< + GettableChunkSource & { chunkManager: ChunkManager } + >, +>(Base: TBase) { + type WithSharedKvStoreContextOptions = InstanceType["OPTIONS"] & { + sharedKvStoreContext: SharedKvStoreContext; + }; + class C extends Base { + sharedKvStoreContext: SharedKvStoreContext; + declare OPTIONS: WithSharedKvStoreContextOptions; + constructor(...args: any[]) { + super(...args); + const options: WithSharedKvStoreContextOptions = args[1]; + this.sharedKvStoreContext = options.sharedKvStoreContext.addRef(); + } + initializeCounterpart(rpc: RPC, options: any) { + const { sharedKvStoreContext } = this; + options.sharedKvStoreContext = sharedKvStoreContext.rpcId; + super.initializeCounterpart(rpc, options); + } + } + return C; +} diff --git a/src/kvstore/context.ts b/src/kvstore/context.ts new file mode 100644 index 0000000000..564574c027 --- /dev/null +++ b/src/kvstore/context.ts @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { + KvStoreWithPath, + ListResponse, + ReadResponse, + ReadOptions, + ListOptions, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { listKvStore, readKvStore } from "#src/kvstore/index.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { resolveRelativePath, splitPipelineUrl } from "#src/kvstore/url.js"; +import type { + BasicCompletionResult, + CompletionWithDescription, +} from "#src/util/completion.js"; + +export type CompletionResult = BasicCompletionResult; + +export interface BaseKvStoreProvider { + scheme: string; + hidden?: boolean; + description?: string; + getKvStore(parsedUrl: UrlWithParsedScheme): KvStoreWithPath; +} + +export interface KvStoreAdapterProvider { + scheme: string; + hidden?: boolean; + description?: string; + getKvStore( + parsedUrl: UrlWithParsedScheme, + base: KvStoreWithPath, + ): KvStoreWithPath; +} + +export class KvStoreContext { + baseKvStoreProviders = new Map(); + kvStoreAdapterProviders = new Map(); + autoDetectRegistry = new AutoDetectRegistry(); + + getKvStore(url: string): KvStoreWithPath { + const pipeline = splitPipelineUrl(url); + let kvStore: KvStoreWithPath; + { + const basePart = pipeline[0]; + const provider = this.baseKvStoreProviders.get(basePart.scheme); + if (provider === undefined) { + const usage = this.describeProtocolUsage(basePart.scheme); + let message = `Invalid base kvstore protocol "${basePart.scheme}:"`; + if (usage !== undefined) { + message += `; ${usage}`; + } + throw new Error(message); + } + kvStore = provider.getKvStore(basePart); + } + + for (let i = 1; i < pipeline.length; ++i) { + const part = pipeline[i]; + const provider = this.kvStoreAdapterProviders.get(part.scheme); + if (provider === undefined) { + const usage = this.describeProtocolUsage(part.scheme); + let message = `Invalid kvstore adapter protocol "${part.scheme}:" in ${JSON.stringify(url)}`; + if (usage !== undefined) { + message += `; ${usage}`; + } + throw new Error(message); + } + kvStore = provider.getKvStore(part, kvStore); + } + return kvStore; + } + + // Describes valid uses of `protocol`, for error messages indicating an + // invalid protocol. If the protocol is unknown, returns `undefined`. + describeProtocolUsage(protocol: string): string | undefined { + if (this.baseKvStoreProviders.has(protocol)) { + return `"${protocol}:" may only be used as a base kvstore protocol`; + } + if (this.kvStoreAdapterProviders.has(protocol)) { + return `"${protocol}:" may only be used as a kvstore adapter protocol`; + } + return undefined; + } + + stat( + url: string, + options: StatOptions = {}, + ): Promise { + const kvStore = this.getKvStore(url); + return kvStore.store.stat(kvStore.path, options); + } + + read( + url: string, + options: ReadOptions & { throwIfMissing: true }, + ): Promise; + + read(url: string, options?: ReadOptions): Promise; + + read( + url: string, + options: ReadOptions = {}, + ): Promise { + const kvStore = this.getKvStore(url); + return readKvStore(kvStore.store, kvStore.path, options); + } + + list(urlPrefix: string, options: ListOptions = {}): Promise { + const kvStore = this.getKvStore(urlPrefix); + return listKvStore(kvStore.store, kvStore.path, options); + } + + resolveRelativePath(baseUrl: string, relativePath: string): string { + const kvStore = this.getKvStore(baseUrl); + return kvStore.store.getUrl( + resolveRelativePath(kvStore.path, relativePath), + ); + } +} diff --git a/src/kvstore/enabled_backend_modules.ts b/src/kvstore/enabled_backend_modules.ts new file mode 100644 index 0000000000..873feeb4be --- /dev/null +++ b/src/kvstore/enabled_backend_modules.ts @@ -0,0 +1,9 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#kvstore/byte_range/register"; +import "#kvstore/gcs/register"; +import "#kvstore/gzip/register"; +import "#kvstore/http/register"; +import "#kvstore/middleauth/register"; +import "#kvstore/ngauth/register"; +import "#kvstore/s3/register"; +import "#kvstore/zip/register_backend"; diff --git a/src/kvstore/enabled_frontend_modules.ts b/src/kvstore/enabled_frontend_modules.ts new file mode 100644 index 0000000000..051976e929 --- /dev/null +++ b/src/kvstore/enabled_frontend_modules.ts @@ -0,0 +1,11 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#kvstore/byte_range/register"; +import "#kvstore/gcs/register"; +import "#kvstore/gzip/register"; +import "#kvstore/http/register"; +import "#kvstore/middleauth/register"; +import "#kvstore/middleauth/register_credentials_provider"; +import "#kvstore/ngauth/register"; +import "#kvstore/ngauth/register_credentials_provider"; +import "#kvstore/s3/register"; +import "#kvstore/zip/register_frontend"; diff --git a/src/kvstore/frontend.ts b/src/kvstore/frontend.ts new file mode 100644 index 0000000000..4de55f8519 --- /dev/null +++ b/src/kvstore/frontend.ts @@ -0,0 +1,151 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { KvStoreContext } from "#src/kvstore/context.js"; +import type { + DriverListOptions, + DriverReadOptions, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { + frontendBackendIsomorphicKvStoreProviderRegistry, + KvStoreProviderRegistry, +} from "#src/kvstore/register.js"; +import { + LIST_RPC_ID, + READ_RPC_ID, + SHARED_KVSTORE_CONTEXT_RPC_ID, + STAT_RPC_ID, +} from "#src/kvstore/shared_common.js"; +import { registerSharedObjectOwner, SharedObject } from "#src/worker_rpc.js"; + +@registerSharedObjectOwner(SHARED_KVSTORE_CONTEXT_RPC_ID) +export class SharedKvStoreContext + extends SharedObject + implements SharedKvStoreContextBase +{ + kvStoreContext = new KvStoreContext(); + + constructor( + public chunkManager: ChunkManager, + public credentialsManager: SharedCredentialsManager, + ) { + super(); + this.initializeCounterpart(chunkManager.rpc!, { + chunkManager: chunkManager.rpcId, + credentialsManager: credentialsManager.rpcId, + }); + frontendBackendIsomorphicKvStoreProviderRegistry.applyToContext(this); + frontendOnlyKvStoreProviderRegistry.applyToContext(this); + } +} + +export const frontendOnlyKvStoreProviderRegistry = + new KvStoreProviderRegistry(); + +export function proxyStatToBackendKvStore( + sharedKvStoreContext: SharedKvStoreContext, + url: string, + options: StatOptions, +): Promise { + return sharedKvStoreContext.rpc!.promiseInvoke( + STAT_RPC_ID, + { sharedKvStoreContext: sharedKvStoreContext.rpcId, url }, + { signal: options.signal, progressListener: options.progressListener }, + ); +} + +export async function proxyReadToBackendKvStore( + sharedKvStoreContext: SharedKvStoreContext, + url: string, + options: DriverReadOptions, +): Promise { + const response = await sharedKvStoreContext.rpc!.promiseInvoke< + | { data: ArrayBuffer; offset: number; totalSize: number | undefined } + | undefined + >( + READ_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + url, + byteRange: options.byteRange, + throwIfMissing: options.throwIfMissing, + }, + { signal: options.signal, progressListener: options.progressListener }, + ); + if (response === undefined) return undefined; + return { + response: new Response(response.data), + offset: response.offset, + length: response.data.byteLength, + totalSize: response.totalSize, + }; +} + +export function proxyListToBackendKvStore( + sharedKvStoreContext: SharedKvStoreContext, + url: string, + options: DriverListOptions, +): Promise { + return sharedKvStoreContext.rpc!.promiseInvoke( + LIST_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + url, + }, + { signal: options.signal, progressListener: options.progressListener }, + ); +} + +export abstract class ProxyReadableKvStore { + constructor(public sharedKvStoreContext: SharedKvStoreContext) {} + + abstract getUrl(key: Key): string; + + stat(key: Key, options: StatOptions): Promise { + return proxyStatToBackendKvStore( + this.sharedKvStoreContext, + this.getUrl(key), + options, + ); + } + read( + key: Key, + options: DriverReadOptions, + ): Promise { + return proxyReadToBackendKvStore( + this.sharedKvStoreContext, + this.getUrl(key), + options, + ); + } +} + +export abstract class ProxyKvStore extends ProxyReadableKvStore { + list(prefix: string, options: DriverListOptions): Promise { + return proxyListToBackendKvStore( + this.sharedKvStoreContext, + this.getUrl(prefix), + options, + ); + } +} diff --git a/src/kvstore/gcs/index.ts b/src/kvstore/gcs/index.ts new file mode 100644 index 0000000000..13e893f0d6 --- /dev/null +++ b/src/kvstore/gcs/index.ts @@ -0,0 +1,150 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverListOptions, + ListResponse, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { + parseArray, + verifyObject, + verifyObjectProperty, + verifyOptionalObjectProperty, + verifyString, + verifyStringArray, +} from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; +import { getRandomHexString } from "#src/util/random.js"; + +export class GcsKvStore implements KvStore { + constructor( + public bucket: string, + public baseUrlForDisplay: string = `gs://${bucket}/`, + private fetchOkImpl: FetchOk = fetchOk, + ) {} + + private getObjectUrl(key: string): string { + // Include random query string parameter (ignored by GCS) to bypass GCS cache + // and ensure a cached response is never used. + // + // This addresses two issues related to GCS: + // + // 1. GCS fails to send an updated `Access-Control-Allow-Origin` header in 304 + // responses to cache revalidation requests. + // + // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 + // + // The random query string parameter ensures cached responses are never used. + // + // Note: This issue does not apply to gs+xml because with the XML API, the + // Access-Control-Allow-Origin response header does not vary with the Origin. + // + // 2. If the object does not prohibit caching (e.g. public bucket and default + // `cache-control` metadata value), GCS may return stale responses. + return ( + `https://storage.googleapis.com/storage/v1/b/${this.bucket}/o/` + + `${encodeURIComponent(key)}?alt=media` + + `&neuroglancer=${getRandomHexString()}` + ); + } + + stat(key: string, options: StatOptions): Promise { + return stat(this, key, this.getObjectUrl(key), options, this.fetchOkImpl); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + return read(this, key, this.getObjectUrl(key), options, this.fetchOkImpl); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const { progressListener } = options; + using _span = + progressListener === undefined + ? undefined + : new ProgressSpan(progressListener, { + message: `Listing prefix ${this.getUrl(prefix)}`, + }); + const delimiter = "/"; + // Include `neuroglancerOrigin` query parameter that is ignored by GCS to + // workaround + // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 (though + // it is not clear it would ever apply to bucket listing). + const response = await this.fetchOkImpl( + `https://storage.googleapis.com/storage/v1/b/${this.bucket}/o?` + + `delimiter=${encodeURIComponent(delimiter)}&prefix=${encodeURIComponent( + prefix, + )}&` + + `neuroglancerOrigin=${encodeURIComponent(location.origin)}`, + { + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const responseJson = await response.json(); + + verifyObject(responseJson); + const directories = verifyOptionalObjectProperty( + responseJson, + "prefixes", + verifyStringArray, + [], + ).map((prefix) => prefix.substring(0, prefix.length - 1)); + + const entries = verifyOptionalObjectProperty( + responseJson, + "items", + (items) => + parseArray(items, (item) => { + verifyObject(item); + return verifyObjectProperty(item, "name", verifyString); + }), + [], + ) + .filter((name) => !name.endsWith("_$folder$")) + .map((name) => ({ key: name })); + + return { + directories, + entries, + }; + } + + getUrl(path: string) { + return this.baseUrlForDisplay + encodePathForUrl(path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/gcs/register.ts b/src/kvstore/gcs/register.ts new file mode 100644 index 0000000000..4eb612bf77 --- /dev/null +++ b/src/kvstore/gcs/register.ts @@ -0,0 +1,45 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pythonIntegration from "#python_integration_build"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { GcsKvStore } from "#src/kvstore/gcs/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +function gcsProvider(_context: SharedKvStoreContextBase): BaseKvStoreProvider { + return { + scheme: "gs", + description: pythonIntegration + ? "Google Cloud Storage" + : "Google Cloud Storage (anonymous)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error("Invalid URL, expected `gs:///`"); + } + const [, bucket, path] = m; + return { + store: new GcsKvStore(bucket), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + gcsProvider, +); diff --git a/src/kvstore/gzip/file_handle.ts b/src/kvstore/gzip/file_handle.ts new file mode 100644 index 0000000000..c12f83882c --- /dev/null +++ b/src/kvstore/gzip/file_handle.ts @@ -0,0 +1,235 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + DriverReadOptions, + FileHandle, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { decodeGzipStream } from "#src/util/gzip.js"; + +export const EXPECTED_HEADER_OVERHEAD = 100; + +export class GzipFileHandle + implements FileHandle +{ + constructor( + public base: BaseHandle, + public format: CompressionFormat, + ) {} + + async stat(options: StatOptions): Promise { + await this.base.stat(options); + return { totalSize: undefined }; + } + + async read(options: DriverReadOptions): Promise { + const { byteRange } = options; + if (byteRange === undefined) { + const readResponse = await this.base.read(options); + if (readResponse === undefined) return undefined; + return { + response: new Response( + decodeGzipStream(readResponse.response, this.format), + ), + offset: 0, + length: undefined, + totalSize: undefined, + }; + } + if ("suffixLength" in byteRange || byteRange.offset !== 0) { + throw new Error( + `Byte range with offset not supported: ${JSON.stringify(byteRange)}`, + ); + } + + // There is no way to force a flush on a `DecompressionStream`; to ensure we + // have all available output from the input, we must close the readable + // stream, which prevents any further writes. This means if more input is + // required, we have to redo the decode. In almost all cases, though, + // `EXPECTED_HEADER_OVERHEAD` should be sufficient and it won't be necessary + // to fetch additional encoded data. + let decodedArray = new Uint8Array(byteRange.length); + const parts: Uint8Array[] = []; + let encodedBytesReceived = 0; + let expectedEncodedBytes = byteRange.length + EXPECTED_HEADER_OVERHEAD; + while (true) { + const readResponse = await this.base.read({ + ...options, + byteRange: { + offset: encodedBytesReceived, + length: expectedEncodedBytes - encodedBytesReceived, + }, + }); + if (readResponse === undefined) return undefined; + { + const part = new Uint8Array(await readResponse.response.arrayBuffer()); + parts.push(part); + encodedBytesReceived += part.length; + } + + const decompressionStream = new DecompressionStream("gzip"); + const writer = decompressionStream.writable.getWriter(); + const writePromises: Promise[] = []; + for (const part of parts) { + writePromises.push(writer.write(part)); + } + writePromises.push(writer.close()); + const reader = decompressionStream.readable.getReader(); + let decodedOffset = 0; + try { + while (decodedOffset < decodedArray.length) { + let { value } = await reader.read(); + if (value === undefined) { + // no more decoded data available + break; + } + const remainingLength = decodedArray.length - decodedOffset; + if (value.length > remainingLength) { + value = value.subarray(0, remainingLength); + } + decodedArray.set(value, decodedOffset); + decodedOffset += value.length; + } + + if ( + decodedOffset === decodedArray.length || + encodedBytesReceived === readResponse.totalSize + ) { + if (decodedOffset < decodedArray.length) { + decodedArray = decodedArray.subarray(0, decodedOffset); + } + return { + response: new Response(decodedArray), + offset: 0, + length: decodedArray.length, + totalSize: undefined, + }; + } + } finally { + await reader.cancel(); + await Promise.allSettled(writePromises); + } + + expectedEncodedBytes += Math.min( + 100, + decodedArray.length - decodedOffset, + ); + } + } + + getUrl() { + return this.base.getUrl() + "|gzip"; + } +} + +export async function gzipRead( + base: ReadableKvStore, + baseKey: Key, + format: CompressionFormat, + options: DriverReadOptions, +) { + const { byteRange } = options; + if (byteRange === undefined) { + const readResponse = await base.read(baseKey, options); + if (readResponse === undefined) return undefined; + return { + response: new Response(decodeGzipStream(readResponse.response, format)), + offset: 0, + length: undefined, + totalSize: undefined, + }; + } + if ("suffixLength" in byteRange || byteRange.offset !== 0) { + throw new Error( + `Byte range with offset not supported: ${JSON.stringify(byteRange)}`, + ); + } + + // There is no way to force a flush on a `DecompressionStream`; to ensure we + // have all available output from the input, we must close the readable + // stream, which prevents any further writes. This means if more input is + // required, we have to redo the decode. In almost all cases, though, + // `EXPECTED_HEADER_OVERHEAD` should be sufficient and it won't be necessary + // to fetch additional encoded data. + let decodedArray = new Uint8Array(byteRange.length); + const parts: Uint8Array[] = []; + let encodedBytesReceived = 0; + let expectedEncodedBytes = byteRange.length + EXPECTED_HEADER_OVERHEAD; + while (true) { + const readResponse = await base.read(baseKey, { + ...options, + byteRange: { + offset: encodedBytesReceived, + length: expectedEncodedBytes - encodedBytesReceived, + }, + }); + if (readResponse === undefined) return undefined; + { + const part = new Uint8Array(await readResponse.response.arrayBuffer()); + parts.push(part); + encodedBytesReceived += part.length; + } + + const decompressionStream = new DecompressionStream("gzip"); + const writer = decompressionStream.writable.getWriter(); + const writePromises: Promise[] = []; + for (const part of parts) { + writePromises.push(writer.write(part)); + } + writePromises.push(writer.close()); + const reader = decompressionStream.readable.getReader(); + let decodedOffset = 0; + try { + while (decodedOffset < decodedArray.length) { + let { value } = await reader.read(); + if (value === undefined) { + // no more decoded data available + break; + } + const remainingLength = decodedArray.length - decodedOffset; + if (value.length > remainingLength) { + value = value.subarray(0, remainingLength); + } + decodedArray.set(value, decodedOffset); + decodedOffset += value.length; + } + + if ( + decodedOffset === decodedArray.length || + encodedBytesReceived === readResponse.totalSize + ) { + if (decodedOffset < decodedArray.length) { + decodedArray = decodedArray.subarray(0, decodedOffset); + } + return { + response: new Response(decodedArray), + offset: 0, + length: decodedArray.length, + totalSize: undefined, + }; + } + } finally { + await reader.cancel(); + await Promise.allSettled(writePromises); + } + + expectedEncodedBytes += Math.min(100, decodedArray.length - decodedOffset); + } +} diff --git a/src/kvstore/gzip/index.ts b/src/kvstore/gzip/index.ts new file mode 100644 index 0000000000..741e67d21c --- /dev/null +++ b/src/kvstore/gzip/index.ts @@ -0,0 +1,96 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + DriverReadOptions, + KvStore, + ReadResponse, + StatOptions, + StatResponse, + FileHandle, +} from "#src/kvstore/index.js"; +import { isGzipFormat } from "#src/util/gzip.js"; + +export class GzipKvStore implements KvStore { + constructor( + public base: FileHandle, + public scheme: string, + public format: CompressionFormat, + ) {} + + getUrl(key: string) { + this.validatePath(key); + return this.base.getUrl() + `|${this.scheme}`; + } + + private validatePath(path: string) { + if (path) { + throw new Error( + `"${this.scheme}:" does not support non-empty path ${JSON.stringify(path)}`, + ); + } + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + this.validatePath(key); + await this.base.stat(options); + return { totalSize: undefined }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + this.validatePath(key); + return new GzipFileHandle(this.base, this.format).read(options); + } + + get supportsOffsetReads() { + return false; + } + get supportsSuffixReads() { + return false; + } + get singleKey() { + return true; + } +} + +async function detectGzip( + options: AutoDetectFileOptions, +): Promise { + if (!isGzipFormat(options.prefix)) { + return []; + } + return [{ suffix: "gzip:", description: "gzip-compressed" }]; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 3, + suffixLength: 0, + match: detectGzip, + }); +} diff --git a/src/kvstore/gzip/register.ts b/src/kvstore/gzip/register.ts new file mode 100644 index 0000000000..2c5357ce53 --- /dev/null +++ b/src/kvstore/gzip/register.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { GzipKvStore, registerAutoDetect } from "#src/kvstore/gzip/index.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; + +function gzipProvider( + scheme: string, + format: CompressionFormat, +): KvStoreAdapterProvider { + return { + scheme, + description: `transparent ${scheme} decoding`, + getKvStore(url, base) { + ensureEmptyUrlSuffix(url); + return { + store: new GzipKvStore( + new KvStoreFileHandle(base.store, base.path), + scheme, + format, + ), + path: "", + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerKvStoreAdapterProvider( + () => gzipProvider("gzip", "gzip"), +); + +registerAutoDetect( + frontendBackendIsomorphicKvStoreProviderRegistry.autoDetectRegistry, +); diff --git a/src/kvstore/http/html_directory_listing.ts b/src/kvstore/http/html_directory_listing.ts new file mode 100644 index 0000000000..06de731833 --- /dev/null +++ b/src/kvstore/http/html_directory_listing.ts @@ -0,0 +1,114 @@ +/** + * @license + * Copyright 2019 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + ListEntry, + DriverListOptions, + ListResponse, +} from "#src/kvstore/index.js"; +import { extractQueryAndFragment } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { + ProgressSpan, + type ProgressOptions, +} from "#src/util/progress_listener.js"; + +/** + * Obtains a directory listing from a server that supports HTML directory listings. + */ +export async function getHtmlDirectoryListing( + url: string, + options: { + fetchOkImpl?: FetchOk; + } & Partial = {}, +): Promise { + const baseUrl = extractQueryAndFragment(url).base; + const { fetchOkImpl = fetchOk, signal, progressListener } = options; + const response = await fetchOkImpl( + url, + /*init=*/ { + headers: { accept: "text/html" }, + signal: signal, + progressListener, + }, + ); + const contentType = response.headers.get("content-type"); + if (contentType === null || /\btext\/html\b/i.exec(contentType) === null) { + return []; + } + const text = await response.text(); + const doc = new DOMParser().parseFromString(text, "text/html"); + const nodes = doc.evaluate( + "//a/@href", + doc, + null, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + const results = new Set(); + for (let i = 0, n = nodes.snapshotLength; i < n; ++i) { + const node = nodes.snapshotItem(i)!; + const href = node.textContent; + if (href === null) continue; + const withoutQuery = extractQueryAndFragment(href).base; + if (withoutQuery) { + const resolvedUrl = new URL(withoutQuery, baseUrl).toString(); + if (resolvedUrl.startsWith(baseUrl) && resolvedUrl !== baseUrl) { + results.add(resolvedUrl); + } + } + } + return Array.from(results); +} + +export async function listFromHtmlDirectoryListing( + baseUrl: string, + prefix: string, + options: DriverListOptions, +): Promise { + const { progressListener } = options; + using _span = + progressListener && + new ProgressSpan(progressListener, { + message: `Requesting HTML directory listing for ${baseUrl}`, + }); + const { base, queryAndFragment } = extractQueryAndFragment(baseUrl); + const baseAndPrefix = base + prefix; + const fullUrl = baseAndPrefix + queryAndFragment; + const m = fullUrl.match(/^([a-z]+:\/\/.*\/)([^/?#]*)$/); + if (m === null) throw null; + const [, directoryUrl] = m; + const listing = await getHtmlDirectoryListing( + directoryUrl + queryAndFragment, + { + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const entries: ListEntry[] = []; + const directories: string[] = []; + for (const entry of listing) { + if (!entry.startsWith(baseAndPrefix)) continue; + const p = decodeURIComponent(entry.substring(base.length)); + if (p.endsWith("/")) { + directories.push(p.substring(0, p.length - 1)); + } else { + entries.push({ key: p }); + } + } + return { entries, directories }; +} diff --git a/src/kvstore/http/index.ts b/src/kvstore/http/index.ts new file mode 100644 index 0000000000..4d4e1caacd --- /dev/null +++ b/src/kvstore/http/index.ts @@ -0,0 +1,95 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { listFromHtmlDirectoryListing } from "#src/kvstore/http/html_directory_listing.js"; +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverListOptions, + ListResponse, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { extractQueryAndFragment } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; + +function joinBaseUrlAndPath(baseUrl: string, path: string) { + const { base, queryAndFragment } = extractQueryAndFragment(baseUrl); + return base + path + queryAndFragment; +} + +export class HttpKvStore implements KvStore { + constructor( + public baseUrl: string, + public baseUrlForDisplay: string = baseUrl, + public fetchOkImpl: FetchOk = fetchOk, + ) {} + + stat(key: string, options: StatOptions): Promise { + return stat( + this, + key, + joinBaseUrlAndPath(this.baseUrl, key), + options, + this.fetchOkImpl, + ); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + return read( + this, + key, + joinBaseUrlAndPath(this.baseUrl, key), + options, + this.fetchOkImpl, + ); + } + + list(prefix: string, options: DriverListOptions): Promise { + return listFromHtmlDirectoryListing(this.baseUrl, prefix, options); + } + + getUrl(path: string) { + return joinBaseUrlAndPath(this.baseUrlForDisplay, path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} + +export function getBaseUrlAndPath(url: string) { + const parsed = new URL(url); + if (parsed.hash) { + throw new Error("fragment not supported"); + } + if (parsed.username || parsed.password) { + throw new Error("basic auth credentials not supported"); + } + return { + baseUrl: `${parsed.origin}/${parsed.search}`, + path: decodeURI(parsed.pathname.substring(1)), + }; +} diff --git a/src/kvstore/http/read.ts b/src/kvstore/http/read.ts new file mode 100644 index 0000000000..721dd98a5d --- /dev/null +++ b/src/kvstore/http/read.ts @@ -0,0 +1,282 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { composeByteRangeRequest } from "#src/kvstore/byte_range/file_handle.js"; +import type { + ByteRange, + DriverReadOptions, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { KvStoreFileHandle, NotFoundError } from "#src/kvstore/index.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk, HttpError, isNotFoundError } from "#src/util/http_request.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; + +function getRangeHeader(request: ByteRange | undefined): string | undefined { + if (request === undefined) return undefined; + return `bytes=${request.offset}-${request.offset + request.length - 1}`; +} + +/** + * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the + * cache is disabled. Disabling the cache works around the problem. + * + * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 + */ +const byteRangeCacheMode = + navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; + +function wasRedirectedToDirectoryListing(url: string, response: Response) { + return new URL(url).pathname + "/" === new URL(response.url).pathname; +} + +function parse206ContentRangeHeader(contentRange: string) { + const m = contentRange.match(/bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/); + if (m === null) { + throw new Error( + `Invalid content-range header: ${JSON.stringify(contentRange)}`, + ); + } + const offset = parseInt(m[1], 10); + const endPos = parseInt(m[2], 10); + let totalSize: number | undefined; + if (m[3] !== "*") { + totalSize = parseInt(m[3], 10); + } + const length = endPos - offset + 1; + return { offset, length, totalSize }; +} + +export async function read( + store: ReadableKvStore, + key: Key, + url: string, + options: DriverReadOptions, + fetchOkImpl: FetchOk = fetchOk, +): Promise { + let resolvedByteRange: ByteRange | undefined; + try { + const { byteRange: byteRangeRequest } = options; + let rangeHeader: string | undefined; + // The HTTP spec supports suffixLength requests directly via "Range: + // bytes=-N" requests, which avoids the need for a separate HEAD request. + // However, per + // https://fetch.spec.whatwg.org/#cors-safelisted-request-header a suffix + // length byte range request header will always trigger an OPTIONS preflight + // request, which would otherwise be avoided. This negates the benefit of + // using a suffixLength request directly. Additionally, some servers such as + // the npm http-server package and https://uk1s3.embassy.ebi.ac.uk/ do not + // correctly handle suffixLength requests or do not correctly handle CORS + // preflight requests. To avoid those issues, always just issue a separate + // HEAD request to determine the length. + if (byteRangeRequest !== undefined) { + if ("suffixLength" in byteRangeRequest) { + const statResponse = await stat(store, key, url, options, fetchOkImpl); + if (statResponse === undefined) return undefined; + const { totalSize } = statResponse; + if (totalSize === undefined) { + throw new Error( + `Failed to determine total size of ${store.getUrl(key)} in order to fetch suffix ${JSON.stringify(byteRangeRequest)}`, + ); + } + resolvedByteRange = composeByteRangeRequest( + { offset: 0, length: totalSize }, + byteRangeRequest, + ).outer; + if (resolvedByteRange.length === 0) { + // Skip zero-byte read, since totalSize is already known. + return { + ...resolvedByteRange, + totalSize, + response: new Response(new Uint8Array(0)), + }; + } + rangeHeader = getRangeHeader(resolvedByteRange); + } else { + resolvedByteRange = byteRangeRequest; + if (resolvedByteRange.length === 0) { + // The HTTP range header does not support zero-length byte range + // requests. + // + // Convert zero-length byte range to length-1 byte range, and then + // discard the response. If the requested offset is 0, and the file is + // empty, then this will result in a 416 Range Not Satisfiable + // response. + rangeHeader = getRangeHeader({ + offset: Math.max(resolvedByteRange.offset - 1, 0), + length: 1, + }); + } else { + rangeHeader = getRangeHeader(resolvedByteRange); + } + } + } + const requestInit: RequestInit & { progressListener?: ProgressListener } = { + signal: options.signal, + progressListener: options.progressListener, + }; + if (rangeHeader !== undefined) { + requestInit.headers = { range: rangeHeader }; + requestInit.cache = byteRangeCacheMode; + } + let response = await fetchOkImpl(url, requestInit); + if (wasRedirectedToDirectoryListing(url, response)) { + return undefined; + } + let offset: number | undefined; + let length: number | undefined; + let totalSize: number | undefined; + if (response.status === 206) { + const contentRange = response.headers.get("content-range"); + if (contentRange === null) { + // Content-range should always be sent, but some buggy servers don't + // send it. + if (resolvedByteRange !== undefined) { + offset = resolvedByteRange.offset; + } else { + throw new Error( + "Unexpected HTTP 206 response when no byte range specified.", + ); + } + } + if (contentRange !== null) { + ({ offset, length, totalSize } = + parse206ContentRangeHeader(contentRange)); + } + } else { + length = totalSize = getBodyLength(response.headers); + } + if (offset === undefined) { + offset = 0; + } + if (length === undefined) { + length = getBodyLength(response.headers); + } + if (resolvedByteRange?.length === 0) { + response = new Response(new Uint8Array(0)); + offset = resolvedByteRange.offset; + length = 0; + } + return { + response, + offset, + length, + totalSize, + }; + } catch (e) { + if ( + e instanceof HttpError && + e.status === 416 && + resolvedByteRange?.length === 0 && + resolvedByteRange.offset === 0 + ) { + return { + response: new Response(new Uint8Array(0)), + offset: 0, + length: 0, + totalSize: 0, + }; + } + return handleThrowIfMissing(store, key, options, e); + } +} + +function getBodyLength(headers: Headers): number | undefined { + const contentLength = headers.get("content-length"); + const contentEncoding = headers.get("content-encoding"); + if (contentEncoding === null && contentLength !== null) { + const size = Number(contentLength); + if (!Number.isFinite(size) || size < 0) { + throw new Error(`Invalid content-length: {contentLength}`); + } + return size; + } + return undefined; +} + +function handleThrowIfMissing( + store: ReadableKvStore, + key: Key, + options: { throwIfMissing?: boolean }, + error: unknown, +) { + if (isNotFoundError(error)) { + if (options.throwIfMissing === true) { + throw new NotFoundError(new KvStoreFileHandle(store, key), { + cause: error, + }); + } + return undefined; + } + throw error; +} + +export async function stat( + store: ReadableKvStore, + key: Key, + url: string, + options: StatOptions, + fetchOkImpl: FetchOk = fetchOk, +): Promise { + // First try HEAD request. + try { + const response = await fetchOkImpl(url, { + method: "HEAD", + signal: options.signal, + progressListener: options.progressListener, + }); + if (wasRedirectedToDirectoryListing(url, response)) return undefined; + return { totalSize: getBodyLength(response.headers) }; + } catch (e) { + if (e instanceof HttpError && e.status === 405 /* method not allowed */) { + // HEAD may not be supported, use GET with one byte range instead. + // + // For example, + // https://data-proxy.ebrains.eu/api/v1/buckets/localizoom/14122_mPPC_BDA_s186.tif/14122_mPPC_BDA_s186.dzi + // returns HTTP 405 Method Not Allowed in response to HEAD requests. + } else { + return handleThrowIfMissing(store, key, options, e); + } + } + + // Try GET with one-byte range instead. + try { + const response = await fetchOkImpl(url, { + signal: options.signal, + progressListener: options.progressListener, + headers: { range: "bytes=0-0" }, + }); + if (wasRedirectedToDirectoryListing(url, response)) return undefined; + let totalSize: number | undefined; + if (response.status === 200) { + totalSize = getBodyLength(response.headers); + } else { + const contentRange = response.headers.get("content-range"); + if (contentRange !== null) { + ({ totalSize } = parse206ContentRangeHeader(contentRange)); + } + } + return { totalSize }; + } catch (e) { + if (e instanceof HttpError && e.status === 416) { + return { totalSize: 0 }; + } + return handleThrowIfMissing(store, key, options, e); + } +} diff --git a/src/kvstore/http/register.ts b/src/kvstore/http/register.ts new file mode 100644 index 0000000000..3b593a3148 --- /dev/null +++ b/src/kvstore/http/register.ts @@ -0,0 +1,49 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { getBaseUrlAndPath, HttpKvStore } from "#src/kvstore/http/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +function httpProvider( + scheme: string, + _context: SharedKvStoreContextBase, +): BaseKvStoreProvider { + return { + scheme, + description: `${scheme} (unauthenticated)`, + getKvStore(url) { + try { + const { baseUrl, path } = getBaseUrlAndPath(url.url); + return { + store: new HttpKvStore(baseUrl), + path, + }; + } catch (e) { + throw new Error(`Invalid URL ${JSON.stringify(url.url)}`, { + cause: e, + }); + } + }, + }; +} + +for (const protocol of ["http", "https"]) { + frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + (context) => httpProvider(protocol, context), + ); +} diff --git a/src/kvstore/index.ts b/src/kvstore/index.ts index 3bd16631b7..980239a303 100644 --- a/src/kvstore/index.ts +++ b/src/kvstore/index.ts @@ -14,38 +14,13 @@ * limitations under the License. */ +import type { ProgressOptions } from "#src/util/progress_listener.js"; + export interface ByteRange { offset: number; length: number; } -export function composeByteRangeRequest( - outer: ByteRange, - inner: ByteRangeRequest | undefined, -): { outer: ByteRange; inner: ByteRange } { - if (inner === undefined) { - return { outer, inner: { offset: 0, length: outer.length } }; - } - if ("suffixLength" in inner) { - const length = Math.min(outer.length, inner.suffixLength); - return { - outer: { offset: outer.offset + (outer.length - length), length }, - inner: { offset: outer.length - length, length }, - }; - } - if (inner.offset + inner.length > outer.length) { - throw new Error( - `Requested byte range ${JSON.stringify( - inner, - )} not valid for value of length ${outer.length}`, - ); - } - return { - outer: { offset: outer.offset + inner.offset, length: inner.length }, - inner, - }; -} - export type ByteRangeRequest = | ByteRange | { @@ -53,19 +28,33 @@ export type ByteRangeRequest = }; export interface ReadResponse { - data: Uint8Array; - dataRange: ByteRange; + response: Response; + offset: number; + length: number | undefined; totalSize: number | undefined; } -export interface ReadOptions { +export interface DriverReadOptions extends Partial { byteRange?: ByteRangeRequest; - abortSignal?: AbortSignal; + throwIfMissing?: boolean; } -export interface ListOptions { - prefix: string; - abortSignal?: AbortSignal; +export class NotFoundError extends Error { + constructor(handle: FileHandle, options?: { cause: any }) { + super(`${handle.getUrl()} not found`, options); + } +} + +export interface ReadOptions extends DriverReadOptions { + strictByteRange?: boolean; +} + +export type DriverListOptions = Partial; + +export type ListResponseKeyKind = "path" | "suffix" | "url"; + +export interface ListOptions extends DriverListOptions { + responseKeys?: ListResponseKeyKind; } export interface ListEntry { @@ -77,12 +66,204 @@ export interface ListResponse { directories: string[]; } +export interface StatOptions extends Partial { + throwIfMissing?: boolean; +} + +export interface StatResponse { + totalSize: number | undefined; +} + export interface ReadableKvStore { - read(key: Key, options: ReadOptions): Promise; + stat(key: Key, options: StatOptions): Promise; + read(key: Key, options: DriverReadOptions): Promise; + getUrl(key: Key): string; + + // Reads with non-zero byte offset are supported. + supportsOffsetReads: boolean; + + // Reads with `suffixLength` byte range are supported. + supportsSuffixReads: boolean; } export interface ListableKvStore { - list(options: ListOptions): Promise; + list?: (prefix: string, options: DriverListOptions) => Promise; } -export interface KvStore extends ReadableKvStore, ListableKvStore {} +export interface KvStore extends ReadableKvStore, ListableKvStore { + // Indicates that the only valid key is the empty string. + singleKey?: boolean; +} + +export interface KvStoreWithPath { + store: KvStore; + path: string; +} + +export function getKvStoreUrl(kvstore: KvStoreWithPath): string { + return kvstore.store.getUrl(kvstore.path); +} + +export function readKvStore( + store: ReadableKvStore, + key: Key, + options: ReadOptions & { throwIfMissing: true }, +): Promise; + +export function readKvStore( + store: ReadableKvStore, + key: Key, + options?: ReadOptions, +): Promise; + +export async function readKvStore( + store: ReadableKvStore, + key: Key, + options: ReadOptions = {}, +): Promise { + return readFileHandle(new KvStoreFileHandle(store, key), options); +} + +export function readFileHandle( + handle: FileHandle, + options: ReadOptions & { throwIfMissing: true }, +): Promise; + +export function readFileHandle( + handle: FileHandle, + options?: ReadOptions, +): Promise; + +export async function readFileHandle( + handle: FileHandle, + options: ReadOptions = {}, +): Promise { + const response = await handle.read(options); + if (options?.throwIfMissing === true) { + if (response === undefined) { + throw new NotFoundError(handle); + } + } + if (options?.strictByteRange === true && response !== undefined) { + const { byteRange } = options; + const { offset, length } = response; + if (byteRange !== undefined) { + if ( + "suffixLength" in byteRange + ? length !== byteRange.suffixLength + : offset !== byteRange.offset || + (length !== undefined && length !== byteRange.length) + ) { + throw new Error( + `Received truncated response for ${handle.getUrl()}, expected ${JSON.stringify( + byteRange, + )} but received offset=${offset}, length=${length}`, + ); + } + } + } + return response; +} + +function transformListResponse( + response: ListResponse, + prefix: string, + kvStore: KvStore, + responseKeys?: ListResponseKeyKind, +) { + switch (responseKeys) { + case "suffix": { + const offset = prefix.length; + return { + directories: response.directories.map((key) => key.substring(offset)), + entries: response.entries.map(({ key, ...entry }) => ({ + ...entry, + key: key.substring(offset), + })), + }; + } + case "url": { + return { + directories: response.directories.map((key) => kvStore.getUrl(key)), + entries: response.entries.map(({ key, ...entry }) => ({ + ...entry, + key: kvStore.getUrl(key), + })), + }; + } + default: { + return response; + } + } +} + +export async function listKvStore( + kvStore: KvStore, + prefix: string, + options: ListOptions = {}, +): Promise { + if (!kvStore.list) { + throw new Error("Listing not supported"); + } + return transformListResponse( + await kvStore.list(prefix, options), + prefix, + kvStore, + options.responseKeys, + ); +} + +export async function listKvStoreRecursively( + kvStore: KvStore, + prefix: string, + options: ListOptions = {}, +): Promise { + if (!kvStore.list) { + throw new Error("Listing not supported"); + } + const entries: ListEntry[] = []; + async function process(path: string) { + const response = await kvStore.list!(path, options); + entries.push(...response.entries); + await Promise.all(response.directories.map((name) => process(name + "/"))); + } + await process(prefix); + return transformListResponse( + { entries, directories: [] }, + prefix, + kvStore, + options.responseKeys, + ).entries; +} + +export function kvStoreAppendPath( + kvstore: KvStoreWithPath, + suffix: string, +): KvStoreWithPath { + return { store: kvstore.store, path: kvstore.path + suffix }; +} + +export interface FileHandle { + stat(options: StatOptions): Promise; + read(options: DriverReadOptions): Promise; + getUrl(): string; +} + +export class KvStoreFileHandle implements FileHandle { + constructor( + public store: ReadableKvStore, + public key: Key, + ) {} + + stat(options: StatOptions): Promise { + return this.store.stat(this.key, options); + } + + read(options: DriverReadOptions): Promise { + return this.store.read(this.key, options); + } + + getUrl() { + return this.store.getUrl(this.key); + } +} diff --git a/src/datasource/middleauth/credentials_provider.ts b/src/kvstore/middleauth/credentials_provider.ts similarity index 84% rename from src/datasource/middleauth/credentials_provider.ts rename to src/kvstore/middleauth/credentials_provider.ts index 719ed4738a..554ce79933 100644 --- a/src/datasource/middleauth/credentials_provider.ts +++ b/src/kvstore/middleauth/credentials_provider.ts @@ -34,6 +34,7 @@ import { verifyString, verifyStringArray, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; export type MiddleAuthToken = { tokenType: string; @@ -59,7 +60,7 @@ function openPopupCenter(url: string, width: number, height: number) { function waitForAuthResponseMessage( serverUrl: string, source: Window, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { return new Promise((resolve, reject) => { window.addEventListener( @@ -91,17 +92,17 @@ function waitForAuthResponseMessage( console.error("Response received: ", event.data); } }, - { signal: abortSignal }, + { signal: signal }, ); }); } async function waitForLogin( serverUrl: string, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const abortController = new AbortController(); - abortSignal = AbortSignal.any([abortController.signal, abortSignal]); + signal = AbortSignal.any([abortController.signal, signal]); try { const newWindow = openPopupCenter( `${serverUrl}/api/v1/authorize`, @@ -114,7 +115,7 @@ async function waitForLogin( monitorAuthPopupWindow(newWindow, abortController); return await raceWithAbort( waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), - abortSignal, + signal, ); } finally { abortController.abort(); @@ -144,7 +145,7 @@ export class MiddleAuthCredentialsProvider extends CredentialsProvider { + get = makeCredentialsGetter(async (options) => { let token = undefined; if (!this.alreadyTriedLocalStorage) { @@ -153,13 +154,16 @@ export class MiddleAuthCredentialsProvider extends CredentialsProvider waitForLogin(this.serverUrl, abortSignal), + get: (signal) => waitForLogin(this.serverUrl, signal), }, - abortSignal, + options.signal, ); saveAuthTokenToLocalStorage(this.serverUrl, token); } @@ -188,16 +192,23 @@ export class MiddleAuthAppCredentialsProvider extends CredentialsProvider { - const authInfo = await fetch(`${this.serverUrl}/auth_info`).then((res) => - res.json(), - ); + get = makeCredentialsGetter(async (options) => { + let authInfo: any; + { + using _span = new ProgressSpan(options.progressListener, { + message: `Determining authentication server for ${this.serverUrl}`, + }); + const response = await fetch(`${this.serverUrl}/auth_info`, { + signal: options.signal, + }); + authInfo = await response.json(); + } const provider = this.credentialsManager.getCredentialsProvider( "middleauth", authInfo.login_url, ) as MiddleAuthCredentialsProvider; - this.credentials = await provider.get(this.credentials); + this.credentials = await provider.get(this.credentials, options); if (this.credentials.credentials.appUrls.includes(this.serverUrl)) { return this.credentials.credentials; diff --git a/src/kvstore/middleauth/register.ts b/src/kvstore/middleauth/register.ts new file mode 100644 index 0000000000..e772a05bb8 --- /dev/null +++ b/src/kvstore/middleauth/register.ts @@ -0,0 +1,74 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchOkWithOAuth2CredentialsAdapter } from "#src/credentials_provider/oauth2.js"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { getBaseUrlAndPath, HttpKvStore } from "#src/kvstore/http/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +const SCHEME_PREFIX = "middleauth+"; + +function getMiddleAuthCredentialsProvider( + credentialsManager: CredentialsManager, + url: string, +): CredentialsProvider { + return credentialsManager.getCredentialsProvider( + "middleauthapp", + new URL(url).origin, + ); +} + +function middleauthProvider( + scheme: string, + context: SharedKvStoreContextBase, +): BaseKvStoreProvider { + return { + scheme: SCHEME_PREFIX + scheme, + description: `${scheme} with middleauth`, + getKvStore(url) { + const httpUrl = url.url.substring(SCHEME_PREFIX.length); + const credentialsProvider = getMiddleAuthCredentialsProvider( + context.credentialsManager, + httpUrl, + ); + try { + const { baseUrl, path } = getBaseUrlAndPath(httpUrl); + return { + store: new HttpKvStore( + baseUrl, + SCHEME_PREFIX + baseUrl, + fetchOkWithOAuth2CredentialsAdapter(credentialsProvider), + ), + path, + }; + } catch (e) { + throw new Error(`Invalid URL ${JSON.stringify(url.url)}`, { + cause: e, + }); + } + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + (context) => middleauthProvider("https", context), +); diff --git a/src/datasource/middleauth/register_credentials_provider.ts b/src/kvstore/middleauth/register_credentials_provider.ts similarity index 75% rename from src/datasource/middleauth/register_credentials_provider.ts rename to src/kvstore/middleauth/register_credentials_provider.ts index 90f6a3b634..42ad01323e 100644 --- a/src/datasource/middleauth/register_credentials_provider.ts +++ b/src/kvstore/middleauth/register_credentials_provider.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { MiddleAuthCredentialsProvider, MiddleAuthAppCredentialsProvider, -} from "#src/datasource/middleauth/credentials_provider.js"; +} from "#src/kvstore/middleauth/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "middleauth", - (serverUrl) => new MiddleAuthCredentialsProvider(serverUrl), + (serverUrl: string) => new MiddleAuthCredentialsProvider(serverUrl), ); -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "middleauthapp", (serverUrl: string, credentialsManager: CredentialsManager) => new MiddleAuthAppCredentialsProvider(serverUrl, credentialsManager), diff --git a/src/datasource/ngauth/README.md b/src/kvstore/ngauth/README.md similarity index 100% rename from src/datasource/ngauth/README.md rename to src/kvstore/ngauth/README.md diff --git a/src/datasource/ngauth/credentials_provider.ts b/src/kvstore/ngauth/credentials_provider.ts similarity index 71% rename from src/datasource/ngauth/credentials_provider.ts rename to src/kvstore/ngauth/credentials_provider.ts index ed24973eba..7d2208f0ee 100644 --- a/src/datasource/ngauth/credentials_provider.ts +++ b/src/kvstore/ngauth/credentials_provider.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import { CredentialsProvider, makeCredentialsGetter, @@ -25,12 +25,13 @@ import { } from "#src/credentials_provider/interactive_credentials_provider.js"; import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; import { raceWithAbort } from "#src/util/abort.js"; -import { HttpError } from "#src/util/http_request.js"; +import { fetchOk, HttpError } from "#src/util/http_request.js"; import { verifyObject, verifyObjectProperty, verifyString, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; function makeOriginError(serverUrl: string): Error { return new Error( @@ -45,10 +46,10 @@ export interface Credentials { async function waitForLogin( serverUrl: string, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { const abortController = new AbortController(); - abortSignal = AbortSignal.any([abortController.signal, abortSignal]); + signal = AbortSignal.any([abortController.signal, signal]); try { const newWindow = window.open( `${serverUrl}/login?origin=${encodeURIComponent(self.origin)}`, @@ -59,7 +60,7 @@ async function waitForLogin( monitorAuthPopupWindow(newWindow, abortController); return await raceWithAbort( waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), - abortSignal, + signal, ); } finally { abortController.abort(); @@ -69,7 +70,7 @@ async function waitForLogin( function waitForAuthResponseMessage( serverUrl: string, source: Window, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { return new Promise((resolve, reject) => { window.addEventListener( @@ -102,7 +103,7 @@ function waitForAuthResponseMessage( ); } }, - { signal: abortSignal }, + { signal: signal }, ); }); } @@ -111,28 +112,34 @@ export class NgauthCredentialsProvider extends CredentialsProvider constructor(public serverUrl: string) { super(); } - get = makeCredentialsGetter(async (abortSignal) => { - const response = await fetch(`${this.serverUrl}/token`, { - method: "POST", - credentials: "include", - signal: abortSignal, + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting ngauth login token from ${this.serverUrl}`, }); - switch (response.status) { - case 200: - return { token: await response.text() }; - case 401: - return await getCredentialsWithStatus( - { - description: `ngauth server ${this.serverUrl}`, - requestDescription: "login", - get: (abortSignal) => waitForLogin(this.serverUrl, abortSignal), - }, - abortSignal, - ); - case 403: - throw makeOriginError(this.serverUrl); - default: - throw HttpError.fromResponse(response); + try { + const response = await fetchOk(`${this.serverUrl}/token`, { + method: "POST", + credentials: "include", + signal: options.signal, + }); + return { token: await response.text() }; + } catch (e) { + if (e instanceof HttpError) { + switch (e.status) { + case 401: + return await getCredentialsWithStatus( + { + description: `ngauth server ${this.serverUrl}`, + requestDescription: "login", + get: (signal) => waitForLogin(this.serverUrl, signal), + }, + options.signal, + ); + case 403: + throw makeOriginError(this.serverUrl); + } + } + throw e; } }); } @@ -145,11 +152,14 @@ export class NgauthGcsCredentialsProvider extends CredentialsProvider { - const response = await fetchWithCredentials( + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting access token for gs://${this.bucket} from ${this.serverUrl}`, + }); + const response = await fetchOkWithCredentials( this.ngauthCredentialsProvider, `${this.serverUrl}/gcs_token`, - { method: "POST" }, + { method: "POST", signal: options.signal }, (credentials, init) => { return { ...init, diff --git a/src/kvstore/ngauth/register.ts b/src/kvstore/ngauth/register.ts new file mode 100644 index 0000000000..a7ef1067cf --- /dev/null +++ b/src/kvstore/ngauth/register.ts @@ -0,0 +1,84 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pythonIntegration from "#python_integration_build"; +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchOkWithOAuth2CredentialsAdapter } from "#src/credentials_provider/oauth2.js"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { GcsKvStore } from "#src/kvstore/gcs/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +function getNgauthCredentialsProvider( + credentialsManager: CredentialsManager, + authServer: string, + bucket: string, +): CredentialsProvider { + return pythonIntegration + ? credentialsManager.getCredentialsProvider("gcs", { bucket }) + : credentialsManager.getCredentialsProvider("ngauth_gcs", { + authServer: authServer, + bucket, + }); +} + +const SCHEME_PREFIX = "gs+ngauth+"; + +function gcsNgauthProvider( + scheme: string, + context: SharedKvStoreContextBase, +): BaseKvStoreProvider { + return { + scheme, + description: pythonIntegration + ? "Google Cloud Storage" + : "Google Cloud Storage (ngauth)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error( + `Invalid URL, expected ${url.scheme}:////`, + ); + } + const [, authHost, bucket, path] = m; + const authUrl = + url.scheme.substring(SCHEME_PREFIX.length) + "://" + authHost; + const credentialsProvider = getNgauthCredentialsProvider( + context.credentialsManager, + authUrl, + bucket, + ); + return { + store: new GcsKvStore( + bucket, + `${url.scheme}://${authHost}/${bucket}/`, + fetchOkWithOAuth2CredentialsAdapter(credentialsProvider), + ), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +for (const scheme of ["http", "https"]) { + frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + (context) => gcsNgauthProvider(`${SCHEME_PREFIX}${scheme}`, context), + ); +} diff --git a/src/datasource/ngauth/register_credentials_provider.ts b/src/kvstore/ngauth/register_credentials_provider.ts similarity index 83% rename from src/datasource/ngauth/register_credentials_provider.ts rename to src/kvstore/ngauth/register_credentials_provider.ts index d500e1ee54..ff7ce554f7 100644 --- a/src/datasource/ngauth/register_credentials_provider.ts +++ b/src/kvstore/ngauth/register_credentials_provider.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { NgauthCredentialsProvider, NgauthGcsCredentialsProvider, -} from "#src/datasource/ngauth/credentials_provider.js"; +} from "#src/kvstore/ngauth/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "ngauth", (serverUrl) => new NgauthCredentialsProvider(serverUrl), ); -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "ngauth_gcs", ( parameters: { authServer: string; bucket: string }, diff --git a/src/kvstore/register.ts b/src/kvstore/register.ts new file mode 100644 index 0000000000..86f316b61d --- /dev/null +++ b/src/kvstore/register.ts @@ -0,0 +1,74 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { + BaseKvStoreProvider, + KvStoreAdapterProvider, + KvStoreContext, +} from "#src/kvstore/context.js"; + +export interface SharedKvStoreContextBase { + kvStoreContext: KvStoreContext; + credentialsManager: CredentialsManager; +} + +export class KvStoreProviderRegistry< + SharedKvStoreContext extends SharedKvStoreContextBase, +> { + baseKvStoreProviders: Array< + (context: SharedKvStoreContext) => BaseKvStoreProvider + > = []; + kvStoreAdapterProviders: Array< + (context: SharedKvStoreContext) => KvStoreAdapterProvider + > = []; + autoDetectRegistry = new AutoDetectRegistry(); + + registerBaseKvStoreProvider( + provider: (context: SharedKvStoreContext) => BaseKvStoreProvider, + ) { + this.baseKvStoreProviders.push(provider); + } + + registerKvStoreAdapterProvider( + provider: (context: SharedKvStoreContext) => KvStoreAdapterProvider, + ) { + this.kvStoreAdapterProviders.push(provider); + } + + applyToContext(context: SharedKvStoreContext) { + const { kvStoreContext } = context; + for (const key of [ + "baseKvStoreProviders", + "kvStoreAdapterProviders", + ] as const) { + const map = kvStoreContext[key]; + for (const providerFactory of this[key]) { + const provider = providerFactory(context); + const { scheme } = provider; + if (map.has(scheme)) { + throw new Error(`Duplicate kvstore scheme ${scheme}`); + } + map.set(scheme, provider as any); + } + } + this.autoDetectRegistry.copyTo(context.kvStoreContext.autoDetectRegistry); + } +} + +export const frontendBackendIsomorphicKvStoreProviderRegistry = + new KvStoreProviderRegistry(); diff --git a/src/kvstore/s3/index.ts b/src/kvstore/s3/index.ts new file mode 100644 index 0000000000..d412406174 --- /dev/null +++ b/src/kvstore/s3/index.ts @@ -0,0 +1,78 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverListOptions, + ListResponse, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { getS3BucketListing } from "#src/kvstore/s3/list.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export class S3KvStore implements KvStore { + constructor( + public baseUrl: string, + public baseUrlForDisplay: string, + private fetchOkImpl: FetchOk = fetchOk, + ) {} + + stat(key: string, options: StatOptions): Promise { + const url = `${this.baseUrl}${key}`; + return stat(this, key, url, options, this.fetchOkImpl); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + const url = `${this.baseUrl}${key}`; + return read(this, key, url, options, this.fetchOkImpl); + } + + list(prefix: string, options: DriverListOptions): Promise { + const { progressListener } = options; + using _span = + progressListener === undefined + ? undefined + : new ProgressSpan(progressListener, { + message: `Listing prefix ${this.getUrl(prefix)}`, + }); + return getS3BucketListing(this.baseUrl, prefix, { + fetchOkImpl: this.fetchOkImpl, + signal: options.signal, + progressListener, + }); + } + + getUrl(path: string) { + return this.baseUrlForDisplay + encodePathForUrl(path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/s3/list.ts b/src/kvstore/s3/list.ts new file mode 100644 index 0000000000..3580689ddd --- /dev/null +++ b/src/kvstore/s3/list.ts @@ -0,0 +1,77 @@ +/** + * @license + * Copyright 2019 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ListEntry, ListResponse } from "#src/kvstore/index.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export async function getS3BucketListing( + bucketUrl: string, + prefix: string, + options: { + delimiter?: string; + fetchOkImpl?: FetchOk; + } & Partial = {}, +): Promise { + const { + delimiter = "/", + fetchOkImpl = fetchOk, + signal, + progressListener, + } = options; + const response = await fetchOkImpl( + `${bucketUrl}?prefix=${encodeURIComponent(prefix)}` + + `&delimiter=${encodeURIComponent(delimiter)}`, + /*init=*/ { + signal: signal, + progressListener, + }, + ); + const text = await response.text(); + const doc = new DOMParser().parseFromString(text, "application/xml"); + const namespaceResolver: XPathNSResolver = () => + "http://doc.s3.amazonaws.com/2006-03-01/"; + const commonPrefixNodes = doc.evaluate( + "//CommonPrefixes/Prefix", + doc, + namespaceResolver, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + const directories: string[] = []; + for (let i = 0, n = commonPrefixNodes.snapshotLength; i < n; ++i) { + const name = commonPrefixNodes.snapshotItem(i)!.textContent; + if (name === null) continue; + // Exclude delimiter from end of `name`. + directories.push(name.substring(0, name.length - delimiter.length)); + } + + const entries: ListEntry[] = []; + const contents = doc.evaluate( + "//Contents/Key", + doc, + namespaceResolver, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + for (let i = 0, n = contents.snapshotLength; i < n; ++i) { + const name = contents.snapshotItem(i)!.textContent; + if (name === null) continue; + entries.push({ key: name }); + } + return { directories, entries }; +} diff --git a/src/kvstore/s3/register.ts b/src/kvstore/s3/register.ts new file mode 100644 index 0000000000..b6545d5a01 --- /dev/null +++ b/src/kvstore/s3/register.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +import { S3KvStore } from "#src/kvstore/s3/index.js"; + +function s3Provider(_context: SharedKvStoreContextBase): BaseKvStoreProvider { + return { + scheme: "s3", + description: "S3 (anonymous)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error("Invalid URL, expected `s3:///`"); + } + const [, bucket, path] = m; + return { + store: new S3KvStore( + `https://${bucket}.s3.amazonaws.com/`, + `s3://${bucket}/`, + ), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + s3Provider, +); diff --git a/src/kvstore/shared_common.ts b/src/kvstore/shared_common.ts new file mode 100644 index 0000000000..a3bfb367ce --- /dev/null +++ b/src/kvstore/shared_common.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const SHARED_KVSTORE_CONTEXT_RPC_ID = "SharedKvStoreContext"; + +export const STAT_RPC_ID = "SharedKvStoreContext.stat"; +export const READ_RPC_ID = "SharedKvStoreContext.read"; +export const LIST_RPC_ID = "SharedKvStoreContext.list"; diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts deleted file mode 100644 index f8f6e3a503..0000000000 --- a/src/kvstore/special/index.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Copyright 2023 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { - ByteRange, - ByteRangeRequest, - ReadableKvStore, - ReadOptions, - ReadResponse, -} from "#src/kvstore/index.js"; -import { composeByteRangeRequest } from "#src/kvstore/index.js"; -import { isNotFoundError } from "#src/util/http_request.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; - -function getRangeHeader( - request: ByteRangeRequest | undefined, -): string | undefined { - if (request === undefined) return undefined; - if ("suffixLength" in request) { - return `bytes=-${request.suffixLength}`; - } - return `bytes=${request.offset}-${request.offset + request.length - 1}`; -} - -/** - * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the - * cache is disabled. Disabling the cache works around the problem. - * - * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 - */ -const byteRangeCacheMode = - navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; - -class SpecialProtocolKvStore implements ReadableKvStore { - constructor( - public credentialsProvider: SpecialProtocolCredentialsProvider, - public baseUrl: string, - ) {} - - async getObjectLength(url: string, options: ReadOptions) { - // Use a HEAD request to get the length of an object - const headResponse = await fetchSpecialOk(this.credentialsProvider, url, { - method: "HEAD", - signal: options.abortSignal, - }); - - if (headResponse.status !== 200) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLength = headResponse.headers.get("content-length"); - if (contentLength === undefined) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLengthNumber = Number(contentLength); - return contentLengthNumber; - } - - async read( - key: string, - options: ReadOptions, - ): Promise { - let { byteRange: byteRangeRequest } = options; - const url = this.baseUrl + key; - - try { - // The HTTP spec supports suffixLength requests directly via "Range: - // bytes=-N" requests, which avoids the need for a separate HEAD request. - // However, per - // https://fetch.spec.whatwg.org/#cors-safelisted-request-header a suffix - // length byte range request header will always trigger an OPTIONS preflight - // request, which would otherwise be avoided. This negates the benefit of - // using a suffixLength request directly. Additionally, some servers such as - // the npm http-server package and https://uk1s3.embassy.ebi.ac.uk/ do not - // correctly handle suffixLength requests or do not correctly handle CORS - // preflight requests. To avoid those issues, always just issue a separate - // HEAD request to determine the length. - let totalSize: number | undefined; - if ( - byteRangeRequest !== undefined && - "suffixLength" in byteRangeRequest - ) { - const totalSize = await this.getObjectLength(url, options); - byteRangeRequest = composeByteRangeRequest( - { offset: 0, length: totalSize }, - byteRangeRequest, - ).outer; - } - const requestInit: RequestInit = { signal: options.abortSignal }; - const rangeHeader = getRangeHeader(byteRangeRequest); - if (rangeHeader !== undefined) { - requestInit.headers = { range: rangeHeader }; - requestInit.cache = byteRangeCacheMode; - } - const response = await fetchSpecialOk( - this.credentialsProvider, - url, - requestInit, - ); - const data = await response.arrayBuffer(); - let byteRange: ByteRange | undefined; - if (response.status === 206) { - const contentRange = response.headers.get("content-range"); - if (contentRange === null) { - // Content-range should always be sent, but some buggy servers don't - // send it. - if (byteRangeRequest !== undefined) { - byteRange = { - offset: byteRangeRequest.offset, - length: data.byteLength, - }; - } else { - throw new Error( - "Unexpected HTTP 206 response when no byte range specified.", - ); - } - } - if (contentRange !== null) { - const m = contentRange.match(/bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/); - if (m === null) { - throw new Error( - `Invalid content-range header: ${JSON.stringify(contentRange)}`, - ); - } - const beginPos = parseInt(m[1], 10); - const endPos = parseInt(m[2], 10); - if (endPos !== beginPos + data.byteLength - 1) { - throw new Error( - `Length in content-range header ${JSON.stringify( - contentRange, - )} does not match content length ${data.byteLength}`, - ); - } - if (m[3] !== "*") { - totalSize = parseInt(m[3], 10); - } - byteRange = { offset: beginPos, length: data.byteLength }; - } - } - if (byteRange === undefined) { - byteRange = { offset: 0, length: data.byteLength }; - totalSize = data.byteLength; - } - return { data: new Uint8Array(data), dataRange: byteRange, totalSize }; - } catch (e) { - if (isNotFoundError(e)) { - return undefined; - } - throw e; - } - } -} -export function getSpecialProtocolKvStore( - credentialsProvider: SpecialProtocolCredentialsProvider, - baseUrl: string, -): ReadableKvStore { - return new SpecialProtocolKvStore(credentialsProvider, baseUrl); -} diff --git a/src/kvstore/url.ts b/src/kvstore/url.ts new file mode 100644 index 0000000000..89a29298b7 --- /dev/null +++ b/src/kvstore/url.ts @@ -0,0 +1,200 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function kvstoreEnsureDirectoryPipelineUrl(url: string): string { + const m = url.match( + /^((?:.*?|)?)([a-zA-Z][a-zA-Z0-9-+.]*)(?:(:[^?#|]*)((?:[?#][^|]*)?))?$/, + ); + if (m === null) { + throw new Error(`Invalid URL: ${url}`); + } + const [, pipelinePrefix, scheme, path, queryAndFragment] = m; + if (path === undefined) { + return `${pipelinePrefix}${scheme}:`; + } + if (path === ":" || path.endsWith("/")) return url; + return `${pipelinePrefix}${scheme}${path}/${queryAndFragment ?? ""}`; +} + +export function finalPipelineUrlComponent(url: string) { + // match is infallible + const m = url.match(/.*?([^|]*)$/)!; + return m[1]; +} + +export const schemePattern = /^(?:([a-zA-Z][a-zA-Z0-9-+.]*):)?(.*)$/; + +export function parsePipelineUrlComponent(url: string): UrlWithParsedScheme { + // schemePattern always matches + const m = url.match(schemePattern)!; + const scheme = m[1]; + const suffix = m[2]; + if (scheme === undefined) { + return { url, scheme: url, suffix: undefined }; + } else { + return { url, scheme: scheme, suffix }; + } +} + +export const urlComponentPattern = + /^(?:([a-zA-Z][a-zA-Z0-9-+.]*):)?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/; + +export function parseUrlSuffix(suffix: string | undefined): { + authorityAndPath: string | undefined; + query: string | undefined; + fragment: string | undefined; +} { + if (suffix === undefined) { + return { + authorityAndPath: undefined, + query: undefined, + fragment: undefined, + }; + } + // Infallible pattern. + const [, authorityAndPath, query, fragment] = suffix.match( + /^([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/, + )!; + return { + authorityAndPath, + query: query ?? undefined, + fragment: fragment ?? undefined, + }; +} + +export interface UrlWithParsedScheme { + // Full original URL. + url: string; + + // Scheme (excluding ":"). + scheme: string; + + // Suffix following ":", including initial "//" if present. + suffix: string | undefined; +} + +// Splits a URL containing multiple "|"-separate parts. +export function splitPipelineUrl(url: string): UrlWithParsedScheme[] { + return url.split("|").map(parsePipelineUrlComponent); +} + +export function pipelineUrlJoin( + baseUrl: string, + ...additionalParts: string[] +): string { + // Strip off any ? or # parameters, since they are not part of the path. + // Infallible pattern + let [, base, queryAndFragment] = baseUrl.match(/^(.*?[^|?#]*)([^|]*)$/)!; + for (let part of additionalParts) { + if (part.startsWith("/")) { + part = part.substring(1); + } + if (part === "") continue; + base = kvstoreEnsureDirectoryPipelineUrl(base); + base += part; + } + return base + queryAndFragment; +} + +export function joinPath(base: string, ...additionalParts: string[]) { + for (let part of additionalParts) { + if (part.startsWith("/")) { + part = part.substring(1); + } + if (part === "") continue; + base = ensurePathIsDirectory(base); + base += part; + } + return base; +} + +export function ensurePathIsDirectory(path: string) { + if (!pathIsDirectory(path)) { + path += "/"; + } + return path; +} + +export function ensureNoQueryOrFragmentParameters(url: UrlWithParsedScheme) { + const { suffix } = url; + if (suffix === undefined) return; + if (suffix.match(/[#?]/)) { + throw new Error( + `Invalid URL ${url.url}: query parameters and/or fragment not supported`, + ); + } +} + +export function ensureEmptyUrlSuffix(url: UrlWithParsedScheme) { + if (url.suffix) { + throw new Error( + `Invalid URL syntax ${JSON.stringify(url.url)}, expected "${url.scheme}:"`, + ); + } +} + +export function extractQueryAndFragment(url: string): { + base: string; + queryAndFragment: string; +} { + const [, base, queryAndFragment] = url.match(/^(.*?[^|?#]*)([^|]*)$/)!; + return { base, queryAndFragment }; +} + +// Resolves `relativePath` relative to `basePath`. +// +// Note that the parameters are both expected to be plain paths, not full URLs +// or URL pipelines. +export function resolveRelativePath(basePath: string, relativePath: string) { + const origBasePath = basePath; + if (basePath.endsWith("/")) { + basePath = basePath.substring(0, basePath.length - 1); + } + for (const component of relativePath.split("/")) { + if (component === "" || component === ".") { + continue; + } + if (component === "..") { + const prevSlash = basePath.lastIndexOf("/"); + if (prevSlash <= 0) { + throw new Error( + `Invalid relative path ${JSON.stringify(relativePath)} from base path ${JSON.stringify(origBasePath)}`, + ); + } + basePath = basePath.substring(0, prevSlash - 1); + continue; + } + basePath += "/"; + basePath += component; + } + if (relativePath.endsWith("/")) { + basePath += "/"; + } + return basePath; +} + +export function pathIsDirectory(path: string) { + return path === "" || path.endsWith("/"); +} + +// Plain paths can have arbitrary characters, but to be included in a URL +// pipeline, special characters must be percent encoded. +export function encodePathForUrl(path: string) { + return encodeURI(path).replace( + /[?#]/g, + (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`, + ); +} diff --git a/src/kvstore/zip/auto_detect.ts b/src/kvstore/zip/auto_detect.ts new file mode 100644 index 0000000000..521002f6f7 --- /dev/null +++ b/src/kvstore/zip/auto_detect.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { + EOCDR_WITHOUT_COMMENT_SIZE, + parseEndOfCentralDirectoryRecord, +} from "#src/kvstore/zip/metadata.js"; + +async function detectZip( + options: AutoDetectFileOptions, +): Promise { + const { suffix } = options; + if (suffix === undefined) return []; + if (parseEndOfCentralDirectoryRecord(suffix) === undefined) return []; + return [{ suffix: "zip:", description: "ZIP archive" }]; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 0, + // To ensure all valid zip file are detected, this should be set to + // `EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE`. In practice, though, zip + // files with comments are rare and 4096 should be sufficient for most + // cases while avoiding reading an excessive amount for auto-detection. + suffixLength: EOCDR_WITHOUT_COMMENT_SIZE + 4096, + match: detectZip, + }); +} diff --git a/src/kvstore/zip/backend.ts b/src/kvstore/zip/backend.ts new file mode 100644 index 0000000000..00d021fe98 --- /dev/null +++ b/src/kvstore/zip/backend.ts @@ -0,0 +1,255 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { makeSimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + DriverListOptions, + DriverReadOptions, + FileHandle, + KvStore, + ListEntry, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { readFileHandle } from "#src/kvstore/index.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; +import type { + ZipMetadata, + Reader, + ZipEntry, +} from "#src/kvstore/zip/metadata.js"; +import { + readZipMetadata, + readEntryDataHeader, + ZipCompressionMethod, +} from "#src/kvstore/zip/metadata.js"; +import { + binarySearch, + binarySearchLowerBound, + filterArrayInplace, +} from "#src/util/array.js"; +import { + ProgressSpan, + type ProgressOptions, +} from "#src/util/progress_listener.js"; +import { defaultStringCompare } from "#src/util/string.js"; + +function makeZipReader(base: FileHandle): Reader { + return async ( + offset: number, + length: number, + options: Partial, + ) => { + const readResponse = await readFileHandle(base, { + throwIfMissing: true, + byteRange: { offset, length }, + strictByteRange: true, + signal: options.signal, + progressListener: options.progressListener, + }); + return new Uint8Array(await readResponse.response.arrayBuffer()); + }; +} + +interface CachedZipEntry extends ZipEntry { + fileDataStart?: number; +} + +interface CachedZipMetadata extends ZipMetadata { + entries: CachedZipEntry[]; +} + +function getZipMetadataCache(chunkManager: ChunkManager, base: FileHandle) { + const url = base.getUrl(); + return makeSimpleAsyncCache(chunkManager, `zipMetadata:${url}`, { + get: async (_unusedCacheKey: undefined, progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading ZIP central directory from ${url}`, + }); + const statResponse = await base.stat(progressOptions); + if (statResponse?.totalSize === undefined) { + throw new Error(`Failed to determine ZIP file size: ${url}`); + } + const metadata = await readZipMetadata( + makeZipReader(base), + statResponse.totalSize, + progressOptions, + ); + // Zip files sometimes contain zero-length files corresponding to + // directories. + filterArrayInplace( + metadata.entries, + (entry) => !entry.fileName.endsWith("/"), + ); + metadata.entries.sort((a, b) => + defaultStringCompare(a.fileName, b.fileName), + ); + return { data: metadata, size: metadata.sizeEstimate }; + }, + }); +} + +async function getZipMetadata( + chunkManager: ChunkManager, + base: FileHandle, + options: Partial, +): Promise { + const cache = getZipMetadataCache(chunkManager, base); + try { + return (await cache.get(undefined, options)) as CachedZipMetadata; + } finally { + cache.dispose(); + } +} + +function findEntry( + metadata: CachedZipMetadata, + key: string, +): CachedZipEntry | undefined { + const { entries } = metadata; + const index = binarySearch(entries, key, (key, entry) => + defaultStringCompare(key, entry.fileName), + ); + if (index < 0) return undefined; + return entries[index]; +} + +function list(metadata: ZipMetadata, prefix: string) { + const { entries } = metadata; + const startIndex = binarySearchLowerBound( + 0, + entries.length, + (index) => entries[index].fileName >= prefix, + ); + + const endIndex = binarySearchLowerBound( + Math.min(entries.length, startIndex + 1), + entries.length, + (index) => !entries[index].fileName.startsWith(prefix), + ); + + const listEntries: ListEntry[] = []; + const directories: string[] = []; + + for (let index = startIndex; index < endIndex; ) { + const entry = entries[index]; + const i = entry.fileName.indexOf("/", prefix.length); + if (i === -1) { + // Filename + listEntries.push({ key: entry.fileName }); + ++index; + } else { + // Directory + directories.push(entry.fileName.substring(0, i)); + const directoryPrefix = entry.fileName.substring(0, i + 1); + index = binarySearchLowerBound( + index + 1, + endIndex, + (index) => !entries[index].fileName.startsWith(directoryPrefix), + ); + } + } + + return { entries: listEntries, directories }; +} + +export class ZipKvStore + implements KvStore +{ + constructor( + public chunkManager: ChunkManager, + public base: BaseFileHandle, + ) {} + + private metadata: ZipMetadata | undefined; + + private async getMetadata(options: Partial) { + let { metadata } = this; + if (metadata === undefined) { + metadata = this.metadata = await getZipMetadata( + this.chunkManager, + this.base, + options, + ); + } + return metadata; + } + + getUrl(key: string) { + return this.base.getUrl() + `|zip:${encodePathForUrl(key)}`; + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const entry = findEntry(await this.getMetadata(options), key); + if (entry === undefined) return undefined; + return { totalSize: entry.uncompressedSize }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const entry = findEntry(await this.getMetadata(options), key); + if (entry === undefined) return undefined; + let { fileDataStart } = entry; + if (fileDataStart === undefined) { + fileDataStart = entry.fileDataStart = await readEntryDataHeader( + makeZipReader(this.base), + entry, + options, + ); + } + let handle: FileHandle = new FileByteRangeHandle(this.base, { + offset: fileDataStart, + length: entry.compressedSize, + }); + switch (entry.compressionMethod) { + case ZipCompressionMethod.STORE: + break; + case ZipCompressionMethod.DEFLATE: + handle = new GzipFileHandle(handle, "deflate-raw"); + break; + default: + throw new Error( + `Unsupported compression method: ${entry.compressionMethod}`, + ); + } + return handle.read(options); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const metadata = await this.getMetadata(options); + return list(metadata, prefix); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/zip/frontend.ts b/src/kvstore/zip/frontend.ts new file mode 100644 index 0000000000..959254c444 --- /dev/null +++ b/src/kvstore/zip/frontend.ts @@ -0,0 +1,40 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ProxyKvStore } from "#src/kvstore/frontend.js"; +import type { KvStore, KvStoreFileHandle } from "#src/kvstore/index.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; + +export class ZipKvStore extends ProxyKvStore implements KvStore { + constructor( + sharedKvStoreContext: SharedKvStoreContext, + public base: KvStoreFileHandle, + ) { + super(sharedKvStoreContext); + } + + getUrl(key: string) { + return this.base.getUrl() + `|zip:${encodePathForUrl(key)}`; + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/zip/metadata.ts b/src/kvstore/zip/metadata.ts new file mode 100644 index 0000000000..dbf864ab05 --- /dev/null +++ b/src/kvstore/zip/metadata.ts @@ -0,0 +1,658 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Derived from https://github.com/greggman/unzipit/blob/4d94c9b77f7815062ff4460311e8b3ce4f7d5deb/src/unzipit.js + * + * Includes only parsing of raw entries. + * + * @license + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Josh Wolfe + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * MIT License + * + * Copyright (c) 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { buf as crc32buf } from "crc-32"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export interface ZipEntry { + versionMadeBy: number; + versionNeededToExtract: number; + generalPurposeBitFlag: number; + compressionMethod: number; + lastModFileTime: number; + lastModFileDate: number; + crc32: number; + compressedSize: number; + uncompressedSize: number; + nameBytes: Uint8Array; + commentBytes: Uint8Array; + internalFileAttributes: number; + externalFileAttributes: number; + relativeOffsetOfLocalHeader: number; + fileName: string; +} + +export interface ZipMetadata { + entries: ZipEntry[]; + commentBytes: Uint8Array; + // Estimated size in bytes of metadata. + sizeEstimate: number; +} + +export const EOCDR_WITHOUT_COMMENT_SIZE = 22; +export const MAX_COMMENT_SIZE = 0xffff; // 2-byte size +const EOCDR_SIGNATURE = 0x06054b50; +const ZIP64_EOCDR_SIGNATURE = 0x06064b50; + +export interface Reader { + ( + offset: number, + length: number, + progressOptions: Partial, + ): Promise>; +} + +function lastReadCachingReader(base: Reader) { + let lastReadOffset: number = 0; + let lastReadBuffer: Uint8Array | undefined; + + return async function lastReadCachingRead( + offset: number, + length: number, + progressOptions: Partial, + ): Promise> { + if (lastReadBuffer !== undefined) { + if ( + offset > lastReadOffset && + offset + length <= lastReadOffset + lastReadBuffer.length + ) { + return lastReadBuffer.subarray( + offset - lastReadOffset, + offset + length - lastReadOffset, + ); + } + } + + const newBuffer = await base(offset, length, progressOptions); + lastReadOffset = offset; + lastReadBuffer = newBuffer; + return newBuffer; + }; +} + +export function parseEndOfCentralDirectoryRecord(data: Uint8Array): + | { + eocdrOffset: number; + diskNumber: number; + entryCount: number; + centralDirectorySize: number; + centralDirectoryOffset: number; + } + | undefined { + const dv = new DataView(data.buffer, data.byteOffset, data.byteLength); + const size = data.length; + for (let i = size - EOCDR_WITHOUT_COMMENT_SIZE; i >= 0; --i) { + // 0 - End of central directory signature + if (dv.getUint32(i, /*littleEndian=*/ true) !== EOCDR_SIGNATURE) { + continue; + } + + // 20 - Comment length + const commentLength = dv.getUint16(i + 20, /*littleEndian=*/ true); + const expectedCommentLength = size - i - EOCDR_WITHOUT_COMMENT_SIZE; + if (commentLength !== expectedCommentLength) { + continue; + } + + // 4 - Number of this disk + const diskNumber = dv.getUint16(i + 4, /*littleEndian=*/ true); + + // 6 - Disk where central directory starts + // 8 - Number of central directory records on this disk + // 10 - Total number of central directory records + const entryCount = dv.getUint16(i + 10, /*littleEndian=*/ true); + // 12 - Size of central directory (bytes) + const centralDirectorySize = dv.getUint32(i + 12, /*littleEndian=*/ true); + // 16 - Offset of start of central directory, relative to start of archive + const centralDirectoryOffset = dv.getUint32(i + 16, /*littleEndian=*/ true); + + return { + eocdrOffset: i, + diskNumber, + entryCount, + centralDirectorySize, + centralDirectoryOffset, + }; + } + + return undefined; +} + +async function findEndOfCentralDirectory( + reader: Reader, + totalLength: number, + options: Partial, +) { + const size = Math.min( + EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE, + totalLength, + ); + const readStart = totalLength - size; + const data = await reader(readStart, size, options); + const record = parseEndOfCentralDirectoryRecord(data); + if (record === undefined) { + throw new Error( + "End of central directory record signature not found; either not a zip file or file is truncated.", + ); + } + const { + eocdrOffset, + diskNumber, + entryCount, + centralDirectorySize, + centralDirectoryOffset, + } = record; + if (diskNumber !== 0) { + throw new Error( + `Multi-volume zip files are not supported. This is volume: ${diskNumber}`, + ); + } + + // 22 - Comment + // the encoding is always cp437. + const commentBytes = data.slice(eocdrOffset + 22, data.length); + + if (entryCount === 0xffff || centralDirectoryOffset === 0xffffffff) { + return await readZip64CentralDirectory( + reader, + eocdrOffset, + commentBytes, + options, + ); + } else { + return await readEntries( + reader, + centralDirectoryOffset, + centralDirectorySize, + entryCount, + commentBytes, + options, + ); + } +} + +const END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 0x07064b50; + +async function readZip64CentralDirectory( + reader: Reader, + offset: number, + commentBytes: Uint8Array, + progressOptions: Partial, +) { + // ZIP64 Zip64 end of central directory locator + const zip64EocdlOffset = offset - 20; + const eocdl = await reader(zip64EocdlOffset, 20, progressOptions); + + const eocdlDv = new DataView( + eocdl.buffer, + eocdl.byteOffset, + eocdl.byteLength, + ); + + // 0 - zip64 end of central dir locator signature + if ( + eocdlDv.getUint32(0, /*littleEndian=*/ true) !== + END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE + ) { + throw new Error("invalid zip64 end of central directory locator signature"); + } + + // 4 - number of the disk with the start of the zip64 end of central directory + // 8 - relative offset of the zip64 end of central directory record + const zip64EocdrOffset = eocdlDv.getBigUint64(8, /*littleEndian=*/ true); + // 16 - total number of disks + + // ZIP64 end of central directory record + const zip64Eocdr = await reader( + Number(zip64EocdrOffset), + 56, + progressOptions, + ); + + const zip64EocdrDv = new DataView( + zip64Eocdr.buffer, + zip64Eocdr.byteOffset, + zip64Eocdr.byteLength, + ); + + // 0 - zip64 end of central dir signature 4 bytes (0x06064b50) + if ( + zip64EocdrDv.getUint32(0, /*littleEndian=*/ true) !== ZIP64_EOCDR_SIGNATURE + ) { + throw new Error("invalid zip64 end of central directory record signature"); + } + // 4 - size of zip64 end of central directory record 8 bytes + // 12 - version made by 2 bytes + // 14 - version needed to extract 2 bytes + // 16 - number of this disk 4 bytes + // 20 - number of the disk with the start of the central directory 4 bytes + // 24 - total number of entries in the central directory on this disk 8 bytes + // 32 - total number of entries in the central directory 8 bytes + const entryCount = zip64EocdrDv.getBigUint64(32, /*littleEndian=*/ true); + // 40 - size of the central directory 8 bytes + const centralDirectorySize = zip64EocdrDv.getBigUint64( + 40, + /*littleEndian=*/ true, + ); + // 48 - offset of start of central directory with respect to the starting disk number 8 bytes + const centralDirectoryOffset = zip64EocdrDv.getBigUint64( + 48, + /*littleEndian=*/ true, + ); + // 56 - zip64 extensible data sector (variable size) + return readEntries( + reader, + Number(centralDirectoryOffset), + Number(centralDirectorySize), + Number(entryCount), + commentBytes, + progressOptions, + ); +} + +const CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE = 0x02014b50; + +async function readEntries( + reader: Reader, + centralDirectoryOffset: number, + centralDirectorySize: number, + rawEntryCount: number, + commentBytes: Uint8Array, + progressOptions: Partial, +): Promise { + let readEntryCursor = 0; + const allEntriesBuffer = await reader( + centralDirectoryOffset, + centralDirectorySize, + progressOptions, + ); + const rawEntries = []; + + const dv = new DataView( + allEntriesBuffer.buffer, + allEntriesBuffer.byteOffset, + allEntriesBuffer.byteLength, + ); + + const textDecoder = new TextDecoder(); + + for (let e = 0; e < rawEntryCount; ++e) { + // 0 - Central directory file header signature + const signature = dv.getUint32(readEntryCursor + 0, /*littleEndian=*/ true); + if (signature !== CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) { + throw new Error( + `invalid central directory file header signature: 0x${signature.toString(16)}`, + ); + } + // 4 - Version made by + const versionMadeBy = dv.getUint16( + readEntryCursor + 4, + /*littleEndian=*/ true, + ); + // 6 - Version needed to extract (minimum) + const versionNeededToExtract = dv.getUint16( + readEntryCursor + 6, + /*littleEndian=*/ true, + ); + // 8 - General purpose bit flag + const generalPurposeBitFlag = dv.getUint16( + readEntryCursor + 8, + /*littleEndian=*/ true, + ); + // 10 - Compression method + const compressionMethod = dv.getUint16( + readEntryCursor + 10, + /*littleEndian=*/ true, + ); + // 12 - File last modification time + const lastModFileTime = dv.getUint16( + readEntryCursor + 12, + /*littleEndian=*/ true, + ); + // 14 - File last modification date + const lastModFileDate = dv.getUint16( + readEntryCursor + 14, + /*littleEndian=*/ true, + ); + // 16 - CRC-32 + const crc32 = dv.getUint32(readEntryCursor + 16, /*littleEndian=*/ true); + // 20 - Compressed size + let compressedSize = dv.getUint32( + readEntryCursor + 20, + /*littleEndian=*/ true, + ); + // 24 - Uncompressed size + let uncompressedSize = dv.getUint32( + readEntryCursor + 24, + /*littleEndian=*/ true, + ); + // 28 - File name length (n) + const fileNameLength = dv.getUint16( + readEntryCursor + 28, + /*littleEndian=*/ true, + ); + // 30 - Extra field length (m) + const extraFieldLength = dv.getUint16( + readEntryCursor + 30, + /*littleEndian=*/ true, + ); + // 32 - File comment length (k) + const fileCommentLength = dv.getUint16( + readEntryCursor + 32, + /*littleEndian=*/ true, + ); + // 34 - Disk number where file starts + // 36 - Internal file attributes + const internalFileAttributes = dv.getUint16( + readEntryCursor + 36, + /*littleEndian=*/ true, + ); + // 38 - External file attributes + const externalFileAttributes = dv.getUint32( + readEntryCursor + 38, + /*littleEndian=*/ true, + ); + // 42 - Relative offset of local file header + let relativeOffsetOfLocalHeader = dv.getUint32( + readEntryCursor + 42, + /*littleEndian=*/ true, + ); + + if (generalPurposeBitFlag & 0x40) { + throw new Error("strong encryption is not supported"); + } + + readEntryCursor += 46; + + // 46 - File name + let nameBytes = allEntriesBuffer.subarray( + readEntryCursor, + (readEntryCursor += fileNameLength), + ); + + let isUTF8 = (generalPurposeBitFlag & 0x800) !== 0; + + // 46+n - Extra field + const extraFields = []; + for (let i = 0; i < extraFieldLength - 3; ) { + const headerId = dv.getUint16( + readEntryCursor + i + 0, + /*littleEndian=*/ true, + ); + const dataSize = dv.getUint16( + readEntryCursor + i + 2, + /*littleEndian=*/ true, + ); + const dataStart = i + 4; + const dataEnd = dataStart + dataSize; + if (dataEnd > extraFieldLength) { + throw new Error("extra field length exceeds extra field buffer size"); + } + extraFields.push({ + id: headerId, + offset: readEntryCursor + dataStart, + length: dataSize, + }); + i = dataEnd; + } + readEntryCursor += extraFieldLength; + + // 46+n+m - File comment + const commentBytes = allEntriesBuffer.slice( + readEntryCursor, + (readEntryCursor += fileCommentLength), + ); + + if ( + uncompressedSize === 0xffffffff || + compressedSize === 0xffffffff || + relativeOffsetOfLocalHeader === 0xffffffff + ) { + // ZIP64 format + // find the Zip64 Extended Information Extra Field + const zip64ExtraField = extraFields.find((e) => e.id === 0x0001); + if (zip64ExtraField === undefined) { + throw new Error("expected zip64 extended information extra field"); + } + const { offset: zip64EiefBufferOffset, length: zip64EiefBufferLength } = + zip64ExtraField; + let index = 0; + // 0 - Original Size 8 bytes + if (uncompressedSize === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include uncompressed size", + ); + } + uncompressedSize = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 8 - Compressed Size 8 bytes + if (compressedSize === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include compressed size", + ); + } + compressedSize = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 16 - Relative Header Offset 8 bytes + if (relativeOffsetOfLocalHeader === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include relative header offset", + ); + } + relativeOffsetOfLocalHeader = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 24 - Disk Start Number 4 bytes + } + + // check for Info-ZIP Unicode Path Extra Field (0x7075) + // see https://github.com/thejoshwolfe/yauzl/issues/33 + const nameField = extraFields.find( + (e) => + e.id === 0x7075 && + e.length >= 6 && // too short to be meaningful + allEntriesBuffer[e.offset] === 1 && // Version 1 byte version of this extra field, currently 1 + dv.getInt32(e.offset + 1, /*littleEndian=*/ true) === + crc32buf(nameBytes), + ); // NameCRC32 4 bytes File Name Field CRC32 Checksum + // > If the CRC check fails, this UTF-8 Path Extra Field should be + // > ignored and the File Name field in the header should be used instead. + if (nameField) { + nameBytes = allEntriesBuffer.slice( + nameField.offset + 5, + nameField.offset + nameField.length, + ); + isUTF8 = true; + } + + // validate file size + if (compressionMethod === 0) { + let expectedCompressedSize = uncompressedSize; + if ((generalPurposeBitFlag & 0x1) !== 0) { + // traditional encryption prefixes the file data with a header + expectedCompressedSize += 12; + } + if (compressedSize !== expectedCompressedSize) { + throw new Error( + `compressed/uncompressed size mismatch for stored file: ${compressedSize} != ${expectedCompressedSize}`, + ); + } + } + + // Just decode as UTF-8 regardless of `isUTF8`, because the non-UTF8 + // encoding is difficult/impossible to determine correctly. + let fileName = textDecoder.decode(nameBytes); + fileName = fileName.replaceAll("\\", "/"); + isUTF8; + + const rawEntry: ZipEntry = { + versionMadeBy, + versionNeededToExtract, + generalPurposeBitFlag, + compressionMethod, + lastModFileTime, + lastModFileDate, + crc32, + compressedSize, + uncompressedSize, + nameBytes, + commentBytes, + internalFileAttributes, + externalFileAttributes, + relativeOffsetOfLocalHeader, + fileName, + }; + rawEntries.push(rawEntry); + } + return { + commentBytes, + entries: rawEntries, + // Estimate that the JavaScript representation consumes twice the memory of + // the encoded representation. + sizeEstimate: commentBytes.length + allEntriesBuffer.length * 2, + }; +} + +export async function readEntryDataHeader( + reader: Reader, + rawEntry: ZipEntry, + options: Partial, +) { + if (rawEntry.generalPurposeBitFlag & 0x1) { + throw new Error("encrypted entries not supported"); + } + const data = await reader(rawEntry.relativeOffsetOfLocalHeader, 30, options); + const dv = new DataView(data.buffer, data.byteOffset, data.byteLength); + + // 0 - Local file header signature = 0x04034b50 + const signature = dv.getUint32(0, /*littleEndian=*/ true); + if (signature !== 0x04034b50) { + throw new Error( + `invalid local file header signature: 0x${signature.toString(16)}`, + ); + } + + // all this should be redundant + // 4 - Version needed to extract (minimum) + // 6 - General purpose bit flag + // 8 - Compression method + // 10 - File last modification time + // 12 - File last modification date + // 14 - CRC-32 + // 18 - Compressed size + // 22 - Uncompressed size + // 26 - File name length (n) + const fileNameLength = dv.getUint16(26, /*littleEndian=*/ true); + // 28 - Extra field length (m) + const extraFieldLength = dv.getUint16(28, /*littleEndian=*/ true); + // 30 - File name + // 30+n - Extra field + const localFileHeaderEnd = + rawEntry.relativeOffsetOfLocalHeader + + data.length + + fileNameLength + + extraFieldLength; + + return localFileHeaderEnd; +} + +export async function readZipMetadata( + reader: Reader, + totalLength: number, + options: Partial, +): Promise { + return await findEndOfCentralDirectory( + lastReadCachingReader(reader), + totalLength, + options, + ); +} + +export enum ZipCompressionMethod { + STORE = 0, + DEFLATE = 8, +} diff --git a/src/kvstore/zip/register_backend.ts b/src/kvstore/zip/register_backend.ts new file mode 100644 index 0000000000..e90a4eed17 --- /dev/null +++ b/src/kvstore/zip/register_backend.ts @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; +import { ZipKvStore } from "#src/kvstore/zip/backend.js"; + +function zipProvider( + sharedKvStoreContext: SharedKvStoreContextCounterpart, +): KvStoreAdapterProvider { + return { + scheme: "zip", + description: "ZIP archive", + getKvStore(parsedUrl, base) { + ensureNoQueryOrFragmentParameters(parsedUrl); + return { + store: new ZipKvStore( + sharedKvStoreContext.chunkManager, + new KvStoreFileHandle(base.store, base.path), + ), + path: decodeURIComponent(parsedUrl.suffix ?? ""), + }; + }, + }; +} + +backendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider(zipProvider); diff --git a/src/kvstore/zip/register_frontend.ts b/src/kvstore/zip/register_frontend.ts new file mode 100644 index 0000000000..ff47de0d26 --- /dev/null +++ b/src/kvstore/zip/register_frontend.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; +import { registerAutoDetect } from "#src/kvstore/zip/auto_detect.js"; +import { ZipKvStore } from "#src/kvstore/zip/frontend.js"; + +function zipProvider( + sharedKvStoreContext: SharedKvStoreContext, +): KvStoreAdapterProvider { + return { + scheme: "zip", + description: "ZIP archive", + getKvStore(parsedUrl, base) { + ensureNoQueryOrFragmentParameters(parsedUrl); + return { + store: new ZipKvStore( + sharedKvStoreContext, + new KvStoreFileHandle(base.store, base.path), + ), + path: decodeURIComponent(parsedUrl.suffix ?? ""), + }; + }, + }; +} + +frontendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider(zipProvider); + +registerAutoDetect(frontendOnlyKvStoreProviderRegistry.autoDetectRegistry); diff --git a/src/layer/annotation/index.ts b/src/layer/annotation/index.ts index 1d20308cf3..663b76e052 100644 --- a/src/layer/annotation/index.ts +++ b/src/layer/annotation/index.ts @@ -29,7 +29,7 @@ import { import type { CoordinateTransformSpecification } from "#src/coordinate_transform.js"; import { makeCoordinateSpace } from "#src/coordinate_transform.js"; import type { DataSourceSpecification } from "#src/datasource/index.js"; -import { localAnnotationsUrl, LocalDataSource } from "#src/datasource/index.js"; +import { localAnnotationsUrl, LocalDataSource } from "#src/datasource/local.js"; import type { LayerManager, ManagedUserLayer } from "#src/layer/index.js"; import { LayerReference, diff --git a/src/layer/index.ts b/src/layer/index.ts index 95fbf6502a..fea87063da 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -32,7 +32,7 @@ import { TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; import type { - DataSourceProviderRegistry, + DataSourceRegistry, DataSourceSpecification, DataSubsource, } from "#src/datasource/index.js"; @@ -2080,7 +2080,7 @@ export abstract class LayerListSpecification extends RefCounted { abstract rpc: RPC; - abstract dataSourceProviderRegistry: Borrowed; + abstract dataSourceProviderRegistry: Borrowed; abstract layerManager: Borrowed; abstract chunkManager: Borrowed; abstract layerSelectedValues: Borrowed; @@ -2110,7 +2110,7 @@ export class TopLevelLayerListSpecification extends LayerListSpecification { constructor( public display: DisplayContext, - public dataSourceProviderRegistry: DataSourceProviderRegistry, + public dataSourceProviderRegistry: DataSourceRegistry, public layerManager: LayerManager, public chunkManager: ChunkManager, public selectionState: Borrowed, diff --git a/src/layer/layer_data_source.ts b/src/layer/layer_data_source.ts index ccc93bcd61..f3cb7b2691 100644 --- a/src/layer/layer_data_source.ts +++ b/src/layer/layer_data_source.ts @@ -28,6 +28,7 @@ import { import type { DataSource, DataSourceSpecification, + DataSourceWithRedirectInfo, DataSubsourceEntry, DataSubsourceSpecification, } from "#src/datasource/index.js"; @@ -39,6 +40,7 @@ import type { WatchableValueInterface } from "#src/trackable_value.js"; import { arraysEqual } from "#src/util/array.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { disposableOnce, RefCounted } from "#src/util/disposable.js"; +import { formatErrorMessage } from "#src/util/error.js"; import { verifyBoolean, verifyObject, @@ -49,6 +51,7 @@ import { } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; import { MessageList, MessageSeverity } from "#src/util/message_list.js"; +import { MultiConsumerProgressListener } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; export function parseDataSubsourceSpecificationFromJson( @@ -308,6 +311,7 @@ export type LayerDataSourceLoadState = export class LayerDataSource extends RefCounted { changed = new NullarySignal(); messages = new MessageList(); + progressListener = new MultiConsumerProgressListener(); private loadState_: LayerDataSourceLoadState = undefined; private spec_: DataSourceSpecification; private specGeneration = -1; @@ -396,23 +400,18 @@ export class LayerDataSource extends RefCounted { } this.refCounted_ = refCounted; this.spec_ = spec; - const chunkManager = layer.manager.chunkManager; const registry = layer.manager.dataSourceProviderRegistry; const abortController = new AbortController(); - this.messages.addMessage({ - severity: MessageSeverity.info, - message: "Loading data source", - }); registry .get({ - chunkManager, url: spec.url, - abortSignal: abortController.signal, + signal: abortController.signal, globalCoordinateSpace: layer.manager.root.coordinateSpace, transform: spec.transform, state: spec.state, + progressListener: this.progressListener, }) - .then((source: DataSource) => { + .then((source: DataSourceWithRedirectInfo) => { if (refCounted.wasDisposed) return; this.messages.clearMessages(); const loaded = refCounted.registerDisposer( @@ -437,15 +436,24 @@ export class LayerDataSource extends RefCounted { }), ); } + const { originalCanonicalUrl } = source; + const layerType = this.layer.type; + if ( + (layerType === "auto" || layerType === "new" || spec.setManually) && + originalCanonicalUrl !== undefined && + originalCanonicalUrl !== spec.url + ) { + this.spec = { ...spec, url: originalCanonicalUrl }; + } retainer(); }) - .catch((error: Error) => { + .catch((error) => { if (this.wasDisposed) return; this.loadState_ = { error }; this.messages.clearMessages(); this.messages.addMessage({ severity: MessageSeverity.error, - message: error.message, + message: formatErrorMessage(error), }); this.changed.dispatch(); }); diff --git a/src/layer/segmentation/index.ts b/src/layer/segmentation/index.ts index 5efdc0ca8f..8551e8c576 100644 --- a/src/layer/segmentation/index.ts +++ b/src/layer/segmentation/index.ts @@ -22,7 +22,7 @@ import type { DataSourceSpecification } from "#src/datasource/index.js"; import { LocalDataSource, localEquivalencesUrl, -} from "#src/datasource/index.js"; +} from "#src/datasource/local.js"; import type { LayerActionContext, ManagedUserLayer } from "#src/layer/index.js"; import { LinkedLayerGroup, diff --git a/src/main.bundle.js b/src/main.bundle.js index 511bdfb00c..2cc375487b 100644 --- a/src/main.bundle.js +++ b/src/main.bundle.js @@ -1,4 +1,5 @@ import "#src/util/polyfills.js"; import "#src/layer/enabled_frontend_modules.js"; import "#src/datasource/enabled_frontend_modules.js"; +import "#src/kvstore/enabled_frontend_modules.js"; import "#main"; diff --git a/src/main_module.ts b/src/main_module.ts index b232673900..79af4f9d24 100644 --- a/src/main_module.ts +++ b/src/main_module.ts @@ -1,2 +1,4 @@ +import "#src/util/polyfills.js"; import "#src/layer/enabled_frontend_modules.js"; import "#src/datasource/enabled_frontend_modules.js"; +import "#src/kvstore/enabled_frontend_modules.js"; diff --git a/src/main_python.ts b/src/main_python.ts index 64bf3075a7..8357627dd5 100644 --- a/src/main_python.ts +++ b/src/main_python.ts @@ -21,8 +21,7 @@ import { debounce } from "lodash-es"; import { CachingCredentialsManager } from "#src/credentials_provider/index.js"; -import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; -import { PythonDataSource } from "#src/datasource/python/frontend.js"; +import type { PythonDataSource } from "#src/datasource/python/frontend.js"; import { Client, ClientStateReceiver, @@ -114,21 +113,19 @@ const client = new Client(); const credentialsManager = new PythonCredentialsManager(client); -const dataSourceProvider = getDefaultDataSourceProvider({ +const viewer = ((window).viewer = makeDefaultViewer({ + showLayerDialog: false, + resetStateWhenEmpty: false, credentialsManager: new CachingCredentialsManager(credentialsManager), -}); -const pythonDataSource = new PythonDataSource(); -dataSourceProvider.register("python", pythonDataSource); +})); + +const pythonDataSource = viewer.dataSourceProvider.dataSources.get( + "python", +) as PythonDataSource; configState.add( "sourceGenerations", makeTrackableBasedSourceGenerationHandler(pythonDataSource), ); - -const viewer = ((window).viewer = makeDefaultViewer({ - showLayerDialog: false, - resetStateWhenEmpty: false, - dataSourceProvider, -})); setDefaultInputEventBindings(viewer.inputEventBindings); configState.add( "inputEventBindings", @@ -151,7 +148,10 @@ let sharedState: Trackable | undefined = viewer.state; if (window.location.hash) { const hashBinding = viewer.registerDisposer( - new UrlHashBinding(viewer.state, credentialsManager), + new UrlHashBinding( + viewer.state, + viewer.dataSourceProvider.sharedKvStoreContext, + ), ); hashBinding.updateFromUrlHash(); sharedState = undefined; @@ -159,7 +159,7 @@ if (window.location.hash) { const prefetchManager = new PrefetchManager( viewer.display, - dataSourceProvider, + viewer.dataSourceProvider, viewer.dataContext.addRef(), viewer.uiConfiguration, ); diff --git a/src/mesh/backend.ts b/src/mesh/backend.ts index ce44423e07..fe8191a1b5 100644 --- a/src/mesh/backend.ts +++ b/src/mesh/backend.ts @@ -369,10 +369,7 @@ export function decodeTriangleVertexPositionsAndIndices( export interface MeshSource { // TODO(jbms): Move this declaration to class definition below and declare abstract once // TypeScript supports mixins with abstract classes. - downloadFragment( - chunk: FragmentChunk, - abortSignal: AbortSignal, - ): Promise; + downloadFragment(chunk: FragmentChunk, signal: AbortSignal): Promise; } // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging @@ -423,8 +420,8 @@ export class MeshSource extends ChunkSource { @registerSharedObject(FRAGMENT_SOURCE_RPC_ID) export class FragmentSource extends ChunkSource { meshSource: MeshSource | null = null; - download(chunk: FragmentChunk, abortSignal: AbortSignal) { - return this.meshSource!.downloadFragment(chunk, abortSignal); + download(chunk: FragmentChunk, signal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, signal); } } @@ -569,7 +566,7 @@ export interface MultiscaleMeshSource { // TypeScript supports mixins with abstract classes. downloadFragment( chunk: MultiscaleFragmentChunk, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise; } @@ -621,8 +618,8 @@ export class MultiscaleMeshSource extends ChunkSource { @registerSharedObject(MULTISCALE_FRAGMENT_SOURCE_RPC_ID) export class MultiscaleFragmentSource extends ChunkSource { meshSource: MultiscaleMeshSource | null = null; - download(chunk: MultiscaleFragmentChunk, abortSignal: AbortSignal) { - return this.meshSource!.downloadFragment(chunk, abortSignal); + download(chunk: MultiscaleFragmentChunk, signal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, signal); } } diff --git a/src/python_integration/prefetch.ts b/src/python_integration/prefetch.ts index c75d7caf12..28f9ae0370 100644 --- a/src/python_integration/prefetch.ts +++ b/src/python_integration/prefetch.ts @@ -20,7 +20,8 @@ */ import { debounce } from "lodash-es"; -import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { DataManagementContext } from "#src/data_management_context.js"; +import type { DataSourceRegistry } from "#src/datasource/index.js"; import type { DisplayContext } from "#src/display_context.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -31,10 +32,7 @@ import { verifyObjectProperty, } from "#src/util/json.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { - DataManagementContext, - ViewerUIConfiguration, -} from "#src/viewer.js"; +import type { ViewerUIConfiguration } from "#src/viewer.js"; import { Viewer } from "#src/viewer.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; @@ -46,7 +44,7 @@ export class PrefetchManager extends RefCounted { constructor( public display: Borrowed, - public dataSourceProvider: DataSourceProviderRegistry, + public dataSourceProvider: DataSourceRegistry, public dataContext: Owned, public uiConfiguration: ViewerUIConfiguration, ) { diff --git a/src/python_integration/volume.ts b/src/python_integration/volume.ts index a3a9f7fbd0..39d1d5a93a 100644 --- a/src/python_integration/volume.ts +++ b/src/python_integration/volume.ts @@ -420,7 +420,7 @@ export class VolumeRequestHandler extends RefCounted { private maybeHandleRequest( request: VolumeRequest, - abortSignal: AbortSignal, + signal: AbortSignal, ): boolean { const layer = this.viewer.layerManager.getLayerByName(request.layer); if (layer === undefined) { @@ -586,7 +586,7 @@ export class VolumeRequestHandler extends RefCounted { order: info.order, }; }, - abortSignal, + { signal }, ); } catch (e) { response = { error: e.message }; diff --git a/src/single_mesh/backend.ts b/src/single_mesh/backend.ts index ba1c8f0f62..3357260995 100644 --- a/src/single_mesh/backend.ts +++ b/src/single_mesh/backend.ts @@ -14,17 +14,14 @@ * limitations under the License. */ -import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, ChunkSource, withChunkManager, WithParameters, } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; -import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; -import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { computeVertexNormals } from "#src/mesh/backend.js"; import type { SingleMeshData, @@ -40,10 +37,7 @@ import { } from "#src/single_mesh/base.js"; import type { TypedArray } from "#src/util/array.js"; import { stableStringify } from "#src/util/json.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { getBasePriority, getPriorityTier, @@ -112,11 +106,9 @@ export interface SingleMeshVertexAttributes { interface SingleMeshFactory { description?: string; getMesh: ( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - abortSignal: AbortSignal, + options: Partial, ) => Promise; } @@ -149,20 +141,12 @@ function getDataSource( } export function getMesh( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - abortSignal: AbortSignal, + options: Partial, ) { const [factory, path] = getDataSource(singleMeshFactories, url); - return factory.getMesh( - chunkManager, - credentialsProvider, - path, - getPriority, - abortSignal, - ); + return factory.getMesh(sharedKvStoreContext, path, options); } export function getMinMax(array: TypedArray): [number, number] { @@ -176,26 +160,16 @@ export function getMinMax(array: TypedArray): [number, number] { } export function getCombinedMesh( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, parameters: SingleMeshSourceParameters, - getPriority: PriorityGetter, - abortSignal: AbortSignal, + options: Partial, ) { - return getMesh( - chunkManager, - credentialsProvider, - parameters.meshSourceUrl, - getPriority, - abortSignal, - ); + return getMesh(sharedKvStoreContext, parameters.meshSourceUrl, options); } @registerSharedObject() export class SingleMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - ChunkSource, - ), + WithSharedKvStoreContextCounterpart(ChunkSource), SingleMeshSourceParametersWithInfo, ) { getChunk() { @@ -209,31 +183,24 @@ export class SingleMeshSource extends WithParameters( return chunk; } - download(chunk: SingleMeshChunk, abortSignal: AbortSignal) { - const getPriority = () => ({ - priorityTier: chunk.priorityTier, - priority: chunk.priority, - }); - return getCombinedMesh( - this.chunkManager, - this.credentialsProvider, + async download(chunk: SingleMeshChunk, signal: AbortSignal) { + const data = await getCombinedMesh( + this.sharedKvStoreContext, this.parameters, - getPriority, - abortSignal, - ).then((data) => { - if ( - stableStringify(data.info) !== stableStringify(this.parameters.info) - ) { - throw new Error("Mesh info has changed."); - } - if (data.vertexNormals === undefined) { - data.vertexNormals = computeVertexNormals( - data.vertexPositions, - data.indices, - ); - } - chunk.data = data; - }); + { + signal, + }, + ); + if (stableStringify(data.info) !== stableStringify(this.parameters.info)) { + throw new Error("Mesh info has changed."); + } + if (data.vertexNormals === undefined) { + data.vertexNormals = computeVertexNormals( + data.vertexPositions, + data.indices, + ); + } + chunk.data = data; } } @@ -273,33 +240,18 @@ export class SingleMeshLayer extends SingleMeshLayerBase { } } -const INFO_PRIORITY = 1000; - registerPromiseRPC( GET_SINGLE_MESH_INFO_RPC_ID, - async function (x, abortSignal): RPCPromise { - const chunkManager = this.getRef(x.chunkManager); - const credentialsProvider = this.getOptionalRef< - SharedCredentialsProviderCounterpart< - Exclude - > - >(x.credentialsProvider); - try { - const parameters = x.parameters; - const mesh = await getCombinedMesh( - chunkManager, - credentialsProvider, - parameters, - () => ({ - priorityTier: ChunkPriorityTier.VISIBLE, - priority: INFO_PRIORITY, - }), - abortSignal, - ); - return { value: mesh.info }; - } finally { - chunkManager.dispose(); - credentialsProvider?.dispose(); - } + async function (x, progressOptions): RPCPromise { + const sharedKvStoreContext = this.get( + x.sharedKvStoreContext, + ) as SharedKvStoreContextCounterpart; + const parameters = x.parameters; + const mesh = await getCombinedMesh( + sharedKvStoreContext, + parameters, + progressOptions, + ); + return { value: mesh.info }; }, ); diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index 8aa26f86b8..0fae89510b 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -15,17 +15,13 @@ */ import { ChunkState } from "#src/chunk_manager/base.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { Chunk, ChunkSource, WithParameters, } from "#src/chunk_manager/frontend.js"; -import { - getCredentialsProviderCounterpart, - WithCredentialsProvider, -} from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; import type { PickState, VisibleLayerInfo } from "#src/layer/index.js"; import type { PerspectivePanel } from "#src/perspective_view/panel.js"; import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; @@ -47,8 +43,7 @@ import { WatchableValue } from "#src/trackable_value.js"; import { DataType } from "#src/util/data_type.js"; import type { mat4 } from "#src/util/geom.js"; import { vec3 } from "#src/util/geom.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; import type { Buffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; @@ -439,7 +434,7 @@ export function getAttributeTextureFormats( } export class SingleMeshSource extends WithParameters( - WithCredentialsProvider()(ChunkSource), + WithSharedKvStoreContext(ChunkSource), SingleMeshSourceParametersWithInfo, ) { attributeTextureFormats = getAttributeTextureFormats( @@ -650,46 +645,39 @@ export class SingleMeshLayer extends PerspectiveViewRenderLayer, ) { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "single_mesh:getMeshInfo", url }, - async () => { - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); - const info = await chunkManager.rpc!.promiseInvoke( - GET_SINGLE_MESH_INFO_RPC_ID, - { - chunkManager: chunkManager.addCounterpartRef(), - credentialsProvider: - getCredentialsProviderCounterpart( - chunkManager, - credentialsProvider, - ), - parameters: { meshSourceUrl: parsedUrl }, - }, - ); - return { info, url: parsedUrl, credentialsProvider }; + options, + async (progressOptions) => { + const info = + await sharedKvStoreContext.chunkManager.rpc!.promiseInvoke( + GET_SINGLE_MESH_INFO_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + parameters: { meshSourceUrl: url }, + }, + { + signal: progressOptions.signal, + progressListener: options.progressListener, + }, + ); + return info; }, ); } export async function getSingleMeshSource( - chunkManager: ChunkManager, - credentialsManager: CredentialsManager, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { - const { - info, - url: parsedUrl, - credentialsProvider, - } = await getSingleMeshInfo(chunkManager, credentialsManager, url); - return chunkManager.getChunkSource(SingleMeshSource, { - credentialsProvider, - parameters: { meshSourceUrl: parsedUrl, info }, + const info = await getSingleMeshInfo(sharedKvStoreContext, url, options); + return sharedKvStoreContext.chunkManager.getChunkSource(SingleMeshSource, { + sharedKvStoreContext, + parameters: { meshSourceUrl: url, info }, }); } diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index 1612ea580f..a921901d2e 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -535,7 +535,7 @@ registerPromiseRPC( SLICEVIEW_REQUEST_CHUNK_RPC_ID, async function ( x: { this: RPC; source: number; chunkGridPosition: Float32Array }, - abortSignal: AbortSignal, + progressOptions, ): RPCPromise { const source = this.get(x.source) as SliceViewChunkSourceBackend; const { chunkManager } = source; @@ -572,7 +572,7 @@ registerPromiseRPC( }); source.registerChunkListener(key, listener!); try { - await raceWithAbort(promise, abortSignal); + await raceWithAbort(promise, progressOptions.signal); return { value: undefined }; } finally { source.unregisterChunkListener(key, listener!); diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index 105dea4e34..250cc3ba4e 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -31,7 +31,7 @@ import { parseNpy } from "#src/util/npy.js"; export async function decodeBossNpzChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const parseResult = parseNpy( @@ -61,5 +61,5 @@ export async function decodeBossNpzChunk( } does not match expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, abortSignal, parseResult.data); + await postProcessRawData(chunk, signal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts index 534bb78c86..2a9a6d8358 100644 --- a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts +++ b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts @@ -18,9 +18,9 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export async function decodeCompressedSegmentationChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { - abortSignal; + signal; chunk.data = new Uint32Array(response); } diff --git a/src/sliceview/backend_chunk_decoders/compresso.ts b/src/sliceview/backend_chunk_decoders/compresso.ts index 322a725e86..c4e3ac680e 100644 --- a/src/sliceview/backend_chunk_decoders/compresso.ts +++ b/src/sliceview/backend_chunk_decoders/compresso.ts @@ -21,15 +21,15 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export async function decodeCompressoChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const image = await requestAsyncComputation( decodeCompresso, - abortSignal, + signal, [response], new Uint8Array(response), ); - await decodeRawChunk(chunk, abortSignal, image.buffer); + await decodeRawChunk(chunk, signal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/index.ts b/src/sliceview/backend_chunk_decoders/index.ts index 169af5c267..f9e4e94e83 100644 --- a/src/sliceview/backend_chunk_decoders/index.ts +++ b/src/sliceview/backend_chunk_decoders/index.ts @@ -22,6 +22,6 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export type ChunkDecoder = ( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) => Promise; diff --git a/src/sliceview/backend_chunk_decoders/jpeg.ts b/src/sliceview/backend_chunk_decoders/jpeg.ts index 34bdc8138f..6a9ede1553 100644 --- a/src/sliceview/backend_chunk_decoders/jpeg.ts +++ b/src/sliceview/backend_chunk_decoders/jpeg.ts @@ -21,13 +21,13 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export async function decodeJpegChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - abortSignal, + signal, [response], new Uint8Array(response), undefined, @@ -36,5 +36,5 @@ export async function decodeJpegChunk( chunkDataSize[3] || 1, false, ); - await postProcessRawData(chunk, abortSignal, decoded); + await postProcessRawData(chunk, signal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/jxl.ts b/src/sliceview/backend_chunk_decoders/jxl.ts index 38e529d508..f515d8f856 100644 --- a/src/sliceview/backend_chunk_decoders/jxl.ts +++ b/src/sliceview/backend_chunk_decoders/jxl.ts @@ -21,18 +21,18 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export async function decodeJxlChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJxl, - abortSignal, + signal, [response], new Uint8Array(response), chunkDataSize[0] * chunkDataSize[1] * chunkDataSize[2], chunkDataSize[3] || 1, 1, // bytesPerPixel ); - await postProcessRawData(chunk, abortSignal, decoded); + await postProcessRawData(chunk, signal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index 44d554d83c..210129fd1d 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -31,7 +31,7 @@ import { parseNpy } from "#src/util/npy.js"; export async function decodeNdstoreNpzChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const parseResult = parseNpy( @@ -55,5 +55,5 @@ export async function decodeNdstoreNpzChunk( `expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, abortSignal, parseResult.data); + await postProcessRawData(chunk, signal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/png.ts b/src/sliceview/backend_chunk_decoders/png.ts index 7f6404e161..22bb9f37e9 100644 --- a/src/sliceview/backend_chunk_decoders/png.ts +++ b/src/sliceview/backend_chunk_decoders/png.ts @@ -22,14 +22,14 @@ import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; export async function decodePngChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const dataType = chunk.source!.spec.dataType; const { uint8Array: image } = await requestAsyncComputation( decodePng, - abortSignal, + signal, [response], /*buffer=*/ new Uint8Array(response), /*width=*/ undefined, @@ -40,5 +40,5 @@ export async function decodePngChunk( /*convertToGrayscale=*/ false, ); - await decodeRawChunk(chunk, abortSignal, image.buffer); + await decodeRawChunk(chunk, signal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/postprocess.ts b/src/sliceview/backend_chunk_decoders/postprocess.ts index de445db5d1..23bbf0d89a 100644 --- a/src/sliceview/backend_chunk_decoders/postprocess.ts +++ b/src/sliceview/backend_chunk_decoders/postprocess.ts @@ -28,7 +28,7 @@ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; export async function postProcessRawData( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, data: ArrayBufferView, ) { const { spec } = chunk.source!; @@ -45,7 +45,7 @@ export async function postProcessRawData( case DataType.UINT32: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint32, - abortSignal, + signal, [data.buffer], data as Uint32Array, shape, @@ -55,7 +55,7 @@ export async function postProcessRawData( case DataType.UINT64: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint64, - abortSignal, + signal, [data.buffer], data as Uint32Array, shape, diff --git a/src/sliceview/backend_chunk_decoders/raw.ts b/src/sliceview/backend_chunk_decoders/raw.ts index b7bc763f24..2a883c16d3 100644 --- a/src/sliceview/backend_chunk_decoders/raw.ts +++ b/src/sliceview/backend_chunk_decoders/raw.ts @@ -23,13 +23,13 @@ import * as vector from "#src/util/vector.js"; export async function decodeRawChunk( chunk: VolumeChunk, - abortSignal: AbortSignal, + signal: AbortSignal, response: ArrayBuffer, endianness: Endianness = ENDIANNESS, byteOffset = 0, byteLength: number = response.byteLength, ) { - abortSignal; + signal; const { spec } = chunk.source!; const { dataType } = spec; const numElements = vector.prod(chunk.chunkDataSize!); @@ -48,5 +48,5 @@ export async function decodeRawChunk( byteLength, ); convertEndian(data, endianness, bytesPerElement); - await postProcessRawData(chunk, abortSignal, data); + await postProcessRawData(chunk, signal, data); } diff --git a/src/sliceview/compressed_segmentation/encode.benchmark.ts b/src/sliceview/compressed_segmentation/encode.benchmark.ts index dcd19fbc49..022c72ce66 100644 --- a/src/sliceview/compressed_segmentation/encode.benchmark.ts +++ b/src/sliceview/compressed_segmentation/encode.benchmark.ts @@ -32,7 +32,12 @@ describe("64x64x64 example", async () => { "testdata", ); const exampleChunkDataUint8Array = await fs.readFile( - path.resolve(testDataDir, "64x64x64-raw-uint64-segmentation.dat"), + path.resolve( + testDataDir, + "codec", + "compressed_segmentation", + "64x64x64-raw-uint64-segmentation.dat", + ), ); const exampleChunkData64 = new Uint32Array(exampleChunkDataUint8Array.buffer); const exampleChunkData32 = exampleChunkData64.filter((_element, index) => { diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index e61dd0ab01..18c6ee50d7 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -68,6 +68,7 @@ import type { vec4 } from "#src/util/geom.js"; import { kOneVec, kZeroVec4, mat4, vec3 } from "#src/util/geom.js"; import { MessageList, MessageSeverity } from "#src/util/message_list.js"; import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; import type { GL } from "#src/webgl/context.js"; @@ -650,7 +651,7 @@ export abstract class SliceViewChunkSource< async fetchChunk( chunkGridPosition: Float32Array, transform: (chunk: Chunk) => T, - abortSignal?: AbortSignal, + progressOptions: Partial, ): Promise { const key = chunkGridPosition.join(); const existingChunk = this.chunks.get(key); @@ -679,7 +680,7 @@ export abstract class SliceViewChunkSource< await this.rpc!.promiseInvoke( SLICEVIEW_REQUEST_CHUNK_RPC_ID, { source: this.rpcId, chunkGridPosition }, - abortSignal, + progressOptions, ); return await promise; } finally { diff --git a/src/status.css b/src/status.css index a5c9c922a8..bf4ab50873 100644 --- a/src/status.css +++ b/src/status.css @@ -63,6 +63,7 @@ background-color: #808080; padding: 20px; padding-top: 30px; + border: 1px solid white; } #neuroglancer-status-container-modal > div > div:first-child { diff --git a/src/status.ts b/src/status.ts index 07b2deb6d9..2507cdc6f4 100644 --- a/src/status.ts +++ b/src/status.ts @@ -21,6 +21,9 @@ import { makeCloseButton } from "#src/widget/close_button.js"; let statusContainer: HTMLElement | undefined; let modalStatusContainer: HTMLElement | undefined; +// Exported for use by #tests/fixtures/status_message_handler.js +export const statusMessages = new Set(); + export const DEFAULT_STATUS_DELAY = 200; export type Delay = boolean | number; @@ -57,6 +60,11 @@ function getModalStatusContainer() { return modalStatusContainer; } +// For use by #tests/fixtures/status_message_handler.js +export function getStatusMessageContainers() { + return [getStatusContainer(), getModalStatusContainer()]; +} + export class StatusMessage { element: HTMLElement; private modalElementWrapper: HTMLElement | undefined; @@ -75,6 +83,7 @@ export class StatusMessage { } else { this.timer = null; } + statusMessages.add(this); } [Symbol.dispose]() { @@ -90,6 +99,7 @@ export class StatusMessage { if (this.timer !== null) { clearTimeout(this.timer); } + statusMessages.delete(this); } setText(text: string, makeVisible?: boolean) { this.element.textContent = text; diff --git a/src/ui/default_viewer_setup.ts b/src/ui/default_viewer_setup.ts index fc5d5aeaee..fc6bb1a406 100644 --- a/src/ui/default_viewer_setup.ts +++ b/src/ui/default_viewer_setup.ts @@ -37,7 +37,7 @@ export function setupDefaultViewer(options?: Partial) { const hashBinding = viewer.registerDisposer( new UrlHashBinding( viewer.state, - viewer.dataSourceProvider.credentialsManager, + viewer.dataSourceProvider.sharedKvStoreContext, { defaultFragment: typeof NEUROGLANCER_DEFAULT_STATE_FRAGMENT !== "undefined" diff --git a/src/ui/layer_data_sources_tab.css b/src/ui/layer_data_sources_tab.css index 0fa84d0b20..f72fe24c2e 100644 --- a/src/ui/layer_data_sources_tab.css +++ b/src/ui/layer_data_sources_tab.css @@ -112,3 +112,13 @@ li.neuroglancer-message-info { .neuroglancer-layer-data-sources-tab-type-detection-type { font-weight: bold; } + +.neuroglancer-layer-data-sources-tab .neuroglancer-progress { + margin: 0px; + list-style: none; + padding: 0px; +} + +.neuroglancer-layer-data-sources-tab .neuroglancer-progress > li { + color: #ccc; +} diff --git a/src/ui/layer_data_sources_tab.ts b/src/ui/layer_data_sources_tab.ts index d3f94ef32a..866acd4850 100644 --- a/src/ui/layer_data_sources_tab.ts +++ b/src/ui/layer_data_sources_tab.ts @@ -19,7 +19,7 @@ */ import "#src/ui/layer_data_sources_tab.css"; -import { LocalDataSource } from "#src/datasource/index.js"; +import { LocalDataSource } from "#src/datasource/local.js"; import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; import { changeLayerName, @@ -50,34 +50,62 @@ import { } from "#src/util/dom.js"; import type { MessageList } from "#src/util/message_list.js"; import { MessageSeverity } from "#src/util/message_list.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; import { makeAddButton } from "#src/widget/add_button.js"; import { CoordinateSpaceTransformWidget } from "#src/widget/coordinate_transform.js"; -import type { Completer } from "#src/widget/multiline_autocomplete.js"; +import type { + Completer, + SyntaxHighlighter, +} from "#src/widget/multiline_autocomplete.js"; import { AutocompleteTextInput, makeCompletionElementWithDescription, } from "#src/widget/multiline_autocomplete.js"; +import { ProgressListenerWidget } from "#src/widget/progress_listener.js"; import { Tab } from "#src/widget/tab_view.js"; +const dataSourceUrlSyntaxHighlighter: SyntaxHighlighter = { + splitPattern: /\|?[^|:/_]*(?:[:/_]+)?/g, + getSeparatorNode: (text: string) => { + if (text.startsWith("|") && text.length > 1) { + // Create an empty span with CSS class that adds `::after` node with + // content "\a". This prevents the linebreak from affecting text selection. + const node = document.createElement("span"); + node.classList.add("neuroglancer-multiline-autocomplete-linebreak"); + return node; + } else { + return document.createElement("wbr"); + } + }, +}; + class SourceUrlAutocomplete extends AutocompleteTextInput { dataSourceView: DataSourceView; dirty: WatchableValueInterface; constructor(dataSourceView: DataSourceView) { const { manager } = dataSourceView.source.layer; - const sourceCompleter: Completer = ({ value }, abortSignal: AbortSignal) => - manager.dataSourceProviderRegistry - .completeUrl({ + const sourceCompleter: Completer = async ( + { value }, + signal: AbortSignal, + progressListener: ProgressListener, + ) => { + const originalResult = + await manager.dataSourceProviderRegistry.completeUrl({ url: value, - chunkManager: manager.chunkManager, - abortSignal, - }) - .then((originalResult) => ({ - completions: originalResult.completions, - makeElement: makeCompletionElementWithDescription, - offset: originalResult.offset, - showSingleResult: true, - })); - super({ completer: sourceCompleter, delay: 0 }); + signal, + progressListener, + }); + return { + ...originalResult, + makeElement: makeCompletionElementWithDescription, + showSingleResult: true, + }; + }; + super({ + completer: sourceCompleter, + syntaxHighlighter: dataSourceUrlSyntaxHighlighter, + delay: 0, + }); this.placeholder = "Data source URL"; this.dataSourceView = dataSourceView; this.element.classList.add("neuroglancer-layer-data-source-url-input"); @@ -306,14 +334,6 @@ export class DataSourceView extends RefCounted { const { source } = this; const existingSpec = source.spec; const userLayer = this.source.layer; - url = userLayer.manager.dataSourceProviderRegistry.normalizeUrl({ url }); - if (url !== urlInput.value) { - urlInput.disableCompletion(); - urlInput.setValueAndSelection(url, { - begin: url.length, - end: url.length, - }); - } urlInput.dirty.value = false; // If url is non-empty and unchanged, don't set spec, as that would trigger a reload of the // data source. If the url is empty, always set spec in order to possible remove the empty @@ -330,12 +350,14 @@ export class DataSourceView extends RefCounted { try { const newName = userLayer.manager.dataSourceProviderRegistry.suggestLayerName(url); - changeLayerName(userLayer.managedLayer, newName); + if (newName) { + changeLayerName(userLayer.managedLayer, newName); + } } catch { // Ignore errors obtaining a suggested layer name. } } - source.spec = { ...existingSpec, url }; + source.spec = { ...existingSpec, url, setManually: true }; }; urlInput.onCommit.add(updateUrlFromView); @@ -345,6 +367,12 @@ export class DataSourceView extends RefCounted { element.appendChild( this.registerDisposer(new MessagesView(source.messages)).element, ); + const progressListenerWidget = new ProgressListenerWidget(); + element.appendChild(progressListenerWidget.element); + source.progressListener.addListener(progressListenerWidget); + this.registerDisposer(() => + source.progressListener.removeListener(progressListenerWidget), + ); this.updateView(); } diff --git a/src/ui/url_hash_binding.ts b/src/ui/url_hash_binding.ts index cca2bdc77d..978942494c 100644 --- a/src/ui/url_hash_binding.ts +++ b/src/ui/url_hash_binding.ts @@ -15,15 +15,11 @@ */ import { debounce } from "lodash-es"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; import { StatusMessage } from "#src/status.js"; import { WatchableValue } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import { urlSafeParse, verifyObject } from "#src/util/json.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; import { getCachedJson } from "#src/util/trackable.js"; @@ -70,7 +66,7 @@ export class UrlHashBinding extends RefCounted { constructor( public root: Trackable, - public credentialsManager: CredentialsManager, + public sharedKvStoreContext: SharedKvStoreContext, options: UrlHashBindingOptions = {}, ) { super(); @@ -121,13 +117,10 @@ export class UrlHashBinding extends RefCounted { // Handle remote JSON state if (s.match(/^#!([a-z][a-z\d+-.]*):\/\//)) { const url = s.substring(2); - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - this.credentialsManager, - ); StatusMessage.forPromise( - fetchSpecialOk(credentialsProvider, parsedUrl, {}) - .then((response) => response.json()) + this.sharedKvStoreContext.kvStoreContext + .read(url, { throwIfMissing: true }) + .then((response) => response.response.json()) .then((json) => { verifyObject(json); this.root.reset(); diff --git a/src/util/abort.ts b/src/util/abort.ts index 7b45a2a0e0..da3b37908f 100644 --- a/src/util/abort.ts +++ b/src/util/abort.ts @@ -44,10 +44,10 @@ export class SharedAbortController { return this.controller.signal; } - addConsumer(abortSignal: AbortSignal | undefined): void { + addConsumer(signal: AbortSignal | undefined): void { if (this.controller.signal.aborted) return undefined; - if (abortSignal !== undefined) { - if (abortSignal.aborted) return; + if (signal !== undefined) { + if (signal.aborted) return; const self = this; function wrappedCallback(this: AbortSignal) { self.consumers.delete(wrappedCallback); @@ -56,14 +56,14 @@ export class SharedAbortController { self[Symbol.dispose](); } } - abortSignal.addEventListener("abort", wrappedCallback, { once: true }); + signal.addEventListener("abort", wrappedCallback, { once: true }); } ++this.retainCount; } [Symbol.dispose](): void { - for (const [wrappedCallback, abortSignal] of this.consumers) { - abortSignal.removeEventListener("abort", wrappedCallback); + for (const [wrappedCallback, signal] of this.consumers) { + signal.removeEventListener("abort", wrappedCallback); } this.consumers.clear(); this.retainCount = 0; @@ -78,7 +78,7 @@ export class SharedAbortController { } export function promiseWithResolversAndAbortCallback( - abortSignal: AbortSignal, + signal: AbortSignal, abortCallback: (reason: any) => void, ): { promise: Promise; @@ -86,7 +86,7 @@ export function promiseWithResolversAndAbortCallback( reject: (reason: any) => void; } { const { promise, resolve, reject } = Promise.withResolvers(); - const cleanup = scopedAbortCallback(abortSignal, abortCallback); + const cleanup = scopedAbortCallback(signal, abortCallback); return { promise, resolve: (value: T) => { @@ -102,13 +102,13 @@ export function promiseWithResolversAndAbortCallback( export function raceWithAbort( promise: Promise, - abortSignal: AbortSignal | undefined, + signal: AbortSignal | undefined, ): Promise { - if (abortSignal === undefined) return promise; - if (abortSignal.aborted) return Promise.reject(abortSignal.reason); + if (signal === undefined) return promise; + if (signal.aborted) return Promise.reject(signal.reason); return new Promise((resolve, reject) => { - const cleanup = scopedAbortCallback(abortSignal, (reason) => { + const cleanup = scopedAbortCallback(signal, (reason) => { reject(reason); }); promise.then( @@ -124,12 +124,12 @@ export function raceWithAbort( }); } -export function abortPromise(abortSignal: AbortSignal) { +export function abortPromise(signal: AbortSignal) { return new Promise((_resolve, reject) => { - abortSignal.addEventListener( + signal.addEventListener( "abort", () => { - reject(abortSignal.reason); + reject(signal.reason); }, { once: true }, ); diff --git a/src/util/array.ts b/src/util/array.ts index 240f5b23ce..64d30a29a2 100644 --- a/src/util/array.ts +++ b/src/util/array.ts @@ -170,13 +170,13 @@ export function tile2dArray( return result; } -export function binarySearch( - haystack: ArrayLike, - needle: T, - compare: (a: T, b: T) => number, +export function binarySearch( + haystack: ArrayLike, + needle: Needle, + compare: (a: Needle, b: Hay) => number, low = 0, high = haystack.length, -) { +): number { while (low < high) { const mid = (low + high - 1) >> 1; const compareResult = compare(needle, haystack[mid]); diff --git a/src/util/byte_range_http_requests.ts b/src/util/byte_range_http_requests.ts deleted file mode 100644 index 4e4f505d39..0000000000 --- a/src/util/byte_range_http_requests.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { getByteRangeHeader } from "#src/util/http_request.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { fetchSpecialOk } from "#src/util/special_protocol_request.js"; -import type { Uint64 } from "#src/util/uint64.js"; - -/** - * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the - * cache is disabled. Disabling the cache works around the problem. - * - * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 - */ -const cacheMode = - navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; - -export function fetchSpecialHttpByteRange( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - startOffset: Uint64 | number, - endOffset: Uint64 | number, - abortSignal: AbortSignal, -): Promise { - return fetchSpecialOk(credentialsProvider, url, { - headers: getByteRangeHeader(startOffset, endOffset), - cache: cacheMode, - signal: abortSignal, - }).then((response) => response.arrayBuffer()); -} diff --git a/src/util/completion.ts b/src/util/completion.ts index a406a70b0d..18fb332501 100644 --- a/src/util/completion.ts +++ b/src/util/completion.ts @@ -26,6 +26,12 @@ export interface CompletionWithDescription extends Completion { export interface BasicCompletionResult { completions: C[]; + // Default completion to show. + // + // If not specified, the longest common prefix of all completions is the + // "default completion" to show inline as a hint and to append if the user + // presses TAB. This option overrides that. + defaultCompletion?: string; offset: number; } diff --git a/src/util/error.ts b/src/util/error.ts index 3dd27e9554..64801ab29a 100644 --- a/src/util/error.ts +++ b/src/util/error.ts @@ -28,3 +28,19 @@ export function valueOrThrow(x: ValueOrError): T { if (x.error !== undefined) throw new Error(x.error); return x; } + +export function formatErrorMessage(error: unknown): string { + if (typeof error === "string") return error; + if (error instanceof Error) { + const { message, cause } = error; + if (cause !== undefined) { + return `${message}: ${formatErrorMessage(cause)}`; + } + return message; + } + try { + return "" + error; + } catch { + return "Unknown error"; + } +} diff --git a/src/util/gcs_bucket_listing.ts b/src/util/gcs_bucket_listing.ts deleted file mode 100644 index ec77de5910..0000000000 --- a/src/util/gcs_bucket_listing.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { BasicCompletionResult } from "#src/util/completion.js"; -import { - parseArray, - verifyObject, - verifyObjectProperty, - verifyOptionalObjectProperty, - verifyString, - verifyStringArray, -} from "#src/util/json.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; - -export async function getGcsBucketListing( - credentialsProvider: SpecialProtocolCredentialsProvider, - bucket: string, - prefix: string, - delimiter: string, - abortSignal: AbortSignal, -): Promise { - // Include origin as `neuroglancerOrigin` query string parameter. See comment in - // `special_protocol_request.ts` for details. - const response = await fetchWithOAuth2Credentials( - credentialsProvider, - `https://www.googleapis.com/storage/v1/b/${bucket}/o?` + - `delimiter=${encodeURIComponent(delimiter)}&prefix=${encodeURIComponent( - prefix, - )}&` + - `neuroglancerOrigin=${encodeURIComponent(location.origin)}`, - { signal: abortSignal }, - ).then((response) => response.json()); - verifyObject(response); - const prefixes = verifyOptionalObjectProperty( - response, - "prefixes", - verifyStringArray, - [], - ); - const items = verifyOptionalObjectProperty( - response, - "items", - (items) => - parseArray(items, (item) => { - verifyObject(item); - return verifyObjectProperty(item, "name", verifyString); - }), - [], - ).filter((name) => !name.endsWith("_$folder$")); - return [...prefixes, ...items]; -} - -export async function getGcsPathCompletions( - credentialsProvider: SpecialProtocolCredentialsProvider, - enteredBucketUrl: string, - bucket: string, - path: string, - abortSignal: AbortSignal, -): Promise { - const prefix = path; - if (!prefix.startsWith("/")) throw null; - const paths = await getGcsBucketListing( - credentialsProvider, - bucket, - path.substring(1), - "/", - abortSignal, - ); - const offset = path.lastIndexOf("/"); - return { - offset: offset + enteredBucketUrl.length + 1, - completions: paths.map((x) => ({ value: x.substring(offset) })), - }; -} diff --git a/src/util/google_oauth2.ts b/src/util/google_oauth2.ts index baa8a312a9..50e8f6241f 100644 --- a/src/util/google_oauth2.ts +++ b/src/util/google_oauth2.ts @@ -29,6 +29,7 @@ import { verifyObjectProperty, verifyString, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { getRandomHexString } from "#src/util/random.js"; export const EMAIL_SCOPE = "email"; @@ -60,11 +61,11 @@ function extractEmailFromIdToken(idToken: string): string { } } -// Note: `abortSignal` is guaranteed to be aborted once the operation completes. +// Note: `signal` is guaranteed to be aborted once the operation completes. function waitForAuthResponseMessage( source: Window, state: string, - abortSignal: AbortSignal, + signal: AbortSignal, ): Promise { return new Promise((resolve, reject) => { window.addEventListener( @@ -108,7 +109,7 @@ function waitForAuthResponseMessage( console.error("Response received: ", event.data); } }, - { signal: abortSignal }, + { signal: signal }, ); }); } @@ -193,7 +194,7 @@ export async function authenticateGoogleOAuth2( immediate?: boolean; authUser?: number; }, - abortSignal: AbortSignal, + signal: AbortSignal, ) { const state = getRandomHexString(); const nonce = getRandomHexString(); @@ -208,7 +209,7 @@ export async function authenticateGoogleOAuth2( authUser: options.authUser, }); const abortController = new AbortController(); - abortSignal = AbortSignal.any([abortController.signal, abortSignal]); + signal = AbortSignal.any([abortController.signal, signal]); try { let source: Window; if (options.immediate) { @@ -223,7 +224,7 @@ export async function authenticateGoogleOAuth2( } return await raceWithAbort( waitForAuthResponseMessage(source, state, abortController.signal), - abortSignal, + signal, ); } finally { abortController.abort(); @@ -237,12 +238,15 @@ export class GoogleOAuth2CredentialsProvider extends CredentialsProvider - getCredentialsWithStatus( + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting ${this.options.description} OAuth2 access token`, + }); + return await getCredentialsWithStatus( { description: this.options.description, supportsImmediate: true, - get: (abortSignal, immediate) => + get: (signal, immediate) => authenticateGoogleOAuth2( { clientId: this.options.clientId, @@ -250,10 +254,10 @@ export class GoogleOAuth2CredentialsProvider extends CredentialsProvider 2 && view[0] === 0x1f && view[1] === 0x8b; + return ( + view.length >= 3 && view[0] === 0x1f && view[1] === 0x8b && view[2] === 0x08 + ); } export async function decodeGzip( - data: ArrayBuffer | ArrayBufferView, + data: ArrayBuffer | ArrayBufferView | Response, format: CompressionFormat, - abortSignal?: AbortSignal, + signal?: AbortSignal, ) { try { - const decompressedStream = new Response(data).body!.pipeThrough( - new DecompressionStream(format), - { signal: abortSignal }, + const decompressedStream = decodeGzipStream( + data instanceof Response ? data : new Response(data), + format, + signal, ); return await new Response(decompressedStream).arrayBuffer(); } catch { - abortSignal?.throwIfAborted(); + signal?.throwIfAborted(); throw new Error(`Failed to decode ${format}`); } } +export function decodeGzipStream( + response: Response, + format: CompressionFormat, + signal?: AbortSignal, +): ReadableStream { + return response.body!.pipeThrough(new DecompressionStream(format), { + signal: signal, + }); +} + /** * Decompress `data` if it is in gzip format, otherwise just return it. */ diff --git a/src/util/hash.ts b/src/util/hash.ts index 70ed1de192..964c6283af 100644 --- a/src/util/hash.ts +++ b/src/util/hash.ts @@ -143,3 +143,56 @@ export function murmurHash3_x86_128Hash64Bits( out.high = h2; return out; } + +export function murmurHash3_x86_128Hash64Bits_Bigint( + seed: number, + input: bigint, +): bigint { + let h1 = seed; + let h2 = seed; + let h3 = seed; + let h4 = seed; + const c1 = 0x239b961b; + const c2 = 0xab0e9789; + const c3 = 0x38b34ae5; + // const c4 = 0xa1e38b93; + + let k2 = Math.imul(Number(input >> BigInt(32)), c2); + k2 = rotl32(k2, 16); + k2 = Math.imul(k2, c3); + h2 ^= k2; + + let k1 = Math.imul(Number(input & BigInt(0xffffffff)), c1); + k1 = rotl32(k1, 15); + k1 = Math.imul(k1, c2); + h1 ^= k1; + + const len = 8; + + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 = (h1 + h2) >>> 0; + h1 = (h1 + h3) >>> 0; + h1 = (h1 + h4) >>> 0; + h2 = (h2 + h1) >>> 0; + h3 = (h3 + h1) >>> 0; + h4 = (h4 + h1) >>> 0; + + h1 = murmurHash3_x86_128Mix(h1); + h2 = murmurHash3_x86_128Mix(h2); + h3 = murmurHash3_x86_128Mix(h3); + h4 = murmurHash3_x86_128Mix(h4); + + h1 = (h1 + h2) >>> 0; + h1 = (h1 + h3) >>> 0; + h1 = (h1 + h4) >>> 0; + h2 = (h2 + h1) >>> 0; + + // h3 = (h3 + h1) >>> 0; + // h4 = (h4 + h1) >>> 0; + + return BigInt(h1) | (BigInt(h2) << BigInt(32)); +} diff --git a/src/util/http_path_completion.ts b/src/util/http_path_completion.ts deleted file mode 100644 index 1aadcb2138..0000000000 --- a/src/util/http_path_completion.ts +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { - BasicCompletionResult, - Completion, - CompletionWithDescription, -} from "#src/util/completion.js"; -import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; -import { getGcsPathCompletions } from "#src/util/gcs_bucket_listing.js"; -import { parseUrl } from "#src/util/http_request.js"; -import { getS3PathCompletions } from "#src/util/s3.js"; -import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { - fetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; - -/** - * Obtains a directory listing from a server that supports HTML directory listings. - */ -export async function getHtmlDirectoryListing( - url: string, - abortSignal: AbortSignal, - credentialsProvider?: SpecialProtocolCredentialsProvider, -): Promise { - const response = await fetchSpecialOk( - credentialsProvider, - url, - /*init=*/ { headers: { accept: "text/html" }, signal: abortSignal }, - ); - const contentType = response.headers.get("content-type"); - if (contentType === null || /\btext\/html\b/i.exec(contentType) === null) { - return []; - } - const text = await response.text(); - const doc = new DOMParser().parseFromString(text, "text/html"); - const nodes = doc.evaluate( - "//a/@href", - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - const results: string[] = []; - for (let i = 0, n = nodes.snapshotLength; i < n; ++i) { - const node = nodes.snapshotItem(i)!; - const href = node.textContent; - if (href) { - results.push(new URL(href, url).toString()); - } - } - return results; -} - -export async function getHtmlPathCompletions( - url: string, - abortSignal: AbortSignal, - credentialsProvider?: SpecialProtocolCredentialsProvider, -): Promise { - console.log("getHtmlPathCompletions"); - const m = url.match(/^([a-z]+:\/\/.*\/)([^/?#]*)$/); - if (m === null) throw null; - const entries = await getHtmlDirectoryListing( - m[1], - abortSignal, - credentialsProvider, - ); - const offset = m[1].length; - const matches: Completion[] = []; - for (const entry of entries) { - if (!entry.startsWith(url)) continue; - matches.push({ value: entry.substring(offset) }); - } - return { - offset, - completions: matches, - }; -} - -const specialProtocolEmptyCompletions: CompletionWithDescription[] = [ - { value: "gs://", description: "Google Cloud Storage (JSON API)" }, - { value: "gs+xml://", description: "Google Cloud Storage (XML API)" }, - { - value: "gs+ngauth+http://", - description: "Google Cloud Storage (JSON API) authenticated via ngauth", - }, - { - value: "gs+ngauth+https://", - description: "Google Cloud Storage (JSON API) authenticated via ngauth", - }, - { - value: "gs+xml+ngauth+http://", - description: "Google Cloud Storage (XML API) authenticated via ngauth", - }, - { - value: "gs+xml+ngauth+https://", - description: "Google Cloud Storage (XML API) authenticated via ngauth", - }, - { value: "s3://", description: "Amazon Simple Storage Service (S3)" }, - { value: "https://" }, - { value: "http://" }, -]; - -export async function completeHttpPath( - credentialsManager: CredentialsManager, - url: string, - abortSignal: AbortSignal, -): Promise> { - if (!url.includes("://")) { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - url, - specialProtocolEmptyCompletions, - (x) => x.value, - (x) => x.description, - ), - }; - } - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); - const offset = url.length - parsedUrl.length; - let result; - try { - result = parseUrl(parsedUrl); - } catch { - throw null; - } - const { protocol, host, path } = result; - const completions = await (async () => { - if (protocol === "gs+xml" && path.length > 0) { - return await getS3CompatiblePathCompletions( - credentialsProvider, - `${protocol}://${host}`, - `https://storage.googleapis.com/${host}`, - path, - abortSignal, - ); - } - if (protocol === "gs" && path.length > 0) { - return await getGcsPathCompletions( - credentialsProvider, - `${protocol}://${host}`, - host, - path, - abortSignal, - ); - } - if (protocol === "s3" && path.length > 0) { - return await getS3PathCompletions(host, path, abortSignal); - } - const s3Match = parsedUrl.match( - /^((?:http|https):\/\/(?:storage\.googleapis\.com\/[^/]+|[^/]+\.storage\.googleapis\.com|[^/]+\.s3(?:[^./]+)?\.amazonaws.com))(\/.*)$/, - ); - if (s3Match !== null) { - return await getS3CompatiblePathCompletions( - credentialsProvider, - s3Match[1], - s3Match[1], - s3Match[2], - abortSignal, - ); - } - if ((protocol === "http" || protocol === "https") && path.length > 0) { - return await getHtmlPathCompletions( - parsedUrl, - abortSignal, - credentialsProvider, - ); - } - throw null; - })(); - return { - offset: offset + completions.offset, - completions: completions.completions, - }; -} diff --git a/src/util/http_request.ts b/src/util/http_request.ts index 330757fbe0..293cc68119 100644 --- a/src/util/http_request.ts +++ b/src/util/http_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Uint64 } from "#src/util/uint64.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; export class HttpError extends Error { url: string; @@ -27,6 +27,7 @@ export class HttpError extends Error { status: number, statusText: string, response?: Response, + options?: { cause: any }, ) { let message = `Fetching ${JSON.stringify( url, @@ -35,7 +36,7 @@ export class HttpError extends Error { message += `: ${statusText}`; } message += "."; - super(message); + super(message, options); this.name = "HttpError"; this.message = message; this.url = url; @@ -63,7 +64,9 @@ export class HttpError extends Error { } else { url = input.url; } - return new HttpError(url, 0, "Network or CORS error"); + return new HttpError(url, 0, "Network or CORS error", undefined, { + cause: error, + }); } return error; } @@ -97,7 +100,7 @@ export function pickDelay(attemptNumber: number): number { */ export async function fetchOk( input: RequestInfo, - init?: RequestInit, + init?: RequestInitWithProgress, ): Promise { for (let requestAttempt = 0; ; ) { init?.signal?.throwIfAborted(); @@ -126,34 +129,14 @@ export async function fetchOk( } } -const tempUint64 = new Uint64(); - -export function getByteRangeHeader( - startOffset: Uint64 | number, - endOffset: Uint64 | number, -) { - let endOffsetStr: string; - if (typeof endOffset === "number") { - endOffsetStr = `${endOffset - 1}`; - } else { - Uint64.decrement(tempUint64, endOffset); - endOffsetStr = tempUint64.toString(); - } - return { Range: `bytes=${startOffset}-${endOffsetStr}` }; +export interface RequestInitWithProgress extends RequestInit { + progressListener?: ProgressListener; } -export function parseUrl(url: string): { - protocol: string; - host: string; - path: string; -} { - const urlProtocolPattern = /^([^:/]+):\/\/([^/]+)((?:\/.*)?)$/; - const match = url.match(urlProtocolPattern); - if (match === null) { - throw new Error(`Invalid URL: ${JSON.stringify(url)}`); - } - return { protocol: match[1], host: match[2], path: match[3] }; -} +export type FetchOk = ( + input: RequestInfo, + init?: RequestInitWithProgress, +) => Promise; export function isNotFoundError(e: any) { if (!(e instanceof HttpError)) return false; diff --git a/src/util/memoize.ts b/src/util/memoize.ts index c9da1cfbf4..fd2826b78e 100644 --- a/src/util/memoize.ts +++ b/src/util/memoize.ts @@ -14,9 +14,12 @@ * limitations under the License. */ +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; import type { RefCounted } from "#src/util/disposable.js"; import { RefCountedValue } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { MultiConsumerProgressListener } from "#src/util/progress_listener.js"; export class Memoize { private map = new Map(); @@ -51,4 +54,107 @@ export class StringMemoize extends Memoize { getUncounted(x: any, getter: () => T) { return this.get(x, () => new RefCountedValue(getter())).value; } + + getAsync( + x: any, + options: Partial, + getter: (options: ProgressOptions) => Promise, + ) { + return this.getUncounted(x, () => asyncMemoizeWithProgress(getter))( + options, + ); + } +} + +export interface AsyncMemoize { + (options: { signal?: AbortSignal }): Promise; +} + +export interface AsyncMemoizeWithProgress { + (options: Partial): Promise; +} + +export function asyncMemoize( + getter: (options: { signal: AbortSignal }) => Promise, +): AsyncMemoize { + let abortController: SharedAbortController | undefined; + let promise: Promise | undefined; + let completed: boolean = false; + + return (options: { signal?: AbortSignal }): Promise => { + if (completed) { + return promise!; + } + if (promise === undefined || abortController!.signal.aborted) { + abortController = new SharedAbortController(); + promise = (async () => { + try { + return await getter({ + signal: abortController!.signal, + }); + } catch (e) { + if (abortController!.signal.aborted) { + promise = undefined; + } + throw e; + } finally { + if (promise !== undefined) { + completed = true; + } + abortController![Symbol.dispose](); + abortController = undefined; + } + })(); + } + abortController!.addConsumer(options.signal); + return raceWithAbort(promise, options.signal); + }; +} + +export function asyncMemoizeWithProgress( + getter: (options: ProgressOptions) => Promise, +): AsyncMemoizeWithProgress { + let progressListener: MultiConsumerProgressListener | undefined; + let abortController: SharedAbortController | undefined; + let promise: Promise | undefined; + let completed: boolean = false; + + return async (options: Partial): Promise => { + if (completed) { + return promise!; + } + if (promise === undefined || abortController!.signal.aborted) { + progressListener = new MultiConsumerProgressListener(); + abortController = new SharedAbortController(); + promise = (async () => { + try { + return await getter({ + signal: abortController!.signal, + progressListener: progressListener!, + }); + } catch (e) { + if (abortController!.signal.aborted) { + promise = undefined; + } + throw e; + } finally { + if (promise !== undefined) { + completed = true; + } + progressListener = undefined; + abortController![Symbol.dispose](); + abortController = undefined; + } + })(); + } + abortController!.addConsumer(options.signal); + const curProgressListener = progressListener!; + curProgressListener.addListener(options.progressListener); + + try { + return await raceWithAbort(promise, options.signal); + } finally { + curProgressListener.removeListener(options.progressListener); + } + }; } diff --git a/src/util/npy.spec.ts b/src/util/npy.spec.ts index f5c55557cd..cc61084bf2 100644 --- a/src/util/npy.spec.ts +++ b/src/util/npy.spec.ts @@ -48,6 +48,8 @@ describe("parseNpy", () => { "..", "..", "testdata", + "codec", + "npy", ); const example = JSON.parse( await fs.readFile(`${testDataDir}/npy_test.${json}.json`, { diff --git a/src/util/progress_listener.ts b/src/util/progress_listener.ts new file mode 100644 index 0000000000..6c95858faf --- /dev/null +++ b/src/util/progress_listener.ts @@ -0,0 +1,177 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type ProgressSpanId = number; + +export interface ProgressSpanOptions { + message: string; + startTime?: number; + id?: ProgressSpanId; +} + +export class ProgressSpan implements Disposable { + id: ProgressSpanId; + startTime: number; + message: string; + + constructor( + public listener: ProgressListener, + options: ProgressSpanOptions, + ) { + const { id = Math.random(), startTime = Date.now(), message } = options; + this.id = id; + this.startTime = startTime; + this.message = message; + listener.addSpan(this); + } + + [Symbol.dispose]() { + this.listener.removeSpan(this.id); + } +} + +export interface ProgressListener { + addSpan(span: ProgressSpan): void; + removeSpan(spanId: ProgressSpanId): void; +} + +export class MultiSet { + private items = new Map(); + add(item: T): number { + const { items } = this; + const count = (items.get(item) ?? 0) + 1; + items.set(item, count); + return count; + } + + delete(item: T): number { + const { items } = this; + let count = items.get(item)!; + if (count > 1) { + count -= 1; + items.set(item, count); + return count; + } + items.delete(item); + return 0; + } + + has(item: T): boolean { + return this.items.has(item); + } + + keys() { + return this.items.keys(); + } + + entries() { + return this.items.entries(); + } + + [Symbol.iterator]() { + return this.items.keys(); + } +} + +export class KeyedMultiSet { + private items = new Map(); + constructor(private getKey: (value: T) => Key) {} + + add(item: T): number { + const { items } = this; + const key = this.getKey(item); + const obj = items.get(key); + if (obj === undefined) { + items.set(key, { value: item, count: 1 }); + return 1; + } else { + return (obj.count += 1); + } + } + + delete(item: T): number { + return this.deleteKey(this.getKey(item)); + } + + deleteKey(key: Key): number { + const { items } = this; + const obj = items.get(key); + if (obj !== undefined && obj.count > 1) { + return (obj.count -= 1); + } + items.delete(key); + return 0; + } + + has(item: T): boolean { + return this.items.has(this.getKey(item)); + } + + *[Symbol.iterator]() { + for (const obj of this.items.values()) { + yield obj.value; + } + } +} + +function getId(span: ProgressSpan) { + return span.id; +} + +export class ProgressSpanSet extends KeyedMultiSet { + constructor() { + super(getId); + } +} + +export class MultiConsumerProgressListener implements ProgressListener { + private spans = new ProgressSpanSet(); + private listeners = new MultiSet(); + addSpan(span: ProgressSpan) { + if (this.spans.add(span) !== 1) return; + for (const listener of this.listeners) { + listener.addSpan(span); + } + } + + removeSpan(spanId: ProgressSpanId) { + if (this.spans.deleteKey(spanId) !== 0) return; + for (const listener of this.listeners) { + listener.removeSpan(spanId); + } + } + + addListener(listener: ProgressListener | undefined) { + if (listener === undefined) return; + if (this.listeners.add(listener) !== 1) return; + for (const span of this.spans) { + listener.addSpan(span); + } + } + + removeListener(listener: ProgressListener | undefined) { + if (listener === undefined) return; + if (this.listeners.delete(listener) !== 0) return; + for (const span of this.spans) { + listener.removeSpan(span.id); + } + } +} + +export interface ProgressOptions { + signal: AbortSignal; + progressListener: ProgressListener; +} diff --git a/src/util/s3.ts b/src/util/s3.ts deleted file mode 100644 index 4088f280a9..0000000000 --- a/src/util/s3.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright 2021 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { fetchOk } from "#src/util/http_request.js"; -import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; - -// Support for s3:// special protocol. - -export function fetchS3Ok( - bucket: string, - path: string, - requestInit: RequestInit, -) { - return fetchOk(`https://${bucket}.s3.amazonaws.com${path}`, requestInit); -} - -export async function getS3PathCompletions( - bucket: string, - path: string, - abortSignal: AbortSignal, -) { - return await getS3CompatiblePathCompletions( - undefined, - `s3://${bucket}`, - `https://${bucket}.s3.amazonaws.com`, - path, - abortSignal, - ); -} diff --git a/src/util/s3_bucket_listing.ts b/src/util/s3_bucket_listing.ts deleted file mode 100644 index a93ed197ef..0000000000 --- a/src/util/s3_bucket_listing.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file Provides file listing and completion for storage systems supporting the S3 XML API (e.g. S3 - * and GCS). - */ - -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { BasicCompletionResult } from "#src/util/completion.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; - -export async function getS3BucketListing( - credentialsProvider: SpecialProtocolCredentialsProvider, - bucketUrl: string, - prefix: string, - delimiter: string, - abortSignal: AbortSignal, -): Promise { - const response = await fetchWithOAuth2Credentials( - credentialsProvider, - `${bucketUrl}?prefix=${encodeURIComponent(prefix)}` + - `&delimiter=${encodeURIComponent(delimiter)}`, - /*init=*/ { signal: abortSignal }, - ); - const doc = new DOMParser().parseFromString( - await response.text(), - "application/xml", - ); - const commonPrefixNodes = doc.evaluate( - '//*[name()="CommonPrefixes"]/*[name()="Prefix"]', - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - const results: string[] = []; - for (let i = 0, n = commonPrefixNodes.snapshotLength; i < n; ++i) { - results.push(commonPrefixNodes.snapshotItem(i)!.textContent || ""); - } - const contents = doc.evaluate( - '//*[name()="Contents"]/*[name()="Key"]', - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - for (let i = 0, n = contents.snapshotLength; i < n; ++i) { - results.push(contents.snapshotItem(i)!.textContent || ""); - } - return results; -} - -export async function getS3CompatiblePathCompletions( - credentialsProvider: SpecialProtocolCredentialsProvider, - enteredBucketUrl: string, - bucketUrl: string, - path: string, - abortSignal: AbortSignal, -): Promise { - const prefix = path; - if (!prefix.startsWith("/")) throw null; - const paths = await getS3BucketListing( - credentialsProvider, - bucketUrl, - path.substring(1), - "/", - abortSignal, - ); - const offset = path.lastIndexOf("/"); - return { - offset: offset + enteredBucketUrl.length + 1, - completions: paths.map((x) => ({ value: x.substring(offset) })), - }; -} diff --git a/src/util/special_protocol_request.ts b/src/util/special_protocol_request.ts deleted file mode 100644 index da6297d2ed..0000000000 --- a/src/util/special_protocol_request.ts +++ /dev/null @@ -1,176 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import pythonIntegration from "#python_integration_build"; -import type { - CredentialsManager, - MaybeOptionalCredentialsProvider, -} from "#src/credentials_provider/index.js"; -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import { parseUrl } from "#src/util/http_request.js"; -import { getRandomHexString } from "#src/util/random.js"; -import { fetchS3Ok } from "#src/util/s3.js"; - -export type SpecialProtocolCredentials = any; -export type SpecialProtocolCredentialsProvider = - MaybeOptionalCredentialsProvider; - -function getMiddleAuthCredentialsProvider( - credentialsManager: CredentialsManager, - url: string, -): SpecialProtocolCredentialsProvider { - return credentialsManager.getCredentialsProvider( - "middleauthapp", - new URL(url).origin, - ); -} - -function getNgauthCredentialsProvider( - credentialsManager: CredentialsManager, - serverUrl: string, - path: string, -): SpecialProtocolCredentialsProvider { - const bucketPattern = /^\/([^/]+)/; - const m = path.match(bucketPattern); - if (m === null) return undefined; - return pythonIntegration - ? credentialsManager.getCredentialsProvider("gcs", { bucket: m[1] }) - : credentialsManager.getCredentialsProvider("ngauth_gcs", { - authServer: serverUrl, - bucket: m[1], - }); -} - -export function parseSpecialUrl( - url: string, - credentialsManager: CredentialsManager, -): { url: string; credentialsProvider: SpecialProtocolCredentialsProvider } { - const u = parseUrl(url); - switch (u.protocol) { - case "gs": - case "gs+xml": - return { - credentialsProvider: pythonIntegration - ? credentialsManager.getCredentialsProvider("gcs", { - bucket: u.host, - }) - : undefined, - url, - }; - case "gs+ngauth+http": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `http://${u.host}`, - u.path, - ), - url: "gs:/" + u.path, - }; - case "gs+ngauth+https": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `https://${u.host}`, - u.path, - ), - url: "gs:/" + u.path, - }; - case "gs+xml+ngauth+http": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `http://${u.host}`, - u.path, - ), - url: "gs+xml:/" + u.path, - }; - case "gs+xml+ngauth+https": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `https://${u.host}`, - u.path, - ), - url: "gs+xml:/" + u.path, - }; - case "middleauth+https": - url = url.substr("middleauth+".length); - return { - credentialsProvider: getMiddleAuthCredentialsProvider( - credentialsManager, - url, - ), - url: url, - }; - case "s3": - return { - credentialsProvider: undefined, - url, - }; - default: - return { - credentialsProvider: undefined, - url, - }; - } -} - -export async function fetchSpecialOk( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - init: RequestInit, -): Promise { - const u = parseUrl(url); - switch (u.protocol) { - case "gs": - // Include random query string parameter (ignored by GCS) to bypass GCS cache and ensure a - // cached response is never used. - // - // This addresses two issues related to GCS: - // - // 1. GCS fails to send an updated `Access-Control-Allow-Origin` header in 304 responses to - // cache revalidation requests. - // - // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 - // - // The random query string parameter ensures cached responses are never used. - // - // Note: This issue does not apply to gs+xml because with the XML API, the - // Access-Control-Allow-Origin response header does not vary with the Origin. - // - // 2. If the object does not prohibit caching (e.g. public bucket and default `cache-control` - // metadata value), GCS may return stale responses. - // - return fetchWithOAuth2Credentials( - credentialsProvider, - `https://www.googleapis.com/storage/v1/b/${u.host}/o/` + - `${encodeURIComponent(u.path.substring(1))}?alt=media` + - `&neuroglancer=${getRandomHexString()}`, - init, - ); - case "gs+xml": - return fetchWithOAuth2Credentials( - credentialsProvider, - `https://storage.googleapis.com/${u.host}${u.path}` + - `?neuroglancer=${getRandomHexString()}`, - init, - ); - case "s3": - return fetchS3Ok(u.host, u.path, init); - default: - return fetchWithOAuth2Credentials(credentialsProvider, url, init); - } -} diff --git a/src/util/uint64.ts b/src/util/uint64.ts index 7a05caddc3..fd9fb355f1 100644 --- a/src/util/uint64.ts +++ b/src/util/uint64.ts @@ -338,6 +338,10 @@ export class Uint64 { return this.low + this.high * 0x100000000; } + toBigInt() { + return BigInt(this.low) | (BigInt(this.high) << BigInt(32)); + } + setFromNumber(value: number) { value = Math.round(value); if (value < 0) { diff --git a/src/util/zorder.spec.ts b/src/util/zorder.spec.ts index 16486518c5..c5d5b810b1 100644 --- a/src/util/zorder.spec.ts +++ b/src/util/zorder.spec.ts @@ -15,14 +15,13 @@ */ import { describe, it, expect } from "vitest"; -import { Uint64 } from "#src/util/uint64.js"; import { decodeZIndexCompressed, zorder3LessThan } from "#src/util/zorder.js"; describe("decodeZIndexCompressed", () => { it("works for repetitive pattern 21,21,21", () => { expect( decodeZIndexCompressed( - Uint64.parseString("111000100010001111000100010001111000100010001", 2), + 0b111000100010001111000100010001111000100010001n, 21, 21, 21, @@ -35,10 +34,7 @@ describe("decodeZIndexCompressed", () => { it("works for repetitive pattern 18,15,17", () => { expect( decodeZIndexCompressed( - Uint64.parseString( - "11101111000100010001111000100010001111000100010001", - 2, - ), + 0b11101111000100010001111000100010001111000100010001n, 18, 15, 17, diff --git a/src/util/zorder.ts b/src/util/zorder.ts index 7f8bb9dd5a..323646305b 100644 --- a/src/util/zorder.ts +++ b/src/util/zorder.ts @@ -15,7 +15,6 @@ */ import type { TypedArray } from "#src/util/array.js"; -import type { Uint64 } from "#src/util/uint64.js"; export function getOctreeChildIndex(x: number, y: number, z: number) { return (x & 1) | ((y << 1) & 2) | ((z << 2) & 4); @@ -29,73 +28,46 @@ export function getOctreeChildIndex(x: number, y: number, z: number) { * respectively, for `i` in `[0, xBits)`, `[0, yBits)`, `[0, zBits)`, respectively. */ export function decodeZIndexCompressed( - zindex: Uint64, + zindex: bigint, xBits: number, yBits: number, zBits: number, ): Uint32Array { const maxCoordBits = Math.max(xBits, yBits, zBits); let inputBit = 0; - let inputValue = zindex.low; let x = 0; let y = 0; let z = 0; for (let coordBit = 0; coordBit < maxCoordBits; ++coordBit) { if (coordBit < xBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); x |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } if (coordBit < yBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); y |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } if (coordBit < zBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); z |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } } return Uint32Array.of(x, y, z); } export function encodeZIndexCompressed3d( - zindex: Uint64, xBits: number, yBits: number, zBits: number, x: number, y: number, z: number, -): Uint64 { +): bigint { const maxBits = Math.max(xBits, yBits, zBits); let outputBit = 0; - let outputNum = 0; - let isHigh = false; + let zIndex = 0n; function writeBit(b: number): void { - outputNum |= (b & 1) << outputBit; - if (++outputBit === 32) { - zindex.low = outputNum >>> 0; - outputNum = 0; - outputBit = 0; - isHigh = true; - } + zIndex |= BigInt(b) << BigInt(outputBit++); } for (let bit = 0; bit < maxBits; ++bit) { if (bit < xBits) { @@ -108,32 +80,18 @@ export function encodeZIndexCompressed3d( writeBit((z >> bit) & 1); } } - if (isHigh) { - zindex.high = outputNum >>> 0; - } else { - zindex.high = 0; - zindex.low = outputNum >>> 0; - } - return zindex; + return zIndex; } export function encodeZIndexCompressed( - zindex: Uint64, position: TypedArray, shape: TypedArray, -): Uint64 { +): bigint { + let zIndex = 0n; let outputBit = 0; const rank = position.length; - let outputNum = 0; - let isHigh = false; function writeBit(b: number): void { - outputNum |= (b & 1) << outputBit; - if (++outputBit === 32) { - zindex.low = outputNum >>> 0; - outputNum = 0; - outputBit = 0; - isHigh = true; - } + zIndex |= BigInt(b & 1) << BigInt(outputBit++); } for (let bit = 0; bit < 32; ++bit) { @@ -143,13 +101,7 @@ export function encodeZIndexCompressed( } } } - if (isHigh) { - zindex.high = outputNum >>> 0; - } else { - zindex.high = 0; - zindex.low = outputNum >>> 0; - } - return zindex; + return zIndex; } function lessMsb(a: number, b: number) { diff --git a/src/viewer.ts b/src/viewer.ts index 3a6ebf1f8d..e921402388 100644 --- a/src/viewer.ts +++ b/src/viewer.ts @@ -22,20 +22,17 @@ import svg_layers from "ikonate/icons/layers.svg?raw"; import svg_list from "ikonate/icons/list.svg?raw"; import svg_settings from "ikonate/icons/settings.svg?raw"; import { debounce } from "lodash-es"; -import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; -import { - CapacitySpecification, - ChunkManager, - ChunkQueueManager, -} from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { getDefaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { DataManagementContext } from "#src/data_management_context.js"; import { InputEventBindings as DataPanelInputEventBindings } from "#src/data_panel_layout.js"; import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; -import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { DataSourceRegistry } from "#src/datasource/index.js"; import { StateShare, stateShareEnabled } from "#src/datasource/state_share.js"; import type { DisplayContext } from "#src/display_context.js"; import { TrackableWindowedViewport } from "#src/display_context.js"; @@ -43,6 +40,7 @@ import { HelpPanelState, InputEventBindingHelpDialog, } from "#src/help/input_event_bindings.js"; +import { SharedKvStoreContext } from "#src/kvstore/frontend.js"; import { addNewLayer, LayerManager, @@ -132,7 +130,6 @@ import type { VisibilityPrioritySpecification, } from "#src/viewer_state.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import type { GL } from "#src/webgl/context.js"; import { AnnotationToolStatusWidget } from "#src/widget/annotation_tool_status.js"; import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; import { makeIcon } from "#src/widget/icon.js"; @@ -144,7 +141,6 @@ import { registerDimensionToolForViewer, } from "#src/widget/position_widget.js"; import { TrackableScaleBarOptions } from "#src/widget/scale_bar.js"; -import { RPC } from "#src/worker_rpc.js"; declare let NEUROGLANCER_OVERRIDE_DEFAULT_VIEWER_OPTIONS: any; @@ -155,60 +151,6 @@ interface CreditLink { declare let NEUROGLANCER_CREDIT_LINK: CreditLink | CreditLink[] | undefined; -export class DataManagementContext extends RefCounted { - worker: Worker; - chunkQueueManager: ChunkQueueManager; - chunkManager: ChunkManager; - - get rpc(): RPC { - return this.chunkQueueManager.rpc!; - } - - constructor( - public gl: GL, - public frameNumberCounter: FrameNumberCounter, - ) { - super(); - // Note: For compatibility with multiple bundlers, a browser-compatible URL - // must be used with `new URL`, which means a Node.js subpath import like - // "#src/chunk_worker.bundle.js" cannot be used. - this.worker = new Worker( - /* webpackChunkName: "neuroglancer_chunk_worker" */ - new URL("./chunk_worker.bundle.js", import.meta.url), - { type: "module" }, - ); - this.chunkQueueManager = this.registerDisposer( - new ChunkQueueManager( - new RPC(this.worker, /*waitUntilReady=*/ true), - this.gl, - this.frameNumberCounter, - { - gpuMemory: new CapacitySpecification({ - defaultItemLimit: 1e6, - defaultSizeLimit: 1e9, - }), - systemMemory: new CapacitySpecification({ - defaultItemLimit: 1e7, - defaultSizeLimit: 2e9, - }), - download: new CapacitySpecification({ - defaultItemLimit: 100, - defaultSizeLimit: Number.POSITIVE_INFINITY, - }), - compute: new CapacitySpecification({ - defaultItemLimit: 128, - defaultSizeLimit: 5e8, - }), - }, - ), - ); - this.chunkQueueManager.registerDisposer(() => this.worker.terminate()); - this.chunkManager = this.registerDisposer( - new ChunkManager(this.chunkQueueManager), - ); - } -} - export class InputEventBindings extends DataPanelInputEventBindings { global = new EventActionMap(); } @@ -268,7 +210,8 @@ export interface ViewerOptions VisibilityPrioritySpecification { dataContext: Owned; element: HTMLElement; - dataSourceProvider: Borrowed; + credentialsManager: CredentialsManager; + dataSourceProvider: Borrowed; uiConfiguration: ViewerUIConfiguration; showLayerDialog: boolean; inputEventBindings: InputEventBindings; @@ -511,7 +454,7 @@ export class Viewer extends RefCounted implements ViewerState { visibility: WatchableVisibilityPriority; inputEventBindings: InputEventBindings; element: HTMLElement; - dataSourceProvider: Borrowed; + dataSourceProvider: Borrowed; uiConfiguration: ViewerUIConfiguration; @@ -556,14 +499,29 @@ export class Viewer extends RefCounted implements ViewerState { perspectiveView: new EventActionMap(), }, element = display.makeCanvasOverlayElement(), - dataSourceProvider = getDefaultDataSourceProvider({ - credentialsManager: defaultCredentialsManager, - }), + uiConfiguration = makeViewerUIConfiguration(), + dataSourceProvider = (() => { + const { credentialsManager = getDefaultCredentialsManager() } = options; + const sharedCredentialsManager = this.registerDisposer( + new SharedCredentialsManager(credentialsManager, dataContext.rpc), + ); + const kvStoreContext = this.registerDisposer( + new SharedKvStoreContext( + dataContext.chunkManager, + sharedCredentialsManager, + ), + ); + return getDefaultDataSourceProvider({ + credentialsManager: sharedCredentialsManager, + kvStoreContext, + }); + })(), } = options; this.visibility = visibility; this.inputEventBindings = inputEventBindings; this.element = element; + this.dataSourceProvider = dataSourceProvider; this.uiConfiguration = uiConfiguration; diff --git a/src/webgl/context.ts b/src/webgl/context.ts index 5241781a6e..3da15d46e2 100644 --- a/src/webgl/context.ts +++ b/src/webgl/context.ts @@ -41,9 +41,13 @@ export function initializeWebGL(canvas: HTMLCanvasElement) { throw new Error("WebGL not supported."); } gl.memoize = new Memoize(); - gl.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - gl.max3dTextureSize = gl.getParameter(gl.MAX_3D_TEXTURE_SIZE); - gl.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + gl.maxTextureSize = gl.getParameter(WebGL2RenderingContext.MAX_TEXTURE_SIZE); + gl.max3dTextureSize = gl.getParameter( + WebGL2RenderingContext.MAX_3D_TEXTURE_SIZE, + ); + gl.maxTextureImageUnits = gl.getParameter( + WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS, + ); gl.tempTextureUnit = gl.maxTextureImageUnits - 1; // FIXME: verify that we received a stencil buffer diff --git a/src/widget/multiline_autocomplete.css b/src/widget/multiline_autocomplete.css index 8ff86179fd..86ad6b91ae 100644 --- a/src/widget/multiline_autocomplete.css +++ b/src/widget/multiline_autocomplete.css @@ -48,8 +48,9 @@ font-size: medium; } -.neuroglancer-multiline-autocomplete-dropdown { - color: #fff; +.neuroglancer-multiline-autocomplete-dropdown, +.neuroglancer-multiline-autocomplete-error, +.neuroglancer-multiline-autocomplete-progress { background-color: #181818; position: fixed; display: block; @@ -67,6 +68,19 @@ word-wrap: break-word; } +.neuroglancer-multiline-autocomplete-dropdown { + color: #fff; +} + +.neuroglancer-multiline-autocomplete-error { + color: red; +} + +.neuroglancer-multiline-autocomplete-progress { + font-style: italic; + color: #ccc; +} + .neuroglancer-multiline-autocomplete-completion:nth-child(even):not( .neuroglancer-multiline-autocomplete-completion-active ) { @@ -88,3 +102,8 @@ font-style: italic; color: #f9f; } + +.neuroglancer-multiline-autocomplete-linebreak::after { + content: "\a"; + white-space: pre; +} diff --git a/src/widget/multiline_autocomplete.ts b/src/widget/multiline_autocomplete.ts index 1b412098eb..e2ce2b5a66 100644 --- a/src/widget/multiline_autocomplete.ts +++ b/src/widget/multiline_autocomplete.ts @@ -25,13 +25,16 @@ import type { import { RefCounted } from "#src/util/disposable.js"; import { removeChildren, removeFromParent } from "#src/util/dom.js"; import { positionDropdown } from "#src/util/dropdown.js"; +import { formatErrorMessage } from "#src/util/error.js"; import { EventActionMap, KeyboardEventBinder, registerActionListener, } from "#src/util/keyboard_bindings.js"; import { longestCommonPrefix } from "#src/util/longest_common_prefix.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; import { Signal } from "#src/util/signal.js"; +import { ProgressListenerWidget } from "#src/widget/progress_listener.js"; import { VirtualList } from "#src/widget/virtual_list.js"; export type { @@ -56,19 +59,16 @@ export function makeDefaultCompletionElement(completion: Completion) { return element; } -function* splitByWordBreaks(value: string) { - while (value.length > 0) { - const m = value.match(/[:/_]+/); - if (m === null) { - yield value; - return; - } - const endOffset = m.index! + m[0].length; - yield value.substring(0, endOffset); - value = value.substring(endOffset); - } +export interface SyntaxHighlighter { + splitPattern: RegExp; + getSeparatorNode: (text: string) => HTMLElement; } +const DEFAULT_SYNTAX_HIGHLIGHTER: SyntaxHighlighter = { + splitPattern: /.*/gs, + getSeparatorNode: () => document.createElement("wbr"), +}; + export function makeCompletionElementWithDescription( completion: CompletionWithDescription, ) { @@ -100,7 +100,8 @@ export interface CompletionRequest { } export type Completer = ( request: CompletionRequest, - abortSignal: AbortSignal, + signal: AbortSignal, + progressListener: ProgressListener, ) => Promise | null; const DEFAULT_COMPLETION_DELAY = 200; // milliseconds @@ -117,6 +118,9 @@ export class AutocompleteTextInput extends RefCounted { private activeCompletionPromise: Promise | null = null; private activeCompletionAbortController: AbortController | undefined = undefined; + private activeCompletionProgressListener: ProgressListenerWidget | undefined = + undefined; + private completionErrorElement: HTMLElement | undefined; private hasFocus = false; private completionResult: CompletionResult | null = null; private dropdownContentsStale = true; @@ -161,14 +165,15 @@ export class AutocompleteTextInput extends RefCounted { ) { const completionDisabled = this.completionDisabled !== -1; this.onInput.dispatch(value); - const { inputElement } = this; + const { inputElement, syntaxHighlighter } = this; removeChildren(inputElement); let outputOffset = 0; const r = selection !== undefined ? document.createRange() : undefined; let isFirst = true; - for (const text of splitByWordBreaks(value)) { + for (const text of value.match(syntaxHighlighter.splitPattern)!) { + if (!text) continue; if (!isFirst) { - inputElement.appendChild(document.createElement("wbr")); + inputElement.appendChild(syntaxHighlighter.getSeparatorNode(text)); } isFirst = false; const newOutputOffset = outputOffset + text.length; @@ -216,21 +221,31 @@ export class AutocompleteTextInput extends RefCounted { completer: Completer; private resizeHandler = () => { - if (!this.completionsVisible) return; this.updateDropdownStyle(); }; private resizeObserver = new ResizeObserver(this.resizeHandler); - constructor(options: { completer: Completer; delay?: number }) { + private syntaxHighlighter: SyntaxHighlighter; + + constructor(options: { + completer: Completer; + syntaxHighlighter?: SyntaxHighlighter; + delay?: number; + }) { super(); this.completer = options.completer; - const { delay = DEFAULT_COMPLETION_DELAY } = options; + const { + delay = DEFAULT_COMPLETION_DELAY, + syntaxHighlighter = DEFAULT_SYNTAX_HIGHLIGHTER, + } = options; + this.syntaxHighlighter = syntaxHighlighter; const debouncedCompleter = (this.scheduleUpdateCompletions = debounce( () => { const abortController = (this.activeCompletionAbortController = new AbortController()); + const progressListener = this.makeCompletionProgressListener(); const activeCompletionPromise = (this.activeCompletionPromise = this.completer( { @@ -238,14 +253,24 @@ export class AutocompleteTextInput extends RefCounted { selectionRange: this.getSelectionRange(), }, abortController.signal, + progressListener, )); if (activeCompletionPromise !== null) { - activeCompletionPromise.then((completionResult) => { - if (this.activeCompletionPromise === activeCompletionPromise) { - this.setCompletions(completionResult); - this.activeCompletionPromise = null; - } - }); + activeCompletionPromise.then( + (completionResult) => { + if (this.activeCompletionPromise === activeCompletionPromise) { + this.setCompletions(completionResult); + this.activeCompletionPromise = null; + this.removeProgressListener(); + } + }, + (reason) => { + if (this.activeCompletionPromise === activeCompletionPromise) { + this.removeProgressListener(); + this.showCompletionError(reason); + } + }, + ); } }, delay, @@ -263,9 +288,9 @@ export class AutocompleteTextInput extends RefCounted { inputElement.contentEditable = "true"; inputElement.spellcheck = false; - element.appendChild(document.createTextNode("\u200b")); // Prevent input area from collapsing element.appendChild(inputElement); element.appendChild(hintElement); + element.appendChild(document.createTextNode("\u200b")); // Prevent input area from collapsing inputElement.classList.add("neuroglancer-multiline-autocomplete-input"); hintElement.classList.add("neuroglancer-multiline-autocomplete-hint"); inputElement.addEventListener("input", () => { @@ -421,6 +446,34 @@ export class AutocompleteTextInput extends RefCounted { }); } + private removeProgressListener() { + if (this.activeCompletionProgressListener !== undefined) { + this.element.removeChild(this.activeCompletionProgressListener.element); + this.activeCompletionProgressListener = undefined; + } + } + + private makeCompletionProgressListener(): ProgressListenerWidget { + const widget = new ProgressListenerWidget(); + this.element.appendChild(widget.element); + widget.element.classList.add( + "neuroglancer-multiline-autocomplete-progress", + ); + this.activeCompletionProgressListener = widget; + this.updateDropdownStyle(); + return widget; + } + + private showCompletionError(reason: unknown) { + if (reason === null) return; + const element = document.createElement("div"); + this.completionErrorElement = element; + element.classList.add("neuroglancer-multiline-autocomplete-error"); + element.textContent = formatErrorMessage(reason); + this.element.appendChild(element); + this.updateDropdownStyle(); + } + private shouldAttemptCompletion() { const { inputElement } = this; if (document.activeElement !== inputElement) return false; @@ -503,9 +556,12 @@ export class AutocompleteTextInput extends RefCounted { } private updateDropdownStyle() { - const { completionsVirtualList, element } = this; - if (completionsVirtualList !== undefined) { - positionDropdown(completionsVirtualList.element, element, { + const widget = + this.completionsVirtualList?.element ?? + this.activeCompletionProgressListener?.element ?? + this.completionErrorElement; + if (widget !== undefined) { + positionDropdown(widget, this.element, { horizontal: false, }); } @@ -610,13 +666,15 @@ export class AutocompleteTextInput extends RefCounted { } else { this.hasResultForDropdown = true; // Check for a common prefix. - const commonResultPrefix = longestCommonPrefix( - (function* () { - for (const completion of completionResult.completions) { - yield completion.value; - } - })(), - ); + const commonResultPrefix = + completionResult.defaultCompletion ?? + longestCommonPrefix( + (function* () { + for (const completion of completionResult.completions) { + yield completion.value; + } + })(), + ); const commonPrefix = this.getCompletedValue(commonResultPrefix); if (commonPrefix.startsWith(value)) { this.commonPrefix = commonPrefix; @@ -635,12 +693,13 @@ export class AutocompleteTextInput extends RefCounted { hintValue = ""; } hintValue = hintValue.substring(value.length); - const { hintElement } = this; + const { hintElement, syntaxHighlighter } = this; removeChildren(hintElement); let isFirst = true; - for (const text of splitByWordBreaks(hintValue)) { + for (const text of hintValue.match(syntaxHighlighter.splitPattern)!) { + if (!text) continue; if (!isFirst) { - hintElement.appendChild(document.createElement("wbr")); + hintElement.appendChild(syntaxHighlighter.getSeparatorNode(text)); } isFirst = false; const node = document.createTextNode(text); @@ -774,14 +833,15 @@ export class AutocompleteTextInput extends RefCounted { this.activeCompletionAbortController?.abort(); this.activeCompletionAbortController = undefined; this.activeCompletionPromise = null; + this.removeProgressListener(); } private clearCompletions() { + this.dropdownContentsStale = true; + this.dropdownStyleStale = true; if (this.completionResult !== null) { this.activeIndex = -1; this.completionResult = null; - this.dropdownContentsStale = true; - this.dropdownStyleStale = true; this.commonPrefix = ""; const { completionsVirtualList } = this; if (completionsVirtualList !== undefined) { @@ -790,6 +850,12 @@ export class AutocompleteTextInput extends RefCounted { } this.updateDropdown(); } + + const { completionErrorElement } = this; + if (completionErrorElement !== undefined) { + this.element.removeChild(completionErrorElement); + this.completionErrorElement = undefined; + } } get value() { diff --git a/src/widget/progress_listener.ts b/src/widget/progress_listener.ts new file mode 100644 index 0000000000..970f8c91b5 --- /dev/null +++ b/src/widget/progress_listener.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + ProgressListener, + ProgressSpan, + ProgressSpanId, +} from "#src/util/progress_listener.js"; +import { ProgressSpanSet } from "#src/util/progress_listener.js"; + +export class ProgressListenerWidget implements ProgressListener { + element = document.createElement("ul"); + constructor() { + this.element.classList.add("neuroglancer-progress"); + } + private spanElements = new Map(); + private spans = new ProgressSpanSet(); + + addSpan(span: ProgressSpan) { + if (this.spans.add(span) !== 1) return; + const spanElement = document.createElement("li"); + spanElement.textContent = span.message; + this.spanElements.set(span.id, spanElement); + this.element.appendChild(spanElement); + } + + removeSpan(spanId: ProgressSpanId) { + if (this.spans.deleteKey(spanId) !== 0) return; + const { spanElements } = this; + const spanElement = spanElements.get(spanId)!; + spanElements.delete(spanId); + this.element.removeChild(spanElement); + } +} diff --git a/src/worker_rpc.ts b/src/worker_rpc.ts index 25f5cf3223..d80804a38b 100644 --- a/src/worker_rpc.ts +++ b/src/worker_rpc.ts @@ -16,6 +16,12 @@ import { promiseWithResolversAndAbortCallback } from "#src/util/abort.js"; import { RefCounted } from "#src/util/disposable.js"; +import type { + ProgressListener, + ProgressOptions, + ProgressSpanId, +} from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; export type RPCHandler = (this: RPC, x: any) => void; @@ -29,6 +35,8 @@ const DEBUG_MESSAGES = false; const PROMISE_RESPONSE_ID = "rpc.promise.response"; const PROMISE_CANCEL_ID = "rpc.promise.cancel"; +const PROMISE_PROGRESS_ADD_SPAN_ID = "rpc.promise.addProgressSpan"; +const PROMISE_PROGRESS_REMOVE_SPAN_ID = "rpc.promise.removeProgressSpan"; const READY_ID = "rpc.ready"; const handlers = new Map(); @@ -39,27 +47,49 @@ export function registerRPC(key: string, handler: RPCHandler) { export type RPCPromise = Promise<{ value: T; transfers?: any[] }>; -export class RPCError extends Error { +class ProxyProgressListener implements ProgressListener { constructor( - public name: string, - public message: string, - ) { - super(message); + private rpc: RPC, + private id: number, + ) {} + + addSpan(span: ProgressSpan) { + this.rpc.invoke(PROMISE_PROGRESS_ADD_SPAN_ID, { + id: this.id, + span: { + id: span.id, + message: span.message, + startTime: span.startTime, + }, + }); + } + removeSpan(spanId: ProgressSpanId) { + this.rpc.invoke(PROMISE_PROGRESS_REMOVE_SPAN_ID, { + id: this.id, + spanId, + }); } } export function registerPromiseRPC( key: string, - handler: (this: RPC, x: any, abortSignal: AbortSignal) => RPCPromise, + handler: ( + this: RPC, + x: any, + progressOptions: Partial, + ) => RPCPromise, ) { registerRPC(key, function (this: RPC, x: any) { const id = x.id; const abortController = new AbortController(); - const promise = handler.call( - this, - x, - abortController.signal, - ) as RPCPromise; + let progressListener: ProgressListener | undefined; + if (x.progressListener === true) { + progressListener = new ProxyProgressListener(this, id); + } + const promise = handler.call(this, x, { + signal: abortController.signal, + progressListener, + }) as RPCPromise; this.set(id, { promise, abortController }); promise.then( ({ value, transfers }) => { @@ -70,8 +100,7 @@ export function registerPromiseRPC( this.delete(id); this.invoke(PROMISE_RESPONSE_ID, { id: id, - error: error.message, - errorName: error.name, + error: error, }); }, ); @@ -94,10 +123,22 @@ registerRPC(PROMISE_RESPONSE_ID, function (this: RPC, x: any) { if (Object.prototype.hasOwnProperty.call(x, "value")) { resolve(x.value); } else { - reject(new RPCError(x.errorName, x.error)); + reject(x.error); } }); +registerRPC(PROMISE_PROGRESS_ADD_SPAN_ID, function (this: RPC, x: any) { + const id = x.id; + const { progressListener } = this.get(id); + new ProgressSpan(progressListener, x.span); +}); + +registerRPC(PROMISE_PROGRESS_REMOVE_SPAN_ID, function (this: RPC, x: any) { + const id = x.id; + const { progressListener } = this.get(id); + progressListener.removeSpan(x.spanId); +}); + registerRPC(READY_ID, function (this: RPC, x: any) { x; this.onPeerReady(); @@ -126,6 +167,10 @@ export class RPC { if (DEBUG_MESSAGES) { console.log("Received message", data); } + const handler = handlers.get(data.functionName); + if (handler === undefined) { + throw new Error(`Missing RPC function: ${data.functionName}`); + } handlers.get(data.functionName)!.call(this, data); }; } @@ -193,21 +238,33 @@ export class RPC { promiseInvoke( name: string, x: any, - abortSignal?: AbortSignal | undefined, - transfers?: any[], + options?: { + signal?: AbortSignal; + progressListener?: ProgressListener; + transfers?: any[]; + }, ): Promise { - if (abortSignal?.aborted) { - return Promise.reject(abortSignal.reason); + let signal: AbortSignal | undefined; + let progressListener: ProgressListener | undefined; + let transfers: any[] | undefined; + if (options !== undefined) { + ({ signal, progressListener, transfers } = options); + } + if (signal?.aborted) { + return Promise.reject(signal.reason); + } + if (progressListener !== undefined) { + x.progressListener = true; } const id = (x.id = this.newId()); this.invoke(name, x, transfers); const { promise, resolve, reject } = - abortSignal === undefined + signal === undefined ? Promise.withResolvers() - : promiseWithResolversAndAbortCallback(abortSignal, () => { + : promiseWithResolversAndAbortCallback(signal, () => { this.invoke(PROMISE_CANCEL_ID, { id: id }); }); - this.set(id, { resolve, reject }); + this.set(id, { resolve, reject, progressListener }); return promise; } diff --git a/testdata/64x64x64-raw-uint64-segmentation.dat b/testdata/codec/compressed_segmentation/64x64x64-raw-uint64-segmentation.dat similarity index 100% rename from testdata/64x64x64-raw-uint64-segmentation.dat rename to testdata/codec/compressed_segmentation/64x64x64-raw-uint64-segmentation.dat diff --git a/testdata/README.md b/testdata/codec/compressed_segmentation/README.md similarity index 100% rename from testdata/README.md rename to testdata/codec/compressed_segmentation/README.md diff --git a/testdata/generate_npy_examples.py b/testdata/codec/npy/generate_npy_examples.py similarity index 100% rename from testdata/generate_npy_examples.py rename to testdata/codec/npy/generate_npy_examples.py diff --git a/testdata/npy_test.float32-be.npy b/testdata/codec/npy/npy_test.float32-be.npy similarity index 100% rename from testdata/npy_test.float32-be.npy rename to testdata/codec/npy/npy_test.float32-be.npy diff --git a/testdata/npy_test.float32-le.npy b/testdata/codec/npy/npy_test.float32-le.npy similarity index 100% rename from testdata/npy_test.float32-le.npy rename to testdata/codec/npy/npy_test.float32-le.npy diff --git a/testdata/npy_test.float32.json b/testdata/codec/npy/npy_test.float32.json similarity index 100% rename from testdata/npy_test.float32.json rename to testdata/codec/npy/npy_test.float32.json diff --git a/testdata/npy_test.uint16-be.npy b/testdata/codec/npy/npy_test.uint16-be.npy similarity index 100% rename from testdata/npy_test.uint16-be.npy rename to testdata/codec/npy/npy_test.uint16-be.npy diff --git a/testdata/npy_test.uint16-le.npy b/testdata/codec/npy/npy_test.uint16-le.npy similarity index 100% rename from testdata/npy_test.uint16-le.npy rename to testdata/codec/npy/npy_test.uint16-le.npy diff --git a/testdata/npy_test.uint16.json b/testdata/codec/npy/npy_test.uint16.json similarity index 100% rename from testdata/npy_test.uint16.json rename to testdata/codec/npy/npy_test.uint16.json diff --git a/testdata/npy_test.uint32-be.npy b/testdata/codec/npy/npy_test.uint32-be.npy similarity index 100% rename from testdata/npy_test.uint32-be.npy rename to testdata/codec/npy/npy_test.uint32-be.npy diff --git a/testdata/npy_test.uint32-le.npy b/testdata/codec/npy/npy_test.uint32-le.npy similarity index 100% rename from testdata/npy_test.uint32-le.npy rename to testdata/codec/npy/npy_test.uint32-le.npy diff --git a/testdata/npy_test.uint32.json b/testdata/codec/npy/npy_test.uint32.json similarity index 100% rename from testdata/npy_test.uint32.json rename to testdata/codec/npy/npy_test.uint32.json diff --git a/testdata/npy_test.uint64-be.npy b/testdata/codec/npy/npy_test.uint64-be.npy similarity index 100% rename from testdata/npy_test.uint64-be.npy rename to testdata/codec/npy/npy_test.uint64-be.npy diff --git a/testdata/npy_test.uint64-le.npy b/testdata/codec/npy/npy_test.uint64-le.npy similarity index 100% rename from testdata/npy_test.uint64-le.npy rename to testdata/codec/npy/npy_test.uint64-le.npy diff --git a/testdata/npy_test.uint64.json b/testdata/codec/npy/npy_test.uint64.json similarity index 100% rename from testdata/npy_test.uint64.json rename to testdata/codec/npy/npy_test.uint64.json diff --git a/testdata/npy_test.uint8.json b/testdata/codec/npy/npy_test.uint8.json similarity index 100% rename from testdata/npy_test.uint8.json rename to testdata/codec/npy/npy_test.uint8.json diff --git a/testdata/npy_test.uint8.npy b/testdata/codec/npy/npy_test.uint8.npy similarity index 100% rename from testdata/npy_test.uint8.npy rename to testdata/codec/npy/npy_test.uint8.npy diff --git a/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi b/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi new file mode 100644 index 0000000000..10bb89f11b --- /dev/null +++ b/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi @@ -0,0 +1,4 @@ + + + + diff --git a/testdata/datasource/n5/generate_n5.py b/testdata/datasource/n5/generate_n5.py new file mode 100755 index 0000000000..7bd8ff79c6 --- /dev/null +++ b/testdata/datasource/n5/generate_n5.py @@ -0,0 +1,69 @@ +#!/usr/bin/env -S uv run +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "tensorstore", +# ] +# /// +import json +import os +import pathlib +import shutil + +import tensorstore as ts + + +def write_multiscale( + path, include_top_level_scales: bool, include_per_scale_downsampling_factors: bool +): + shutil.rmtree(path, ignore_errors=True) + shape = [10, 20] + scales = [] + for scale in [0, 1, 2]: + downsample_factors = [2**scale, 2**scale] + scales.append(downsample_factors) + scale_path = os.path.join(path, f"s{scale}") + scale_attributes = {} + if include_per_scale_downsampling_factors: + scale_attributes["downsamplingFactors"] = downsample_factors + ts.open( + { + "driver": "n5", + "kvstore": {"driver": "file", "path": scale_path}, + "metadata": scale_attributes, + }, + create=True, + delete_existing=True, + dtype=ts.uint16, + shape=[ + -(-shape[0] // downsample_factors[0]), + -(-shape[1] // downsample_factors[1]), + ], + ).result() + top_level_attributes = { + "axes": ["x", "y"], + "units": ["nm", "s"], + "resolution": [10, 20], + } + if include_top_level_scales: + top_level_attributes["scales"] = scales + pathlib.Path(os.path.join(path, "attributes.json")).write_text( + json.dumps(top_level_attributes) + ) + + +write_multiscale( + os.path.abspath( + os.path.join(os.path.dirname(__file__), "n5_viewer_multiscale_deprecated") + ), + include_top_level_scales=True, + include_per_scale_downsampling_factors=False, +) + +write_multiscale( + os.path.abspath( + os.path.join(os.path.dirname(__file__), "n5_viewer_multiscale_modern") + ), + include_top_level_scales=False, + include_per_scale_downsampling_factors=True, +) diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json new file mode 100644 index 0000000000..7311cde9a8 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json @@ -0,0 +1 @@ +{"axes": ["x", "y"], "units": ["nm", "s"], "resolution": [10, 20], "scales": [[1, 1], [2, 2], [4, 4]]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json new file mode 100644 index 0000000000..7254f6e6fa --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json @@ -0,0 +1 @@ +{"blockSize":[10,20],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[10,20]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json new file mode 100644 index 0000000000..1a935f8806 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json @@ -0,0 +1 @@ +{"blockSize":[5,10],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[5,10]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json new file mode 100644 index 0000000000..2c2d38eab1 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json @@ -0,0 +1 @@ +{"blockSize":[3,5],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[3,5]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json new file mode 100644 index 0000000000..2b49d435e7 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json @@ -0,0 +1 @@ +{"axes": ["x", "y"], "units": ["nm", "s"], "resolution": [10, 20]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json new file mode 100644 index 0000000000..1d0eb09bc9 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json @@ -0,0 +1 @@ +{"blockSize":[10,20],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[10,20],"downsamplingFactors":[1,1]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json new file mode 100644 index 0000000000..08ca0551a5 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json @@ -0,0 +1 @@ +{"blockSize":[5,10],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[5,10],"downsamplingFactors":[2,2]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json new file mode 100644 index 0000000000..8f77ef7ea7 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json @@ -0,0 +1 @@ +{"blockSize":[3,5],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[3,5],"downsamplingFactors":[4,4]} \ No newline at end of file diff --git a/testdata/datasource/nifti/README.md b/testdata/datasource/nifti/README.md new file mode 100644 index 0000000000..0aaf544ebd --- /dev/null +++ b/testdata/datasource/nifti/README.md @@ -0,0 +1,35 @@ +The following test files: + +- example_nifti2.nii.gz +- standard.nii.gz +- standard.nii (derived from standard.nii.gz) + +were copied from nibabel, and are subject to the following license: + +The MIT License + +Copyright (c) 2009-2019 Matthew Brett +Copyright (c) 2010-2013 Stephan Gerhard +Copyright (c) 2006-2014 Michael Hanke +Copyright (c) 2011 Christian Haselgrove +Copyright (c) 2010-2011 Jarrod Millman +Copyright (c) 2011-2019 Yaroslav Halchenko +Copyright (c) 2015-2019 Chris Markiewicz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/testdata/datasource/nifti/example_nifti2.nii.gz b/testdata/datasource/nifti/example_nifti2.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0d9e408f4ebb41268c17a05327e4a398f069ba4 GIT binary patch literal 21160 zcmV(-K-|9{iwFn`N)l26|7Cb#ZE$R5Uv6n;bZIg!ZfR)%mAz+pmBricea`?YV8M!5 zK|w|Th+xA1B!obENFj|9Qb;2SNk{<#3BC8;y9mhpJ8yjU zevf@T`@?1(N!D8T%r#d%=bFk3)^P^E)!2EY+H=(^J2jlj&i#M2|NZ;azkeV8_bkVfVp*e}BJ}^TvXI z>;3!rfA~}L-|t$q`R?7f-*sw_YW#NN_iO*~P4BkfG-y=2O~1i?2KK7myPtjy`D0MG z5&r{;|EI5{pMP~!``f1iGWgiM>hX(`Klf~Iva5%TQJtIfx$De*pXKt`Dg5UJ_b+et zH|#*+8%_0h!lj=2>-<|@-)Hf0a%;bP($nNyxjRJff6-}BwTD}N$ck-xUc2k>_x1bV z^sDjZ|Mc&p|Km&XUz?u?_~|ufM2{hZ2K5>|q7k3|_rKb_{rCC6A%pw;Tc+{Vzu9C;`Ppt} znWfZhYkHfRroTDwOf*+1vDVBp$>zH0$NN$<$*eHJCe<7>i>Nuzbf>j=lVVnyYtHQ&O=DC)mr{tJ7g!Am{!j%f(zW6W^0 zESba15;GnBdYN>jTWLz5ycm5zG#eAv8i zT0&t8_KY_t%saM&eaAj%{m^e8Xtw3~>*gi%H98J4JIz5_-Uyv!EE)^-56p+=GfK@y zlSfSr+se+ezu0!6T@p1Y&_ACSBmvb8kxO*LE1 zzG{E7kK0@3qA5U&15JDL9o)6SyQ1*JT(jTob$vYv{~nKh-!WgoLo@RYv<~C#N6jrH zEQ8Zh{N`7_{~76j<98bERv`Zobf3qk5ZCj5MoXVzo4%CZZ*H5jrlzfK@6di3yfrhg znvYE_c!=TiU*;N|m*cJLp^@(DU?x^*XPRP#Qq$0WZQr!r?fcl^Tl=VOZXQK>T?O`uo)WY$K4YBlHvCwg`J4F^;`y z?(%LOK2ZY2J$UKjwMc(Y|1xu{G^~>;;pFl$$}6bh8aC*kz2pZth`& zVq`x++b7XjB>uPq*(%wC_)i0C?88v7_M-X6+(2XL)F^|$a=hattv_d%BY6z+o;Bxa zKa>&|%}rhfXy%%!j1~XJ*AKzdRh}<^gKBm!T;x&CvGwgA;6)HR`JUJa0tX*AS&j!1 z4no?&*sKMy_8WGdfc93nmQ2IfrqE_Sak!8e9YD0S!nVOs_rph4i7DFhcs z5(_@m{28C_3U}k&ClipMFL4*|ewqvVC7VC&VbIABdSP%s5jkV|eg-JwftU26Ek*h) zq?=0A^rOXDa2^XMUZ7lsdBpAjUm`(~6zI-_yQ%1CG(IvDIlRmrw3CKU#1OG*$S}{1 z@c~5JICw6>LMM0<0yoQs@u(54Sa;RSt9>ZhAa#7`v~ zPc%+~;z0Nx4`)-5U=IG832s!j+puI1SotY+`hbsLP}_srlW6AvK5!8aor4voq3s`` zG8fB^07H`TnXPznHdZ0MF>iq8?a|4%#P=wWb|Ur4K$x@84@9!=_(D^(Gae3KH&3JE zOtafu#tSmgPY?4Dp3?-%1JSX15-%j&&hz!WqTqQB^vAg9{XAtGV3S-pxC9R;!2coC ze!{#7c8$k6sx2?Nihi%7`#iKZm)cX{zlo_t-_QuF=7SN(slOj7f28Mpf}TS7IR@HM zMCD1Wx7$>;H;A?@w7mqaG%+>cz7anew0?kB1%9EPuG^0!){=Wn1tJq!OP%hHWrgy1n9x#s~Nn<2<4g`7BHn1;(|MiL8-{?i3G!A`4 zQ*^NoooobgE`z^9uvNrJ0#w)GA`0f}8cnpd!+U~?mxQimQ(d$(FDguwoHxJrWv)k$8ggX1o zTw96S8_`)NIFLda4|q_nund%Jfmipz?>zBhZ#*x9a>{9H+mSTO;B62K8CU2;0rB)QBSMWK6mWA>0@IMVIE0OaF^qR^uUpSZtM?-ls z7bIIwJ9)%U7FIZp-t%Zbkr;>ui$rfcKD!q$s%iH^y9B$BhKi?~i_Qdj7NCI>NL&x9 z#wO!o(Qr5%>fX?f!B@8vx4Gb7G{0AY8$VD>=rS7}ETr^GxBZs(AX-~NjX1Owjs$a% z!v{ZELF>8rUlzapi2FL!8bcHeM!P=5y7)b7QtcZygVz0^FqF8S1?4!fZLWEbhNz@F(p6O_=J^1&G zc^)L1M6Cki>jb|yq4lLadj)*D<~$D0&!O}^;%grnaEAFCEoJcC2wJ`j{(KDn20?8T zykDk=Sxxhyre!lRPMJKRW* zJ^9?nrrMTZXC>R-hT0Ep0ut6kOW)C7Cedea#6Pd&Kl{Ooy>OAt-$XpC7ZErX-hAy= zaQ7hCKg+Jg3#0L=K48TH}Mpuk1N$24JhLXk-H3y93^if_Y7Be|UZx{Qk|31Vb-Vx)eL~ z2PMu@`Y;qvnT~cM-aH7dIzdI~H6MQ~fyV20i#h1bFy&6MX=e|CVk)15*Mt%!VNmhL zrb+znMc+0N4DPpIU<=ME$~h^1#cNlq2CzYZ@@CXj%gr_jSEQZk%q*+Fa#A@0T# zx54y3VbBbRY8m*jm2W?Go~9Rm%$`IeC1`#r5=7w5Uc{3RICg}RAk79k26HjIk;Yj zj*IXTKO$(h8{yN4kyY5CCiuA;?XO1;jj2aLK_l-)&^Ukw>evVDHezfA9zPj51M$94 zr1VF_d1&(w7^W#MC1+-LxK7RrkRzPJc9y}E7 zEY&;B$%mo>K0&n8c$_0LQLMa-ls}dh0;cg1`J^3aZ>zo9A&ZD=@ zp!8zo3gjmM3bmQ3ScgUrV3{q@O96YI0@s?kPo=#Sd_eefiyZ4Rtp`vl5l-T1<5Qw| z0@_K%ORD2psmSGF-UdHv!$%OBiNnt#q5rh4ga4Ofu~00S3|A>cU{&&~C2+L{e7y{3 z%ducEx!ETm*qiuKI35#;SCpfn-|g#mDH>ehYAJ}`zA6a#8+6i$TV)Zsypz{>QZ|(QW*pK!>>}_D+6Z;+^OsW(^qWDyorUJl(n1P+2GIUW(4isy$}32?6zyC@ z#_lz6+-pc?SvF!;J+o2ix~RPs0d) z3J97*F7X!6-^U82SnUwrwTJjgg^x14aV0b+n3q9=U+{$2K#w)xX95{)XWPjRw;PeC zHKWAQSRn@8+=YiT_?O1g<+PrOCr6WqPez($pvN#f)=sqj>HWX3&oKgDfmcs}w@9?T z9PRJJd+(UXZ2{U^4tA}kzQzv0t}K6>k+zRrXt(17?Q9J);S>0K4n7=4$xM2kgFLxx zez3=oUXgehTGounpXBWS}MX@)}!r2^bm@U7D4AG_;3Th=b_aAqEO@M2+Cw3;XyL^L&$p3 zG_z;iergSR4TZ;4^#3RI$6$fyz^6cTJ|3S5$NPmJi>begzG;_v)lRjyu(Y!5T~JRT zPUi7f@!|`GbLJVl6G^i8P9tJPxEFFLBi}}iv!*}(a|B5=MhKy#51a-Qn`7KIc9J0$ z5tIASn{rP->^F*1(QvsLblvRATmqJ6xzde7L*vjuG%scJdEi4H-dKQUW}<<~{2mR8 zMk3)>Jp3s5lk0kmddV434stV-P-<$vqnsGnh($D)+KJZZf~(4*!;n9lHk0tsQ&3yY zyGXFj3mKzmXAU}C57*nVUkaSXAbm$Tn}rnP;Ubhalc~R+S(nRbZ5`BNsI5`7dcCet z*@EB7JC&VfqWzBeemJi=XmJ&#*YYIS&3zIiq5l)P@@{IEpddgR_xjNfU_oe10~8KWk|x4hcQTeBN=rG74=ipw4Bi{10)mk=8=d zQw9|N1bg2`V;kXVFJ5sGIw??(hlkcYX^I7eUKvPM*{&k4OBuyIX?M_a3YL8nlpo0Z z0%~j_PA}nC%HZPRcpTXCDk$fRUJjX_%wA5h`-tlZTG@{jWZ|!LF1{$a^^=&yhZwoT?o=B#d`(tD@r`%DVvOmp2 z?!q?TGX`pe7k|mjYcuO%15GCzL>B083$RXiddD8F#`EFu0`XhbZUHTe;W(4_M=_Su z+{+g8C^Ls+?I30j``KjMi*ax&GHM?F4>-;vGL+e0U|hNr4Q8R`^=P*Rp0x_SZo|9V z+229VUu`?P*-o~P*!4t1HZ)Z|wC0j_Lpufk%tCiL)Of&tXAfbqDQG1UbXkJk*U&~HoLxt2Js2O~bn2Rx_~1n> zrS|vXnOle<^*Dbczw)9nc9ULArH=Qhea;A9!>z&6+8tvxMhGqcgfYA+@8$AMN zTod6qOv~SsZP^*RioyF&J;nI&5!tmqy$kT}4U3p?4GR%U9(flY& zN+g1I!b45_mHmpobSDw91})D9n#E1e#2{iuRTCi|gU?GG$i6t1=EDvSv2tLv0yxth{q8R`N!lTd1YAnE;-x zro~v~*@=!c1}{Kkmyl@@=r|Am(CSDw<#Vt?HuVd57l(c#`8@~u6VS*Od_g0IzoE1q zoo;mdhH*sSV%k`Ue1-5-Oa_-u>uYH<4~{~ROSxew-&7F26<9UJwN^3KABKF&tE14L zFd+q0|C82tNT(|jm?15X#7Eyx{D?Eo}9kyzP;UP|Fn{ZBTWEyq7r z5-soIff~!X6-X;F8 zK;IV*Mq-ULx9{AK-#$uYMnP=@^3TL~{n39Gyfr4{>S?{9u+;SCcNx8PB77|Yqhs-y z9NwQGI^ML`&|NA%D!ciktr%iry{T)v*fBN$GV9l$V8;`~v2g_t`F_gcHqYD^g!Rx_Ios%Y*@ zGsbCHJr#TWf{#AJ%2_oV!5TwL^BwiJQ%iF#mF-cyS>v}mNPiOxl_RkSc3p`VX^mBx zvQ`@!GynIJNp~v1F7@>Cm=q#aYnIcX^%o;stw23s^Ff~l(4Wh*V0?2or32B<2rV39M#>>2t1tvH5bg&m;(8}=C3b{Dz5s2_^u7ehrOuTA(+6&q#tIf2eA_9Xtg zi~2jEA4_Siw-qBvb28hf?LPPp#4J`qji;8Qusw9ibkWTnmrHWF&F&+d;&@9WXJK@3qbpPV{PiDvAE(5Hu>={m63` z3L4?fA_jWkM`bQn6=8$U_)8XJLm#q>>2MjrPaM*&K^Iy-yx^k4A-p#T4J^b*r_mdD zz-<(5UWD6tJg*I&?MuBd+R$%*d`FtkrU%c*BQzfrO6x*Lq0b!JQ-6IHK0LviG^hzD z3cE6wE|)}*{KQ#dFVx}C>q(O@^mkLu#Vc>@%2o;69!b!axC>V zH=ul8IZ}NS=bUw(0VTbVbvES_D5ZJBGW@RykGzRLB|$qLpVrLF68MYdwUDT|2qHd? z-uqH!2=wPuKLFVh+~`-{v58DWd3Lr-V;Pp4hxS78w5envy=`kOr8VFW>?}B(hIdML z*+{+{k5mrzpv~vA@L)3-(gpk)Kpn?kKxSX&-geSQXW4D6gRF<|ZbV2Jyl$qvM!(w_ zKWRpN4V;u=+o7P_K)8RE5%U|Y|BkXB+uk;b+CSL4a3zGAfgbZ{YYP!^oeVUXYIn5_-{_VS8Wx0oBZ({J`sa_oTx zyOTrSG2@{0puItxm+^}bIGBmWR=5aK#~wh7%kZfo@V^$Cm+{SOV5SGP|3m|wkz*RG z;8l@Av(+U;!a^(|tkmv?)1XrfLHb2_#yq@JyHY~nB9=@(6JC!vtDM_tX(y7D z(ylz9lo(YUd%=BpMG#QCGW))`C=}L{Az$$ZPmd3aw{? zp5a9IQr>4%TI=jZtR?%?{}d6+i|FOTka;ofD%VjDwE>;JPy4GWTS|0$!nt~|cs?b- zVJs`6eVsHX)I~>)a<$V&EAA`tj2&3w5*c;|^wvVbgW7RKQ7Y1}K_ZQxH#i+w(a=i7 zSa=f7Y5pXPzuRe}2*0ahld)MLHY#=z)Enx;&&533L+-cEDTUKh$d-?UIe2Lj&&r9B zeb7Hn+#cYY0;rYa7xU12Fu&E47vhJz!Hb6W5TnU4UKT8Ap8{WUxr$OtwG z`@CR#G5c1RyzN75T*)>ik2#HY24a~hl-JsC4iQ)b?u1{(Sa9LLqX)(0P_XASUf+_t z)nXjkiS^qgH0FtyOhLX<&?pb|Z3u_reiu@Y;z^(GdTJk@B7)l$T`z( zMXPiH_;U&6Dv>{(<*(*Y7m&LKqOtAtnrF?2wg)x)fo}BsI4!{8@7V)$1CLQ2GX)E34_hw1S3Ua| zn7IJW_l3V4EOHR5KE}Av3k{Co^@D8#igvb}pj_GR1cg@P1&X5eAjBhBNAnmPkvtsP ziz#)JyzC8j|Fk8C9mpEalgt1-Pajg(o~Oh;_|@p|DD51@i|&{28&3;v*&2LI&1t|i`Fb+6m)XnL)k<%8%6nd$q>`bD^@cM2e8== zT1*8^w0Gh<{&NZs(hTBw{9+-#9|3P+NaIJ{+3W;rk7dJXMKP0u&lDk}Rvtr%a;?}u zYNb6PpAWvTT`j@H$13nbvzU=io)gCN4KC`Gp>fSNg(KrEsGLPlmF!mZvH}d#-lIjl z(+X-5R94~9`OZG)dvvmmdcuTMzEf-m@oqgDy@T{sYy~_jC-y^w(V)dVsA>L=H8H1v zjjDaA8x4g7d?pUgBcKqA4)%f`4e0^Oc@l+B%s~$es5ck>GSIPO6K9mYmv&3Wn4oO+Cdgfy=6p(X1Q{pw1Sqr&}%=^>{JshYA2W7)%`SwWM7OpyFc;cOp}qqRJZv4inbJ{E)-F~_ zF%L^9BPn6z@*0Tn7(L8F=4U>|Gd0TaqEsZbwf4OY&rtrMJwT~E4c;@~|SL64Gyk9oU(9!8wx;!mgW^Xq({fOK)RJdYR*!mI0n9bXW2f3WV**mh+W z`a!(x1buM;-l!f*dqp;ys*FA^qRj|bazE-PAju~4u^mkOPo#ba;`dYgU+7soRkVvN z2o0`7BYD{8A4Uid*#f@F!uoz_Z4>lEiLq8heM@MxBa8X~3a?@1?Zl8~Q?zQCj87cK zdk+&w>AX)w-f8f$19aI(WV~X#fm&_IA-^P&yHh_1e^E}Y5s>D$wZ{3dy-Pgh(Ru)y z4X1u2R;gr<)31*Jx7xw~Z|I;4{Lgoh?I6!JKNF4)R#5j%n+wm{LB%*9FWZRSD?_!G zolni4j9`a?!NZw>j3@r9+N<=L33y5v-WZ7%Ep#KX?|ky+AUyIEImPRCBX;S9_N2kl z%t8)jHRcgp%&6Ldb~)TCMm16?AhX>_t9#%*5Y7E#I)jz9YIQ>XJD1OVhd_7h?iWSa6 z;TRUsSf&9Unt~MZ^zz9r3f2U5`@8Ko#=c#^|K7H?J&2wT(*vmISnc+__1I?_U}~eo zV7S-lLo@%HQTmI_^-pwAhaR*kEBMb?%`=w3`*u8}1RCY&{Y^L%2a#yR2O9IRO9s!g z&}0>``%C)XruHjh;1E1(j#j%5mEmc8zlV`~eOm}G!F=|CbBztOZXh2lWN!BjTWbD; z2X2Go{rFWT6cUMVjRaStzpMCfC0hU*FXXiVDogR@IG!b=(R+-XvgxBgw!&-elUPfu ziu5#ME{i_m3ikgSiL$V#H(UiH$8x+Yl2&5z_HuYSh2Q)|d~e3WG0;!MQpyAK(Pb_A z*kkaa3{>k^^N~P%Z{na?Kx@`6LaTK_(k1Y!o$?{j_lDYPB+D=sIv~)r}EO8SRe?ufE=NOr)}+S zG?D1UIu*`6rwcRiG2{*fSV`*W6E|g`<>?yGFYr7N8&Vs&j zZ>_#uM1$v{8wy|dcjx#(yQ&q!b7C z9>s6=lW}$v$gDA zw33e=wcCCXR5H<~_7D3aK|J`igdV*DuYQW`tq-;OgP#4^|31og=Upe_zq-9i{cQNv zX^LfNL38$+@mPfa`6IpdJKZp!fEWGIej94Nh7=RLB@4urmbo^(6z{1c&QrX*>9P3OgOe4yUnaIR4)U8A`zBTc$ZQhSG;l#P>hJ z64Tj%IgWmC58iWz5^1!PP2HMk_awCw@nD@TiR6`mWvbx2J&|`Z$oC7a&ju$R0fjV9 zDZus%u-8&(T{Q2Im+!?N{OC8;t7+%qVx+l?4Z0$KHT2*C{yt^P@wfndMCiPd_*sQD zuMoeN>8;fxMnN~p^$e|&9b?t|8){a=gBHO<9ebMRfl$}VY5_V(CeCs|$G_31=J|uM zzkb4r1Rr$U5Zn9M+vE}hsQ;B!j5&1&D_Gl^*57c__YV>>;4Bdquqwqgrul9Cpm-rg$Um*7$$L?2lelZ5S z#5&l+P}VB0@J2gu4-loduzn1*rZECq#&7NZi--G@%$-id2Yw}U(x`JAdyB{6^QG_^ zjqbD_rSV&3up$<%__*JWBi~f6yxaT)YDFQz&-CGyX<;Q1{XTu*Wq1vzu14vbDfc#h zyp%}vhISy4xEgI%VNX~mv{Kg{JM~9@zY>R$c)&?4UWoUFfv{P;E1~RRd}jrA4MziE zNWGUHuP?g&3@`qTnqLqDKjHa5<0;xzk%IJEXH-eJYG2k1Ez1lYt_x&`r6PMzy$Y&-eA z7j?DELvwkf_^erxKz?iFdxKHQ*H~^a2sRM;_nYqUG6bZEbkX}XQ9hpXMM$sNK+Q;o z@Yxp&mVmxz$fmlvc-52at0VL41Bisrpx1;x;0PRe5d%@^U;D0n$(aJtp(4kdpH!l$ zArb!-*w>ESuYooBc%dX!VGThtcL?qP8pCkD}L@ zNsHew$JQQtBZ!0k;6NTa{R__P+uraoiqTUCsC{5BLhHUgKgU;;arVZ4`_q0G(5E{X zCIk(zxmM%rLNbR1=(9DmtKQ}nWYoB*5U*N^=YEUSlfk}U;GrHU>`xXuf%SABXg&vq zSHSCLwDhQbiR|tIvoi@;P?4{>wNLSx-|2A`^|O(nKlt%GJdD7D@1W;L>@pBL2}|FC zLUS@=?QjdH=bw)E$Ciin`{3@pol-zg0NtuEyl(>7*pk8e~rQ)L>JeI|5eyv zJopg+jZ5g}eP%xXpw*F3>cT#x3Cu?L(U&%09bzROoR0U!<0tG8LY9-nqt+zU56?l8 zYWR9@^wrglrQiPnO1-g1B)!BQ$BT9kqB+fv)gV@se{P2BARO4?p!QG1{-=1s^PtEeyBYrur+tl665vyNY;@`cBH zn0yzj|Ag*(5&3QCL7OoO7!RGZWHu#a9GV>whN|C~K>P;sX$c&xH`d;T?)zi}@6q4> zPWJU3vDgesgINPOY8>!#F5GHwP#$gTB!MU17>_y3jfLYeFS}~ zd`7eG1If5&q1~_Xm>?|H9jUv~>KJPO$ZH&bcQ8*k4sB__jAjkvp|%*yC87y`=4+of z@8D^Dsq-h+>q5_YlAib@YIX(_z3ESfqP+|xEl2uPe18`DUkESSquz!Uq=m>jlCpJ( zqHECAKCe6G6C$ENGzXEt%|QAC_}Ow0P_tvoJp4FmJDwb_OsfAWbjyvk6--!+P44aevk&*gerUj`fPmjt>?rg|{WdBlpn_)i;tN1>WYsI zWXEiMsC6L2*Xfoq_`f$TjG#^JwHb|ube?cHvi0M6TYgW+7aKDBH3Gbz#fi`N*cUby z=|@9x1{8uRHyJ)>V*{-PZ-Z0KA@)YX-prtDJ--{e%c8&E?4A?s2B(A2+6cUD2zLE} z7|@Dg5w&DT?YjSsZ?y*aA9j6sp_@hcNH6;Y{q_u(-}=m=4TEQ$n(l)SZiT`@+TDaV zZRE)Z_-|KE$$i1BozDN2n@7OD7x4Lo%x$+~=UP|%vlA;yEudHe_N}8A(>W8ZgdRZN zchOl}bT3s0_M8Oy| zv%~28*8rQ&c;qPlI2BE{qh=HK=y}5RdAKjbuUEil2G9E<*DvgK_!vF3!b1NL1uuZ& zeeB;LY5~tDur~iCJp7Do+RL$(esmwY)NGtu{}nrZj&whuzuxHd5^<+9T4i|t8tkjq ze?vRpQ!*8~w}IWekiFFPEXA+RPB)|e5WG=YTn)wzkJH0TQ_VS-@j5zuo#)zrc!IXe zkTMe;XuqTOH_k+|-(C3*nMR=RhxFy`!Hi~%+ur76$$Qwg6&|Ub_j{pn8WhU~AyS}} zf=qdQI}-|}=1FEwzD;j61ul2xEB-DDauxO8Yka5qG_7XkeGvL@O z_8Jtc+H>f%0IRI$Zz(Nn_Wnhy^H0&(@F4zjkjTvC+keP|w_~BJM(027BG+}kQ*IuJ z&90%llnNB?}B{m;370zDx8j8;j!PZ}bKD{X)12$>bw)VYgmqi+0 zCtT`J2D^~j-w;W&@sTbdR3R1`jkK}EvIpO5-`Zk4MYHDG1=bB85Qa?0Q@iqBt3N~e zJOk96#@})L)@p#4d5COnGTPSs%o^y;10}QvvNawulC~y;D_uc4U+VUC-|6gwH!^8H zFW7vG?`y;)DT|SCI27i=w|4RkC5km497gT&cz+1;dJrXxX(O0-I;GRjYJNBxn`;l9 zc27@(mKT1YIgII8L#uT@=yfXk7>X|X@~j)b{m@XcY0s!hdu{^YQM%CX~;DOoAjsk39h7R^mi9{X~%)q z75Y=t3odH1tE2(FQXak2Sy1308tld%pJ#~ePiWbfQcI9eyX%Dk`;j98erBNWks#zH zrvW>SHP^2lWP9LY2~yYO^w~@Nd`*1M0$(y1(=@Ud>A|c`rfdQh^P=_(tcrX9ii-Xv z{JI!DX;;M?wEi4&eTYX*1q*a``DyaMn_$#hK1bsr-*SSjwtI%GCte}#3i&tT8+aNt zpJTnf7C6xXdJnm4JKc%>T=IrQdZQ-j=s8ZfHDO<2G(NF`v8uJ&U8$2vmHU4SNr`&b=gLrBDYynrbrnm)K+AkRi*Ix9y_4%nVeaU;D07F|a z0!$+p9fZ|hhP$5FQ!7S0@tq4GNIv%0>ib%}B^zWIh7To?r+!Wj_Bbfo3?Al@i}_-` z&iLO7N-u@y{caEQu+`q!1Uw}hKhXIOMffH3;xJ#(2<^Sk`QcYUKka$a9-UZP)_%Wz z)VaxAgHDHPkJlc)k0Z)rk>(uZ%iC~v9{EnvM^q>OuVha^VH9m^Ui=*29|ntGuz$Lk z&>xJOMB6&Isr`k;j04!W>-2RNI;$B$-=lxt>(0F?57I8~WW0PZc4~_~hhd%0_=iqt zg`(Sil!?bX8kt<@257n+eorH@&PvSXr4xd_ZZ;7BX0<1}wD(M>I~RaWx@}-1K3xpe zA<(}s!^)$aZkW-%21B8uS$Lgs&cGU{@NJDbbVfsKtf7<}kCy$hgRHKMIFs+S zH_Z#~rXiOHzZdh$Lt?EemE$E^6Vdq#;om4|M`0z+n-*gM&7`k_-mmCh=U6;we+u7Z z;SYD9uT#XUsiE_eG0^Zt=aVU+IXa#H)y|0s*Ju4*)Ey5eI^~@~t$lc5b*r+H0sYP5(tNUW5i0py2_0y9`T(lf%8t z^9<-;LW)fE(bC*?UMKTfEOfj^rZ`-F9~&aAOdWC zff>T5@uVs6srz5jslNxWyNcgveMFQO;d70N?{}cFifA|mg6>AstH`Yya$2;3N8u6eLcA?qSo% z>Wr&)hiOmz&#VPK#4Nx^*trGZ2kvBcnS9bNnszI=wC70@&8$HpBP_3AW21{R(I zg4}hUKv$pRL(7m)H=XG0MG)=9Li+`t|Kqeq%8SHWD)UN@f%v61UN6FIf}1qk#qqu5Y#z*2J8ckq+%puL>(<;Z`_#S)$7D2GNa zvh=2x(;3~|3Nd6Tj;~``NkjJYi4vS z_1oA2dxa<8FbW@M|Khs?_`w7`IL(#rI62)R^P@e=x5>0zjyLP<{uatz#52CK-R%D$X&>q zi!ZI>sV^mU)_)qYlulf9Ash3cUzkQ*X%hqrN8+ zYIa9sq6##8nBUs#q4XHso+O@xQjwE?J3{-3xUUg-u1 zKj5(iw~rva7$*o#uMALv#$32V$X6@T)gG9E9>QIMj;w zFT~_>dYf_d5dEO8^J%)->3HwcfqNdbfvYD zy_D5ihO5N*?|d)(T+h=;xEljMLc%AR>5C@syhgc+tRmWJty{l;7+j1HI*Z=SZ?TtU+lh_mT*jKv; zbo-a~&t}8hHgm|?>qL`-T*Aw?@=Y#2vjlGp$6s{H>ok1cB4&MvEl=nzgMxMt<-ql3 za$D^UJ7Jn(!?S2y``mPPItea(X=xH8{%7qCDEeX*&4OxC zRiK10bvwRYhCghF;{cFnGT&?5uf5+z_?XUUu6He>Y-B0folbaY{UOR!w%g(JLG-V= zT-_|V2$`l5BRVOfo!}dYzv@=|^W`1Ny64l1W}6pdh4Vy*@?z~e*N%pPJeyBl?Sb~? zTkXZv`Q5EN)#(h~TCtc?!ALO)t7c%&ZA6*Qi7i8G!|+_)0XC7RT1`o$-g?I8M=6<( zJYmq+_2lFZ9(fz)Y6Dc=h*V0p9uau z2r6qA^kP1*g=PhPc1L>;3G--A*r$D!Q$gS1M61pQ7EnU*7lWiTm>X-1_F`#C``NPS z8>Zty8hszacB^g z^`ohK&*=l#S=2vFufCTu8{tH|MLpQ_{vSA)M%g2bKVJX?)O*I#%il%zksxCu^3+*y zteHn;@5g9el4$;HEgAY}=(acgY;{)r+JSl_89}tN5v=GO1+}}=bG4?dR>=3z{(ho7 z2VLYsy#P7AnTs01EaouQ3;rVeoM;10S9={#?E@#nh|+eTuTI=(_vB4_*QY?JB>YIe zkb+*jf&wG(m#6Ik;&uYaJ<=AkcJ!9rh8)`4IUFz58JZL1W4GM#K{~zNE?3U4L6QjU zmQTFbVFyM#R&Rb|@5fYk_uFaoo{oo41PgTbM%?$dCx{>IT;5FI-4@$xKanBd{Zic9 zZ^)ecF^l`6y+B{3dP&HUifszfeKl6O4&oDvi$J*3`J_yEOmQ>g9rVZV*oV;hXSM)t z)z9eEwsxOr#X5`Z{ZX5S_Gh}biNM3P^YlEw_kiv_%=-=+;!_Q~3yp6ePf}bK6OB6Q zn+y8ygYQjPeh60A$<9T@?n<aQctbVelyP6tx<5Iy6I^o(cG z$P8jeyU1s|_^aCsE|NcfMgRX3?Y(NXvakGc5xUaeOO2K{n%BweD`-Ckj;2w!n~Td! z;Zb+Ptv4^xgX#v0lgOBar)k_g0sqq}44p+Vyb>7YXq&Vdm(tF zGjNxwbp$;N+tTr$c26Dwk3Y zr<((3LOX^&C5xBNBIUy8awz5@W2Dv^GLjc#rThE9Qs_B8q4hB0NBfg2psP`h_F`&$x)2@$p{ljc zQFxzrfodM=Cg14B4drHU5c?s#W}_eN=23nY>&{|k@J+{_)e}(1-Xy^0N{HfMn zb@yjOMy6UB(FyBC_-{Pgoek<`I4BZINT|us3;xi7MNuh5Yfd_CN z*Xh7Kpw<#+q9NVxroCfZ@LS!&vJsARpixe(Uc{kpek_9f5WAAR&VRA1okhCB?r*nzbbYG98SW@x+P@; zp1F_St&%OL?M+xR0_ilS3x@L@j6R2xK~7~QKae^2Yh*grZ7EXgo-iRtF0E@nUu}B| z{UyVXZZYx4-hssaMsO#G@$-Dfz7xnLTXD|*G_j(c3V#w?X?VWIS2bB7uVJ^LZ{1O* z+cVT_T_rZ&XAL@l9B?{g(0c40sm*MtRz)u0Gvn|Aty}FN!)j)ADnaMwW1yimDc$GO zf+(?I@545l{^BF^r9DiG`S6@Z%%31~JkY=;_&-5hRKUM(j!J}o_0Y1^Y@~eNegbx; zI$GJ$S?vnyM3Ql6|Dx8%ZbDP_@6l!;6tnRV-SDCL*zI`4Su@>f>MVC^fZZF2G|f5W z!}S_)s6T&ilS3UuraP3?ts9yb)ERw6&K^oWX1S%;@o{Qe-Lj@t&I+C@YtU|`0(|E^ zW|ylVo6ejrfQw0P51{*RgwrQXe+ynYpIglZE~3Ryd}J=vwaax6B_3mTmnm#?j7%bGAXPU?IL&6{;_8NYYPigY__SvO+O(W?)k z<@@`sf{`KueQra?!k-fODTLctIJm$2T3M#FSPGBQ>@nI{4nJYUvM1$&(2mCRI)wfCs0FmI)h*@v%kc51 zOc-;5?~rBBfh+CJNN{C23QtckhOe zb#SgBtEo4J>}?u4*~Mt>2pQ8aQ0PI+&x3H+$#l-U zxTgJ*8e<7_3d!FZSgo%|qw|S;pFunwA>V$GT{n!q?Vq4WFDXvlH4SQw-AXl zh=4R~VC+?wYBs*7z4cjGxEQ%AqjzNux54hIb`h3oN)M#_Do*p=W^Aw$-_we65izQB zT)Ov7y+RIlPKSE7izVm4?(2+Jj#BmzUMXbzi#9YzcNOhbvs=i4wT`6GRU%%iJsIjV zet()9}@XiOw?*3t(vXU)wGc#W-6N?wDriBc&QOo); z8|?{A$1bPsY!EFA8oJ3KpHdIeKh|Sq>KO6r4f=S(_Y7#S;F%)g6uzQW&BN$KXBM_X zS6P5|n&ua_SkbTeWf)qj^;YFKTE6FE2*!1On2j^V}noaDOa{aa6{`uI$@lPb|%1mE~BX+ z&i`&8(u0T?-KwK~+Sw8n?lv8RaJQwk751P{{K+QgB@^Fi85mF6m_^S~lZbho z*r-h(+t`MYTU|y9#lP-<5&G)(iJHXkTKrKxdpNi-j`5C8pzGX0J7%Ze#zS8sd+BP& zW39RLW7_$o{pHI1bxv$A{AdillFWai``S!QPO-hgzn1Jj7KI-{z!})17$5Tn!`2W5 zoAAo&;L{bXkpP7SWFV8!zPzO-V^5v_>JNoBpjbPw=mI{eQ+vAgJeJml6BcaI&850K za2B|x`-rtec|ZKO0yBr$fnZo~R-hZPmaGVjM>gGW9uE&1K|EvcU`g$Jok{Mg+~*FS z`Il*8`*P~95A{E14Z0H=tjg;Q?H*y0R&{)dt2_aN{)aPTo!3}&D5 zdmyp$Fx^JF2kU5ma|`t>;U?%AM9W3A^FAL0OfYj&Jj@S z5FWRcw)ca8=V-4oxUBUDWe%(Gx;%7yi}Al<{Mv`o^_e}mjqZ=&WxDfA|8Gble%}D|$40mxd?k7KlVv ze|+FvCw(g5Lo+oxtD@Ut;*jSk9+*#yLMGu?IITqxW7?Cc70fM8sq+Rh{Tl&JS z(@pFJND+reO~WS#F|M>W6WzxniB8w(?7Hp=sbKVZm71Cj3Z-?;?FGP#PV)xgTN(5L zpMoDcudmy|V&Ey0658(^k51MS|JTuqd{?(J==`Sg_=(Wh8OhG@-w7Uddiy8Fwn0c2 zO*^{XU>(}g+Ho~|4qD1p%dlT0_@mkA2rNB>vF{Bcu?Dg8h4p9LSA=Hb=~v`m_g8mL zk-z=Td);uh46Ozu@d`Zpbuy<`#9jyN^9FxIh}~mEt}h(w=F3&+FBUC5#y+M97;Neq0D(5?-aX-h<^`|uMeZ>4q$92<}xGD=0!YS z_t%AC3GE>~YTmZGw@~?v2j6QHe%jS~Emn=Y+FrbdGl$;`6xVq04q5eiw4mF>mFbk? z0rDE<3;nQ5DUo`B?D;V0(Hp&cg23IO&=*b~v>Wkvo%zqh2g31?V z;jQav_Y(F||NQ_S)sUxwpuJ8M1)&uogKV%Cbo|y1W#;pBBD4uD|3wR0&DC8s%5h7f zaQ~j47%1xe zXM;pKLpXyBLGvOl@mcmvIf>i@am&%&bcsA&2X);;wFT+luv)*)0`nr#pK@5O=4dz4 zyWn4Sy9FB0+s@{g6No0FkuH?dTEAFH2DTObZ>GHNmQwV2VA<7V^^aKX>H3{W(hU+H=y{#LNPJtkf)vdk>ph_^~*J$3|gRh4;@zagjr^aM&pWw%z+h4HP z9;DGMNd}Ux!OJe1SBS_BSbc$uDf4-vHMR3*q8qba@c))%51;Uph`;Fn{E@y&sIUE- z+5xwP&w)tp2XbZ8D_x*h*@I@gQTI2sOZ*Q81uRIb|7}I5HFGJe9_SbpH5a3tT=zC+ zLQgjg>_gVEfyU$O&8ey4M1 z`oBeVzhDg5X&BjD!QxR+)UI-kz2u4ESot0D_Mv#~e~`T;>pZ7GC#_%V?jD_@n_-L)69Ls4RK~<}42zrF4@ z(cH%$w9W}f_Mn_$f6B8w)A&Dwm(Knipu`0v(2BnP*Q3SE-g^<5y5(;xS^orV_5*&V z-7E)L-5m$rB4Sd41V7e&x?xcM10J@*X8{qA#_8oYME~cM(H!Gj^kZ6q z)BmNl0{!T;{!Vmw3(j?a*jj!xH*v#Mu>)C&eGA`fP6pH;`{@?B5aywd(1WJa!XkK$ z2S4;b+?}DG*2d<;Sq#y=-!!s66Uo1TJ_Cu}&S-Eb z#h>1!W_vt%F!+0eS?q5?P~Fvk3chrcu4a&QOUF{`PQhDrqnOTZ?7^CQK#>2!=SF~; zL#e;p{K4#5ORJOhH^8SOM2co8beE7n{j2`(Mco&!9{3d4d4=(uPJNC*bHm6XPnt2% zYfm1b9{CWmX{AH?`f7Ndisb`oUu%m2WH%S^ip%C#`x)5P2P!`z^=P<%8*RR97gPTz zt!pQ_*Y&^}nFL z`mD~>dj=1lPha3k+aBoSL2{x)l-vdiKMHSksQa*8MazEpg7!@`#b>(Xc{)2k4)o~G zIASO<+|w>Wm#fXIR(IvuJ3?>SMXTvE*S@U=q%|ua{7;`KN@{`!AoDzdkpwH1-c(F3si*X zX@Agaa*r%}(@cD>kjR^cRkgz=0l69>yXH=YW4Dg@|6n_fIS4XH$CnKB2+^C44)y=| zy;J@xBnD<8yY~H^#|J-$?{0AZJ1^bd zGXfjbfYT~ie=@CWEk(V6;!U&f%i(+;zn6h0x>e^{&V1|tpXiDnn$QQ)b5Q8ecM88%@#LmL@1@Nl9 z_><6^Zr#I}sSd@X@CHItybpTfW&Z_q$z-xhH)ZWZ3U9O(zsh1{llD3hfiK&$rafE?!Hatk!7o~!Zqn&n z-Q%SHQF1C4(1|VGp!W+p@Tbk;Nd6)HjbnAvN`35y`14>g%C0sZ4@v_+jw63A8vp+Q LOquGGV0r)mXjo1C literal 0 HcmV?d00001 diff --git a/testdata/datasource/nifti/standard.nii b/testdata/datasource/nifti/standard.nii new file mode 100644 index 0000000000000000000000000000000000000000..d685a2513518d3ece2ff5ac9fa5683d3ac4ed2d3 GIT binary patch literal 492 zcma!HWFQJKGq5nQGO#l+LLsUqCI$|$K!ZI40|+}f0J%U6L literal 0 HcmV?d00001 diff --git a/testdata/datasource/nifti/standard.nii.gz b/testdata/datasource/nifti/standard.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..98bb31a77860a668b865d16f4605b8612eba512c GIT binary patch literal 143 zcmV;A0C4{wiwFoOlv-8-|8sOiG6h1(Rh<7CylVFxsjK+nXT`oqv1q~|35CZX%Y{=T|&MqUvEY8fPAQYwf z4Zc}ESSD5e3|~wtKKUzr^2sWnEzjwhp6ThGU7)NAm|{{xnA6kU=klHJoE~P+cOB>h zx^CVcy86phZRFcS0CYb}GVZ#=UwL(Bqc@Xb-1l8;vEiE@o5+v^W%U&^dcemUrt4XC z2Sv;n9%EVY63SN^wr_c5Zi~6aP@D-@p_OR;HEoon!9Mg`a50CAE!ldsdNky(uaY** zTjgc5dAQ+NJ`FqELA8C;Wsx4V#HQ3XSg+;AYt1YF$Bh*=7E~ozh5Otyee!qgGg7Zf zxmE5j3De2PM$TH{wGvgwcIovldyWH`rb$5mP7_a6H(l#L(6G3d!hlc1HRn-qf z^mD{eOqAk;sZz)ySCS#g0MR>IkVvHaf@I7m`)pxcOJ$8=BVAn_*s;FqhE0<AoP@wqjdIS2jP^v}-2Q9*7Sru!UU< zY<|3jvkH4Mv@Nt9eXyZbaFoDLRG*qDn4Oj6=G3ayiD|*n(K?bN0&buukq?Y&a4BGF zWU>(o6)PiU*KG^SgIOtIDdSWqa5P94wrn{Sd}5YkTaGLPSc5&k)Nm?TqJ1u2sB+sg zgV?jCRV3FN(Yhk}QknpgbaCmHfIx`X$OA2=ly`6XX$<# zZ^2lF+}2-f+jU7w<0qRw0&k#HO1szc5b88+TbxqUC_=M@4-Wh}&;daA;n)&!c2?|3 zoMtw3D4{?-mJ|!w!op@YJm)ZZ%t1-;TJmtQA>Whd33@N=?u#i~$-bP0ZF#&=(C2S1 zWYwb?lP5FQ)OHuivao}et(q_{n>-YcXiojT=j3-i=uEnw)ty?- z89AdH$4h`s}e>K4>EJTVuJA>6&cI@GW6&be$tS0`r zYZMSpbVsm~P8G1~gf2J;kKmt<`rr^8f#=~E!t7Oe4Tc~GZ^GN~E=1Eh2MV^dv*pu{JfGk9$p9r=4}DOQG`9!8KJ6)-&xC!il*fRm7c0buYV zyaa>rGQ#&21n_Bua27#4j4(DJk0~$$qc8^J@H(7!I4nXLQ=_A^udDUn zX3+uSx^s*Ei)z0>qD^jj#@9Yt>p`LoY}18uyN9 zYlr~q^IKc+kDRX*DSftH3gX@G9}Rbx9M;l@I`hSA^dHmK*r5gA$oUG(=@#f*67N2J kJltI-KuZhsw29aF>4dgMXhHWudZ!ovZFT~D-%n5f0yqp}M*si- literal 0 HcmV?d00001 diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs new file mode 100644 index 0000000000..8881cf31db --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs @@ -0,0 +1,80 @@ +{ + "multiscales": [ + { + "axes": [ + { + "name": "y", + "type": "space", + "unit": "nanometer" + }, + { + "name": "x", + "type": "space", + "unit": "nanometer" + } + ], + "datasets": [ + { + "path": "scale0/image", + "coordinateTransformations": [ + { + "scale": [ + 4, + 30 + ], + "type": "scale" + }, + { + "translation": [ + 0.0, + 0.0 + ], + "type": "translation" + } + ] + }, + { + "path": "scale1/image", + "coordinateTransformations": [ + { + "scale": [ + 8, + 60 + ], + "type": "scale" + }, + { + "translation": [ + 2, + 15 + ], + "type": "translation" + } + ] + }, + { + "path": "scale2/image", + "coordinateTransformations": [ + { + "scale": [ + 16, + 120 + ], + "type": "scale" + }, + { + "translation": [ + 6, + 45 + ], + "type": "translation" + } + ] + } + ], + "name": "image", + "version": "0.4", + "@type": "ngff:Image" + } + ] +} \ No newline at end of file diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup new file mode 100644 index 0000000000..cab13da6ee --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup @@ -0,0 +1,3 @@ +{ + "zarr_format": 2 +} \ No newline at end of file diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata new file mode 100644 index 0000000000..18b2fe0a54 --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata @@ -0,0 +1,202 @@ +{ + "metadata": { + ".zgroup": { + "zarr_format": 2 + }, + ".zattrs": { + "multiscales": [ + { + "axes": [ + { + "name": "y", + "type": "space", + "unit": "nanometer" + }, + { + "name": "x", + "type": "space", + "unit": "nanometer" + } + ], + "datasets": [ + { + "path": "scale0/image", + "coordinateTransformations": [ + { + "scale": [ + 4, + 30 + ], + "type": "scale" + }, + { + "translation": [ + 0.0, + 0.0 + ], + "type": "translation" + } + ] + }, + { + "path": "scale1/image", + "coordinateTransformations": [ + { + "scale": [ + 8, + 60 + ], + "type": "scale" + }, + { + "translation": [ + 2, + 15 + ], + "type": "translation" + } + ] + }, + { + "path": "scale2/image", + "coordinateTransformations": [ + { + "scale": [ + 16, + 120 + ], + "type": "scale" + }, + { + "translation": [ + 6, + 45 + ], + "type": "translation" + } + ] + } + ], + "name": "image", + "version": "0.4", + "@type": "ngff:Image" + } + ] + }, + "scale2/.zattrs": { + "_ARRAY_DIMENSIONS": [ + "y", + "x" + ] + }, + "scale2/.zgroup": { + "zarr_format": 2, + "consolidated_metadata": { + "metadata": {}, + "must_understand": false, + "kind": "inline" + } + }, + "scale2/image/.zattrs": {}, + "scale2/image/.zarray": { + "shape": [ + 2, + 2 + ], + "chunks": [ + 2, + 2 + ], + "fill_value": null, + "order": "C", + "filters": null, + "dimension_separator": "/", + "compressor": { + "id": "blosc", + "cname": "lz4", + "clevel": 5, + "shuffle": -1, + "blocksize": 0 + }, + "zarr_format": 2, + "dtype": "^pGi$g!dmr%KM8 oyHHkf=}OhL8#TA?+xj@iJ)WtUDR3I~BX`q{JeGZc{9FCxUf{V%Lpgw+dRYfjpj?TToI7 zHo*kD2?5@WOmfV)qD%rF4NDq9Okf1ELLv|&@({*gMjy-=0fx7Z)<9z*kqI;j6qzKL z#L56OiGg8BVg8rc{Vpre4%4m1W7?RbpAjB$uDKxY6wRRlB!8vj6}K=F@Z6e}A@DLWAU0V>`I H3JeASIqauv literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/README.txt b/testdata/kvstore/zip/from-yauzl/README.txt new file mode 100644 index 0000000000..9b00947bca --- /dev/null +++ b/testdata/kvstore/zip/from-yauzl/README.txt @@ -0,0 +1,25 @@ +The test data in this directory were copied from yauzl +(https://github.com/thejoshwolfe/yauzl/) and are subject to the following +license: + +The MIT License (MIT) + +Copyright (c) 2014 Josh Wolfe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip new file mode 100644 index 0000000000000000000000000000000000000000..4ec82226f4f2a5f704db2a0c1bf57603a41932ee GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm~pv80_;LYAi1Ow#Duzw72+;5HwAd38ind0 aWTRYwMnRp2%P5d-3=B*_I1Na5fO!D?G&<7& literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_1.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_1.zip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip new file mode 100644 index 0000000000000000000000000000000000000000..64cca97da08d4c96c19675cedb5284a402d60867 GIT binary patch literal 309 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm~pv80_;LYAi1Ow#Duzw72+;5HwAd38ind0 cWTRYwMnRp2%P3YhkbO)*I1Na5fH({c05|tK-T(jq literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip b/testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip new file mode 100644 index 0000000000000000000000000000000000000000..c64c3fa9d43dd8ccd2477cbfdd4102c0b8e4467b GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm{DEw|NsAbh)EJ)7cv6LC5<2^)LpC)ccHl{ iz#G*lR0km&O5RVv9f{eV*y literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip b/testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip new file mode 100644 index 0000000000000000000000000000000000000000..3109f86a676bae74c0064e3f75900a67452da342 GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm~pv80_;LYAi1Ow#Duzw72+;5HwAd38ind0 gWTRYwMnRniH;M<@dja08Y#{rXfN&a+?f`KZ0R1gG-v9sr literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip b/testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip new file mode 100644 index 0000000000000000000000000000000000000000..5f63af9264548d6a9ad5046513b20c1cb0fb636d GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm{DEw|NsAb5N2hN0K1S8NG@pvF`@2ag}4jN jO#$AhMxilVm~pv80_;LYAi1Ow#Duzw72+;5HwAbzG9nv= d>L6sJT!2PForlXPRyL4*Oh7mdNOyoZ3;_JBI^6&O literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip b/testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip new file mode 100644 index 0000000000000000000000000000000000000000..8393a9dd3b63d42210712f7a985e1c86a2e5be24 GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-CFyIn~_Awj3kH|j7)M!rl7h+0_;LYAi1Ow#Duzw72+;5HwAd3 f8ind0WTRYwMnRp2%P3YhkbO)*I1Na5fH({Q{2e;o literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip b/testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip new file mode 100644 index 0000000000000000000000000000000000000000..263895aa05f7c268c3885439d9a558aa8a3eb9f8 GIT binary patch literal 98 ocmWIWW?;}^fB<`DT_}q%72wUrj;x9i$O-UfWdn)*M*<8C0RJ}*dH?_b literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip b/testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip new file mode 100644 index 0000000000000000000000000000000000000000..098d4e56c105aa3509f14b75daec3a06ef973ab5 GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm~pv80_;LYAi1Ow#Duzw72+;5HwAd38ind0 cWTRYwMnRp2%P3YhkgZHWI1Na505Jmt0R0>~-v9sr literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip b/testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip new file mode 100644 index 0000000000000000000000000000000000000000..08eb6cece8409cae9e6a7e076f508a290d7863d8 GIT binary patch literal 194 zcmWIWW@h1H;ACK6_}w|lOToa(ObEzk17cPN8HPl?l8Tbh5KabWt2N&uT!FZ>f}4Sn zlVm~pv80_;LYAi1Ow#Duzw72+;5HwAdZjA8_P e3e`c#M!5iuf;tbEQLJnr`H@r3*+5*FlRz{B F0|1PL6sJT!2PForlXPRyL4*Oh7mdNOyoZ3;>7GItTy& literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/deflate.zip b/testdata/kvstore/zip/from-yauzl/success/deflate.zip new file mode 100644 index 0000000000000000000000000000000000000000..26c50149a7cbd81d6b38700a1a57bb7f1cdbc9ee GIT binary patch literal 2993 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 literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/directories.zip b/testdata/kvstore/zip/from-yauzl/success/directories.zip new file mode 100644 index 0000000000000000000000000000000000000000..31803cb700430dade195d34b9f26682810679e07 GIT binary patch literal 428 zcmWIWW@h1H0D&iK#azJ*D8a-a!;q*S8p6rId`9L+u$b(R;L-|i21b?_%nS@*A^@je zcCg+=y^@L&;tY`3jcIuj#PapVKZ3UaF^1)gOmfV)oGtlVm~pv80_;LYAi1Ow#Duzw72+;5HwAd38ind0 bWTRYwMnRp2%P3YhkbO)*I1Na5fH({Q{R%qX literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip b/testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip new file mode 100644 index 0000000000000000000000000000000000000000..a90d7505988d757ef530b9f7fd8dd33cc806074c GIT binary patch literal 308 zcmWIWW@h1H0D;@yLau=i!rEDZYzUTNNYpE-ClVm~pv80_;LYAi1Ow#7v9L6sJT!2PForlXPRyL4*Oh7mdNOyoZ3;+|4I}88- literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip b/testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip new file mode 100644 index 0000000000000000000000000000000000000000..58c17d9e31730e274a968187713c40aa3b26feb5 GIT binary patch literal 225 zcmWIWW@gc4VBlb2P@Qnjg8>N$Fi0~nFfuW-u(GjpaB^|;@bdAO7Kk!1c04+F?#Yhk zCp%U>>)8Kt`WC&Cijn|tcAyam5a7+oWY3JtU^BSFEsbC%hBd4ZYf1~)7?{BJfmndGkg-9D zr6q~ksU=yZdbtJ0V7ChZEwFIIG*2O~vM4({6XJRUpuvXtTt5}f zU^Bu7`(_rG9A2VOmRgjlPyqBuUTP}bBa%S7tgv~6kx7mjSCmRXBUpgpuOoq0@K}PG1Ynkce3eMp5}XMFXg4T9VA##d28w1@Amn9YV7Lghfq?-4 DCVuy% literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip b/testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip new file mode 100644 index 0000000000000000000000000000000000000000..13c55ff5624e2fc2bb77fe9569c97713358543c2 GIT binary patch literal 178 zcmWIWW@h1HfB;1(4WalLWEe{GGAndb3-XgQ^hzp9LPIzim_d>=C#t2FR&X;gvb+HD uSyF&P0p5&Ea?H3)l7JWqB$qUTnCRxRLd?Z5la&pmnh^*?fV2mQ!vFwN9v4ag literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip b/testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip new file mode 100755 index 0000000000000000000000000000000000000000..f2e52985bf78c8ab7f48c9053e713a576e98942d GIT binary patch literal 276 zcmWIWW@h1H0D;@yLau=i!rEDZY#2_|E2$_+EKW(|3P4fUIP2R1m>LkB1X7m-QOC$+ z&w$HB6_7N(AgPntH?7G{z aU}NWPL8Sw{S=m5NVFJQ+Kso@#VE_Pm8aTuN literal 0 HcmV?d00001 diff --git a/testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip b/testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip new file mode 100755 index 0000000000000000000000000000000000000000..c67d3a83387b543f51d39931c69b5139b07797f2 GIT binary patch literal 204 zcmWIWW@Zs#0D;@yLau=i!rEDZY#2_|E2$_+EKW(|3P4fUIP2R1m>LkB1X7m-QOC$6 x!hqXEkWGvX3Lpvyz~%>dqiR7n9HbDUMFYqJTNU8V$_5f<0>U&P9RT7m004CIAHV { + const serverFixture = httpServerFixture(constantFixture(TEST_FILES_DIR)); + const kvStoreContextFixture = sharedKvStoreContextFixture(); + test("get completions", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "#|", + }, + { + "value": "a|", + }, + { + "value": "b|", + }, + { + "value": "c|", + }, + { + "value": "empty|", + }, + ], + "defaultCompletion": undefined, + "offset": 23, + } + `); + }); + + test("get completions with partial name", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl + "b", + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "b|", + }, + ], + "defaultCompletion": undefined, + "offset": 23, + } + `); + }); + + test("get completions with subdirectory", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl + "baz/", + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "x|", + }, + ], + "defaultCompletion": undefined, + "offset": 27, + } + `); + }); +}); + +describe("datasource completion", () => { + const datasourceProviderFixture = dataSourceProviderFixture(); + + test("get empty completions", async () => { + expect(await (await datasourceProviderFixture()).completeUrl({ url: "" })) + .toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "http (unauthenticated)", + "value": "http://", + }, + { + "description": "https (unauthenticated)", + "value": "https://", + }, + { + "description": "Local in-memory", + "value": "local://", + }, + ], + "offset": 0, + } + `); + }); +}); diff --git a/tests/datasource/deepzoom.browser_test.ts b/tests/datasource/deepzoom.browser_test.ts new file mode 100644 index 0000000000..924ccf3547 --- /dev/null +++ b/tests/datasource/deepzoom.browser_test.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/deepzoom/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("deepzoom", ["14122_mPPC_BDA_s186.dzi"]); diff --git a/tests/datasource/metadata_snapshot_test_util.ts b/tests/datasource/metadata_snapshot_test_util.ts new file mode 100644 index 0000000000..e03580b874 --- /dev/null +++ b/tests/datasource/metadata_snapshot_test_util.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register.js"; +import { describe, test } from "vitest"; +import { getDatasourceMetadata } from "#tests/datasource/test_util.js"; +import { dataSourceProviderFixture } from "#tests/fixtures/datasource_provider.js"; + +declare const TEST_DATA_SERVER: string; + +export const dataSourceProvider = dataSourceProviderFixture(); + +export function datasourceMetadataSnapshotTests( + datasourceName: string, + names: string[], +) { + describe("metadata tests", () => { + test.for(names)("metadata %s", async (name, { expect }) => { + await expect( + await getDatasourceMetadata( + dataSourceProvider, + `${TEST_DATA_SERVER}datasource/${datasourceName}/${name}`, + ), + ).toMatchFileSnapshot( + `./metadata_snapshots/${datasourceName}/${name.replaceAll("/", "_")}.snapshot`, + ); + }); + }); +} diff --git a/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot b/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot new file mode 100644 index 0000000000..9556efadaf --- /dev/null +++ b/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot @@ -0,0 +1,1181 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186.dzi|deepzoom:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 48023, + 34907, + 3, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "c^", + ], + "scales": Float64Array [ + 1e-9, + 1e-9, + 1, + ], + "units": [ + "m", + "m", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/16/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 48023, + 34907, + 3, + ], + }, + }, + "upperClipBound": Float32Array [ + 48023, + 34907, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/15/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 24012, + 17454, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 24011.5, + 17453.5, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/14/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 12006, + 8727, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 12005.75, + 8726.75, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/13/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 6003, + 4364, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 8, + 0, + 0, + 0, + ], + [ + 0, + 8, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 6002.875, + 4363.375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/12/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3002, + 2182, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 16, + 0, + 0, + 0, + ], + [ + 0, + 16, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 3001.4375, + 2181.6875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/11/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 1501, + 1091, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 32, + 0, + 0, + 0, + ], + [ + 0, + 32, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 1500.71875, + 1090.84375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 751, + 546, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 64, + 0, + 0, + 0, + ], + [ + 0, + 64, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 750.359375, + 545.421875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/9/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 376, + 273, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 128, + 0, + 0, + 0, + ], + [ + 0, + 128, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 375.1796875, + 272.7109375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/8/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 188, + 137, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 256, + 0, + 0, + 0, + ], + [ + 0, + 256, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 187.58984375, + 136.35546875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/7/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 94, + 69, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 512, + 0, + 0, + 0, + ], + [ + 0, + 512, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 93.794921875, + 68.177734375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/6/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 47, + 35, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 1024, + 0, + 0, + 0, + ], + [ + 0, + 1024, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 46.8974609375, + 34.0888671875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 24, + 18, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2048, + 0, + 0, + 0, + ], + [ + 0, + 2048, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 23.44873046875, + 17.04443359375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/4/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 12, + 9, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4096, + 0, + 0, + 0, + ], + [ + 0, + 4096, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 11.724365234375, + 8.522216796875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/3/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 6, + 5, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 8192, + 0, + 0, + 0, + ], + [ + 0, + 8192, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 5.8621826171875, + 4.2611083984375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 3, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 16384, + 0, + 0, + 0, + ], + [ + 0, + 16384, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 2.93109130859375, + 2.13055419921875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 32768, + 0, + 0, + 0, + ], + [ + 0, + 32768, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 1.465545654296875, + 1.065277099609375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 1, + 1, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 65536, + 0, + 0, + 0, + ], + [ + 0, + 65536, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 0.7327728271484375, + 0.5326385498046875, + 3, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 48023, + 34907, + 3, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot new file mode 100644 index 0000000000..f391dcfe50 --- /dev/null +++ b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot @@ -0,0 +1,194 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/|n5:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "x", + "y", + ], + "scales": Float64Array [ + 1e-8, + 20, + ], + "units": [ + "m", + "s", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + ], + }, + }, + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + ], + [ + 0, + 2, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + ], + [ + 0, + 4, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 10, + 20, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot new file mode 100644 index 0000000000..aca3867952 --- /dev/null +++ b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot @@ -0,0 +1,194 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/|n5:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "x", + "y", + ], + "scales": Float64Array [ + 1e-8, + 20, + ], + "units": [ + "m", + "s", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + ], + }, + }, + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + ], + [ + 0, + 2, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + ], + [ + 0, + 4, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 10, + 20, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot b/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot new file mode 100644 index 0000000000..165e4f1203 --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot @@ -0,0 +1,213 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/example_nifti2.nii.gz|gzip:|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 32, + 20, + 12, + 2, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "i", + "j", + "k", + "m", + ], + "scales": Float64Array [ + 0.002, + 0.002, + 0.0021999990940093994, + 2000, + ], + "units": [ + "m", + "m", + "m", + "s", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "x", + "y", + "z", + "t", + ], + "scales": Float64Array [ + 0.001, + 0.001, + 0.001, + 1, + ], + "units": [ + "m", + "m", + "m", + "s", + ], + "valid": true, + }, + "transform": [ + [ + -1, + 0.000005141198016644921, + 0.00006320902321022004, + 0, + 117.8551025390625, + ], + [ + -0.000005141198016644921, + 0.9868557453155518, + -0.16160380840301514, + 0, + -35.72294235229492, + ], + [ + 0.00006320902321022004, + 0.16160380840301514, + 0.9868557453155518, + 0, + -7.248798370361328, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "INT16", + "rank": 4, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/example_nifti2.nii.gz|gzip:", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 32, + 20, + 12, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "INT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 32, + 20, + 12, + 2, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + 0, + ], + "pointB": [ + 32, + 20, + 12, + 2, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot b/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot new file mode 100644 index 0000000000..ae3792a1a4 --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot @@ -0,0 +1,156 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/standard.nii.gz|gzip:|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 4, + 5, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "i", + "j", + "k", + ], + "scales": Float64Array [ + 1, + 3, + 2, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 1, + 1, + 1, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/standard.nii.gz|gzip:", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 4, + 5, + 7, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 4, + 5, + 7, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 4, + 5, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot b/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot new file mode 100644 index 0000000000..3c57057f7b --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot @@ -0,0 +1,156 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/standard.nii|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 4, + 5, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "i", + "j", + "k", + ], + "scales": Float64Array [ + 1, + 3, + 2, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 1, + 1, + 1, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/standard.nii", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 4, + 5, + 7, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 4, + 5, + 7, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 4, + 5, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot b/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot new file mode 100644 index 0000000000..df3b27612c --- /dev/null +++ b/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot @@ -0,0 +1,266 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/precomputed/one_channel/|neuroglancer-precomputed:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + 30, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 3e-9, + 4e-9, + 5e-9, + ], + "units": [ + "m", + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/3_4_5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + 30, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + 30, + ], + }, + }, + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 10, + 20, + 30, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/6_8_10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + 15, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + 15, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 2, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 5, + 10, + 15, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/12_16_20/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + 8, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + 8, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 4, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 2.5, + 5, + 7.5, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 10, + 20, + 30, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot b/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot new file mode 100644 index 0000000000..1b252e1674 --- /dev/null +++ b/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot @@ -0,0 +1,315 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/precomputed/two_channels/|neuroglancer-precomputed:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + 30, + 2, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "x", + "y", + "z", + "c^", + ], + "scales": Float64Array [ + 3e-9, + 4e-9, + 5e-9, + 1, + ], + "units": [ + "m", + "m", + "m", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 4, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/3_4_5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + 30, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + 30, + 2, + ], + }, + }, + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 10, + 20, + 30, + 2, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/6_8_10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + 15, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + 15, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + 0, + ], + [ + 0, + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 5, + 10, + 15, + 2, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/12_16_20/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + 8, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + 8, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + 0, + ], + [ + 0, + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 2.5, + 5, + 7.5, + 2, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + 0, + ], + "pointB": [ + 10, + 20, + 30, + 2, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot new file mode 100644 index 0000000000..2a04b75837 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/|zarr2:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.zip.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.zip.snapshot new file mode 100644 index 0000000000..2f91f77c3c --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.zip.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4.zip|zip:|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4.zip|zip:scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4.zip|zip:scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4.zip|zip:scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot new file mode 100644 index 0000000000..fe94094414 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot b/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot new file mode 100644 index 0000000000..61d179dcc5 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot @@ -0,0 +1,120 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/zarr_v3/examples/single_res/|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 6, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "dim_0", + "dim_1", + ], + "scales": Float64Array [ + 1, + 1, + ], + "units": [ + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/zarr_v3/examples/single_res/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 4, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 7, + 6, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + 0, + ], + [ + 1, + 0, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 6, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/n5.browser_test.ts b/tests/datasource/n5.browser_test.ts new file mode 100644 index 0000000000..1de2f252a4 --- /dev/null +++ b/tests/datasource/n5.browser_test.ts @@ -0,0 +1,24 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/n5/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("n5", [ + "n5_viewer_multiscale_deprecated", + "n5_viewer_multiscale_modern", +]); diff --git a/tests/datasource/nifti.browser_test.ts b/tests/datasource/nifti.browser_test.ts new file mode 100644 index 0000000000..430f745b46 --- /dev/null +++ b/tests/datasource/nifti.browser_test.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/nifti/register_default.js"; +import "#src/kvstore/gzip/register.js"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("nifti", [ + "standard.nii", + "standard.nii.gz", + "example_nifti2.nii.gz", +]); diff --git a/tests/datasource/precomputed.browser_test.ts b/tests/datasource/precomputed.browser_test.ts new file mode 100644 index 0000000000..735bbe16da --- /dev/null +++ b/tests/datasource/precomputed.browser_test.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/precomputed/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("precomputed", ["one_channel", "two_channels"]); diff --git a/tests/datasource/suggest_name.spec.ts b/tests/datasource/suggest_name.spec.ts new file mode 100644 index 0000000000..a9128e05f4 --- /dev/null +++ b/tests/datasource/suggest_name.spec.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect, test } from "vitest"; +import { dataSourceProviderFixture } from "#tests/fixtures/datasource_provider.js"; + +const datasourceProviderFixture = dataSourceProviderFixture(); + +test.for([ + ["http://localhost/path/to/array/|zarr3:", "array"], + ["http://localhost/path/to/array/", "array"], + ["http://localhost/path/to/array", "array"], + ["http://localhost/path/to/group/|zarr3:path/to/array/", "array"], + ["brainmaps://foo:bar:baz", "baz"], +])("%s -> %s", async ([url, expectedName]) => { + const registry = await datasourceProviderFixture(); + expect(registry.suggestLayerName(url)).toEqual(expectedName); +}); diff --git a/tests/datasource/test_util.ts b/tests/datasource/test_util.ts new file mode 100644 index 0000000000..66b804ada5 --- /dev/null +++ b/tests/datasource/test_util.ts @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + CoordinateSpace, + CoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import { coordinateSpacesEqual } from "#src/coordinate_transform.js"; +import type { + DataSource, + DataSourceRegistry, + DataSubsource, + DataSubsourceEntry, +} from "#src/datasource/index.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import { VolumeType } from "#src/sliceview/volume/base.js"; +import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { DataType } from "#src/util/data_type.js"; +import * as matrix from "#src/util/matrix.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; + +export function getDatasourceSnapshot(datasource: DataSource) { + return { + subsources: Array.from(datasource.subsources, getSubsourceEntrySnapshot), + modelTransform: getCoordinateSpaceTransformSnapshot( + datasource.modelTransform, + ), + canonicalUrl: redactUrl(datasource.canonicalUrl), + ...getKeys(datasource, ["canChangeModelSpaceRank"]), + }; +} + +function getKeys(x: T, keys: Array) { + return Object.fromEntries( + keys + .map((key) => [key, x[key]]) + .filter(([_key, value]) => value !== undefined), + ); +} + +function getCoordinateSpaceSnapshot(x: CoordinateSpace) { + return getKeys(x, [ + "valid", + "names", + "units", + "scales", + "bounds", + "coordinateArrays", + ]); +} + +function getCoordinateSpaceTransformSnapshot(x: CoordinateSpaceTransform) { + const { rank } = x; + const result: any = {}; + result.inputSpace = getCoordinateSpaceSnapshot(x.inputSpace); + if (!coordinateSpacesEqual(x.inputSpace, x.outputSpace)) { + result.outputSpace = getCoordinateSpaceSnapshot(x.outputSpace); + } + if (!matrix.isIdentity(x.transform, rank + 1, rank + 1)) { + result.transform = getMatrixSnapshot(x.transform, rank + 1); + } + return result; +} + +function getMatrixSnapshot(matrix: ArrayLike, rows: number) { + const result: number[][] = []; + const cols = matrix.length / rows; + for (let row = 0; row < rows; ++row) { + const rowElements: number[] = []; + for (let col = 0; col < cols; ++col) { + rowElements[col] = matrix[col * rows + row]; + } + result[row] = rowElements; + } + return result; +} + +function getSubsourceEntrySnapshot(subsource: DataSubsourceEntry) { + return { + subsource: getSubsourceSnapshot(subsource.subsource), + ...getKeys(subsource, [ + "default", + "id", + "modelSubspaceDimensionIndices", + "subsourceToModelSubspaceTransform", + ]), + }; +} + +function getSubsourceSnapshot(subsource: DataSubsource) { + if (subsource.volume) { + return { volume: getVolumeSnapshot(subsource.volume) }; + } + if (subsource.staticAnnotations) { + return { staticAnnotations: subsource.staticAnnotations.toJSON() }; + } + return {}; +} + +function getVolumeSnapshot(volume: MultiscaleVolumeChunkSource) { + const sources = volume.getSources({ + multiscaleToViewTransform: matrix.createIdentity(Float32Array, volume.rank), + displayRank: volume.rank, + modelChannelDimensionIndices: [], + }); + return { + dataType: DataType[volume.dataType], + volumeType: VolumeType[volume.volumeType], + rank: volume.rank, + sources: sources.map((sourceList) => sourceList.map(getSourceSnapshot)), + }; +} + +function getSourceSnapshot( + source: SliceViewSingleResolutionSource, +) { + const rank = source.chunkSource.spec.rank; + let spec: any = VolumeChunkSource.encodeSpec(source.chunkSource.spec); + spec = { ...spec, dataType: DataType[spec.dataType] }; + const parameters = (source.chunkSource as any).parameters; + delete parameters.metadata; + if (parameters.url) { + parameters.url = redactUrl(parameters.url as string); + } + const result: any = { + ...getKeys(source, ["lowerClipBound", "upperClipBound"]), + chunkSource: { + parameters: (source.chunkSource as any).parameters, + spec, + }, + }; + if ( + !matrix.isIdentity(source.chunkToMultiscaleTransform, rank + 1, rank + 1) + ) { + result.chunkToMultiscaleTransform = getMatrixSnapshot( + source.chunkToMultiscaleTransform, + rank + 1, + ); + } + return result; +} + +function redactUrl(x: string | undefined): string | undefined { + if (x === undefined) return undefined; + return x.replaceAll(/(?<=http:\/\/localhost:)[0-9]+/g, "*"); +} + +export function loggingProgressListener(): ProgressListener { + return { + addSpan(span) { + console.log(`[progress] ${span.message}`); + }, + removeSpan(_span) {}, + }; +} + +export async function getDatasourceMetadata( + dataSourceProvider: Fixture, + url: string, +) { + const provider = await dataSourceProvider(); + const dataSource = await provider.get({ + url, + globalCoordinateSpace: undefined as any, + transform: undefined, + progressListener: loggingProgressListener(), + }); + return getDatasourceSnapshot(dataSource); +} diff --git a/tests/datasource/zarr.browser_test.ts b/tests/datasource/zarr.browser_test.ts new file mode 100644 index 0000000000..dbf8b6b8fb --- /dev/null +++ b/tests/datasource/zarr.browser_test.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/zarr/register_default.js"; +import "#src/kvstore/zip/register_frontend.js"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("zarr", [ + "zarr_v3/examples/single_res", + "ome_zarr/simple_0.4", + "ome_zarr/simple_0.4.zip", + "ome_zarr/simple_0.5", +]); diff --git a/tests/fixtures/clear_cookies.ts b/tests/fixtures/clear_cookies.ts new file mode 100644 index 0000000000..f8c05947eb --- /dev/null +++ b/tests/fixtures/clear_cookies.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; + +export function clearCookiesFixture(): Fixture { + afterEach(() => clearCookies()); + return async () => {}; +} + +export function clearCookies(): void { + document.cookie.split(";").forEach((cookie) => { + document.cookie = cookie + .replace(/^ +/, "") + .replace(/=.*/, `=;expires=${new Date(0).toUTCString()};path=/`); + }); +} diff --git a/tests/fixtures/datasource_provider.ts b/tests/fixtures/datasource_provider.ts new file mode 100644 index 0000000000..8d39316eda --- /dev/null +++ b/tests/fixtures/datasource_provider.ts @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; +import { type DataSourceRegistry } from "#src/datasource/index.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { sharedKvStoreContextFixture } from "./shared_kvstore_context"; + +export function dataSourceProviderFixture( + sharedKvStoreContext: Fixture = sharedKvStoreContextFixture(), +): Fixture { + return fixture(async (stack) => { + const kvStoreContext = await sharedKvStoreContext(); + const provider = getDefaultDataSourceProvider({ + kvStoreContext, + credentialsManager: kvStoreContext.credentialsManager, + }); + stack.defer(() => provider.dispose()); + return provider; + }); +} diff --git a/tests/fixtures/fake_gcs_server.ts b/tests/fixtures/fake_gcs_server.ts new file mode 100644 index 0000000000..f225d6c6ae --- /dev/null +++ b/tests/fixtures/fake_gcs_server.ts @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawn } from "node:child_process"; +import readline from "node:readline"; +import { bypass, http } from "msw"; +import { beforeEach } from "vitest"; +import { fetchOk } from "#src/util/http_request.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import type { mswFixture } from "#tests/fixtures/msw"; + +function pickRandomPort() { + const minPort = 1024; + const maxPort = 65535; + return Math.round(Math.random() * (maxPort - minPort) + minPort); +} + +declare const FAKE_GCS_SERVER_BIN: string; + +export function fakeGcsServerFixture( + msw?: ReturnType, +): Fixture { + const gcsServer = fixture(async (stack) => { + const port = pickRandomPort(); + const proc = stack.use( + spawn( + FAKE_GCS_SERVER_BIN, + [ + "-backend", + "memory", + "-scheme", + "http", + "-host", + "localhost", + "-port", + `${port}`, + ], + { stdio: ["ignore", "ignore", "pipe"] }, + ), + ); + + const { resolve, reject, promise } = Promise.withResolvers(); + + (async () => { + for await (const line of readline.createInterface({ + input: proc.stderr, + })) { + console.log(`fake_gcs_server: ${line}`); + if (line.match(/server started at/)) { + resolve(); + } + } + reject(new Error("Failed to start server")); + })(); + await promise; + return `http://localhost:${port}`; + }); + if (msw !== undefined) { + beforeEach(async () => { + const serverUrl = await gcsServer(); + const PUBLIC_SERVER = "https://storage.googleapis.com"; + (await msw()).use( + http.all(`${PUBLIC_SERVER}/storage/*`, ({ request }) => { + const adjustedUrl = + serverUrl + request.url.substring(PUBLIC_SERVER.length); + return fetch(bypass(adjustedUrl, request)); + }), + ); + }); + } + return gcsServer; +} + +const DEFAULT_PROJECT = "myproject"; + +export async function createBucket( + gcs: Fixture, + bucket: string, + project: string = DEFAULT_PROJECT, +) { + await fetchOk( + bypass( + `${await gcs()}/storage/v1/b?project=${encodeURIComponent(project)}`, + { + method: "POST", + body: JSON.stringify({ name: bucket }), + }, + ), + ); +} + +export async function writeObject( + gcs: Fixture, + bucket: string, + path: string, + body: RequestInit["body"], +) { + await fetchOk( + bypass( + `${await gcs()}/upload/storage/v1/b/${encodeURIComponent(bucket)}/o?name=${encodeURIComponent(path)}&uploadType=media`, + { + method: "POST", + body: body, + }, + ), + ); +} diff --git a/tests/fixtures/fake_s3_server.ts b/tests/fixtures/fake_s3_server.ts new file mode 100644 index 0000000000..36c480718f --- /dev/null +++ b/tests/fixtures/fake_s3_server.ts @@ -0,0 +1,137 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import nodeHttp from "node:http"; +import nodeStream from "node:stream"; +import { bypass, http } from "msw"; +import S3rver from "s3rver"; +import { beforeEach } from "vitest"; +import { fetchOk } from "#src/util/http_request.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import type { mswFixture } from "#tests/fixtures/msw"; +import { tempDirectoryFixture } from "#tests/fixtures/temp_directory.js"; + +export function fakeS3ServerFixture( + options: { + directory?: Fixture; + msw?: ReturnType; + } = {}, +): Fixture { + const { directory = tempDirectoryFixture(), msw } = options; + const s3Server = fixture(async (stack) => { + const server = new S3rver({ + address: "localhost", + port: 0, + directory: await directory(), + }); + stack.defer(async () => server.close()); + const address = await server.run(); + return `http://localhost:${address.port}`; + }); + if (msw !== undefined) { + beforeEach(async () => { + const serverUrl = await s3Server(); + (await msw()).use( + http.all( + /^https:\/\/([^/]+\.)?s3\.amazonaws\.com\/.*/, + ({ request }) => { + const parsedServerUrl = new URL(serverUrl); + const requestUrl = new URL(request.url); + const requestHost = requestUrl.host; + requestUrl.protocol = parsedServerUrl.protocol; + requestUrl.host = parsedServerUrl.host; + const headers = request.headers; + headers.set("host", requestHost); + const modifiedRequest = bypass(requestUrl.toString(), request); + const { promise, resolve, reject } = + Promise.withResolvers(); + const req = nodeHttp.request(modifiedRequest.url, { + setHost: false, + signal: modifiedRequest.signal, + headers: { + ...Object.fromEntries(modifiedRequest.headers), + host: requestHost, + }, + method: modifiedRequest.method, + }); + const requestBody = modifiedRequest.body; + req.on("error", (reason) => reject(reason)); + req.on("response", (res) => { + // Convert nodeHttp.IncomingHttpHeaders to Fetch Headers object. + const headers = new Headers(); + for (let [key, value] of Object.entries(res.headers)) { + if (!Array.isArray(value)) value = [value!]; + for (const v of value) { + headers.append(key, v); + } + } + // Convert node stream.Readable to ReadableStream. + const responseBody = new ReadableStream({ + start(controller) { + res.on("data", (chunk) => { + controller.enqueue(chunk); + }); + res.on("end", () => { + controller.close(); + }); + res.on("error", (err) => { + controller.error(err); + }); + }, + }); + resolve( + new Response(responseBody, { + status: res.statusCode, + statusText: res.statusMessage, + headers, + }), + ); + }); + if (requestBody === null) { + req.end(); + } else { + nodeStream.Readable.fromWeb(requestBody as any).pipe(req); + } + return promise; + }, + ), + ); + }); + } + return s3Server; +} + +export async function createBucket(s3: Fixture, bucket: string) { + await fetchOk( + bypass(`${await s3()}/${bucket}/`, { + method: "PUT", + }), + ); +} + +export async function writeObject( + s3: Fixture, + bucket: string, + path: string, + body: RequestInit["body"], +) { + await fetchOk( + bypass(`${await s3()}/${bucket}/${encodeURIComponent(path)}`, { + method: "PUT", + body: body, + }), + ); +} diff --git a/tests/fixtures/fixture.ts b/tests/fixtures/fixture.ts new file mode 100644 index 0000000000..2471c8e91f --- /dev/null +++ b/tests/fixtures/fixture.ts @@ -0,0 +1,54 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "core-js/proposals/explicit-resource-management.js"; +import { beforeAll, afterAll } from "vitest"; + +export interface Fixture { + (): Promise; +} + +export function fixture( + setup: (disposableStack: AsyncDisposableStack) => Promise, +): Fixture { + let setupPromise: Promise | undefined; + const stack = new AsyncDisposableStack(); + + afterAll(async () => { + setupPromise = undefined; + await stack[Symbol.asyncDispose](); + }); + + const asyncGetter = () => { + if (setupPromise === undefined) { + setupPromise = (async () => { + return setup(stack); + })(); + } + return setupPromise; + }; + + beforeAll(async () => { + await asyncGetter(); + }); + + return asyncGetter; +} + +export function constantFixture(value: T): Fixture { + const promise = Promise.resolve(value); + return () => promise; +} diff --git a/tests/fixtures/gl_browser.ts b/tests/fixtures/gl_browser.ts new file mode 100644 index 0000000000..d7f208c42a --- /dev/null +++ b/tests/fixtures/gl_browser.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { GL } from "#src/webgl/context.js"; +import { initializeWebGL } from "#src/webgl/context.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function glFixture(): Fixture { + return fixture(async () => { + return initializeWebGL(document.createElement("canvas")); + }); +} diff --git a/tests/fixtures/gl_node.ts b/tests/fixtures/gl_node.ts new file mode 100644 index 0000000000..6da2ff7275 --- /dev/null +++ b/tests/fixtures/gl_node.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { RefCounted } from "#src/util/disposable.js"; +import { Memoize } from "#src/util/memoize.js"; +import type { GL } from "#src/webgl/context.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function glFixture(): Fixture { + return fixture(async () => { + return { memoize: new Memoize() } as any; + }); +} diff --git a/tests/fixtures/http_server.ts b/tests/fixtures/http_server.ts new file mode 100644 index 0000000000..800c546838 --- /dev/null +++ b/tests/fixtures/http_server.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type * as http from "node:http"; +import type { AddressInfo } from "node:net"; +import { createServer } from "http-server"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { tempDirectoryFixture } from "#tests/fixtures/temp_directory.js"; + +export function httpServerFixture( + rootDirectory: Fixture = tempDirectoryFixture(), +): { serverUrl: Fixture; rootDirectory: Fixture } { + return { + serverUrl: fixture(async (stack) => { + const resolvedRootDirectory = await rootDirectory(); + const server: http.Server = ( + createServer({ + root: resolvedRootDirectory, + cache: -1, + }) as any + ).server; + stack.defer(async () => { + await new Promise((resolve) => server.close(resolve)); + }); + const serverUrl = await new Promise((resolve, reject) => { + server.on("error", reject); + server.listen(0, "localhost", () => { + const port = (server.address() as AddressInfo).port; + resolve(`http://localhost:${port}/`); + }); + }); + console.log(`Serving ${resolvedRootDirectory} at ${serverUrl}`); + return serverUrl; + }), + rootDirectory, + }; +} diff --git a/tests/fixtures/msw_browser.ts b/tests/fixtures/msw_browser.ts new file mode 100644 index 0000000000..a282bbf53f --- /dev/null +++ b/tests/fixtures/msw_browser.ts @@ -0,0 +1,21 @@ +import type { LifeCycleEventsMap, SetupApi } from "msw"; +import { http, passthrough } from "msw"; +import { setupWorker, type SetupWorkerApi } from "msw/browser"; +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function mswFixture(): Fixture> { + const mswServer = fixture(async (stack) => { + const server = setupWorker( + http.get("/*", () => passthrough()), + ) as SetupWorkerApi; + stack.defer(() => server.stop()); + await server.start(); + return server; + }); + + afterEach(async () => (await mswServer()).resetHandlers()); + + return mswServer; +} diff --git a/tests/fixtures/msw_node.ts b/tests/fixtures/msw_node.ts new file mode 100644 index 0000000000..a3749e6222 --- /dev/null +++ b/tests/fixtures/msw_node.ts @@ -0,0 +1,18 @@ +import type { LifeCycleEventsMap, SetupApi } from "msw"; +import { setupServer } from "msw/node"; +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function mswFixture(): Fixture> { + const mswServer = fixture(async (stack) => { + const server = setupServer(); + stack.defer(() => server.close()); + server.listen(); + return server; + }); + + afterEach(async () => (await mswServer()).resetHandlers()); + + return mswServer; +} diff --git a/tests/fixtures/shared_kvstore_context.ts b/tests/fixtures/shared_kvstore_context.ts new file mode 100644 index 0000000000..7fa6538db0 --- /dev/null +++ b/tests/fixtures/shared_kvstore_context.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getDefaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { DataManagementContext } from "#src/data_management_context.js"; +import { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { GL } from "#src/webgl/context.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { glFixture } from "#tests/fixtures/gl"; + +export function sharedKvStoreContextFixture( + gl: Fixture = glFixture(), +): Fixture { + return fixture(async (stack) => { + const dataContext = new DataManagementContext( + /*gl=*/ await gl(), + /*frameNumberCounter=*/ undefined as any, + ); + stack.defer(() => dataContext.dispose()); + + const sharedCredentialsManager = dataContext.registerDisposer( + new SharedCredentialsManager( + getDefaultCredentialsManager(), + dataContext.rpc, + ), + ); + + const sharedKvStoreContext = new SharedKvStoreContext( + dataContext.chunkManager, + sharedCredentialsManager, + ); + stack.defer(() => sharedKvStoreContext.dispose()); + + return sharedKvStoreContext; + }); +} diff --git a/tests/fixtures/status_message_observer.ts b/tests/fixtures/status_message_observer.ts new file mode 100644 index 0000000000..78476b70ec --- /dev/null +++ b/tests/fixtures/status_message_observer.ts @@ -0,0 +1,89 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { afterEach } from "vitest"; +import type { StatusMessage } from "#src/status.js"; +import { statusMessages, getStatusMessageContainers } from "#src/status.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export interface StatusMessageHandler { + (message: StatusMessage): void; +} +export class StatusMessageObserver { + private handlers: Set = new Set(); + private observer: MutationObserver; + constructor() { + this.observer = new MutationObserver(() => { + for (const handler of this.handlers) { + for (const message of statusMessages) { + handler(message); + } + } + }); + for (const element of getStatusMessageContainers()) { + this.observer.observe(element, { + subtree: true, + childList: true, + attributes: true, + characterData: true, + }); + } + } + registerHandler(handler: StatusMessageHandler): Disposable { + const wrappedHandler: StatusMessageHandler = (status) => handler(status); + this.handlers.add(wrappedHandler); + return { + [Symbol.dispose]: () => { + this.handlers.delete(wrappedHandler); + }, + }; + } + async waitForButton(pattern: RegExp): Promise { + const { promise, resolve } = Promise.withResolvers(); + using _handler = this.registerHandler((status) => { + const result = document.evaluate( + `.//button`, + status.element, + null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + for (let i = 0, length = result.snapshotLength; i < length; ++i) { + const button = result.snapshotItem(i) as HTMLButtonElement; + if ((button.textContent ?? "").match(pattern)) { + resolve(button); + } + } + }); + return await promise; + } + reset() { + this.handlers.clear(); + } + [Symbol.dispose]() { + this.observer.disconnect(); + } +} + +export function statusMessageObserverFixture(): Fixture { + const f = fixture(async () => new StatusMessageObserver()); + afterEach(async () => { + const handler = await f(); + handler.reset(); + }); + return f; +} diff --git a/tests/fixtures/temp_directory.ts b/tests/fixtures/temp_directory.ts new file mode 100644 index 0000000000..248ab191e7 --- /dev/null +++ b/tests/fixtures/temp_directory.ts @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Vitest fixture that creates a temporary directory. + +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { type Fixture, fixture } from "#tests/fixtures/fixture.js"; + +export function tempDirectoryFixture(prefix: string = ""): Fixture { + return fixture(async (stack) => { + const tempDir = await fs.mkdtemp( + `${os.tmpdir()}${path.sep}neuroglancer-vitest-${prefix}`, + ); + stack.defer(async () => { + await fs.rm(tempDir, { recursive: true, force: true }); + }); + return tempDir; + }); +} diff --git a/tests/kvstore/gcs.spec.ts b/tests/kvstore/gcs.spec.ts new file mode 100644 index 0000000000..5bdfa62fe5 --- /dev/null +++ b/tests/kvstore/gcs.spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/gcs/register.js"; +import { beforeAll } from "vitest"; +import { + createBucket, + fakeGcsServerFixture, + writeObject, +} from "#tests/fixtures/fake_gcs_server.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { getTestFiles } from "#tests/kvstore/test_data.js"; +import { testKvStore } from "#tests/kvstore/test_util.js"; + +const msw = mswFixture(); +const fakeGcsServer = fakeGcsServerFixture(msw); + +const BUCKET = "mybucket"; + +beforeAll(async () => { + // Add data to GCS. + await createBucket(fakeGcsServer, BUCKET); + for (const [relativePath, content] of await getTestFiles()) { + await writeObject( + fakeGcsServer, + BUCKET, + relativePath, + new Uint8Array(content), + ); + } +}); + +testKvStore(constantFixture(`gs://${BUCKET}/`)); diff --git a/tests/kvstore/gzip.spec.ts b/tests/kvstore/gzip.spec.ts new file mode 100644 index 0000000000..1f23d1f974 --- /dev/null +++ b/tests/kvstore/gzip.spec.ts @@ -0,0 +1,36 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register.js"; +import "#src/kvstore/gzip/register.js"; +import { expect, test } from "vitest"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; +import { TEST_DATA_DIR } from "#tests/kvstore/test_data.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_DATA_DIR)); +const sharedKvStoreContext = sharedKvStoreContextFixture(); + +test("can read", async () => { + const { response } = await ( + await sharedKvStoreContext() + ).kvStoreContext.read( + `${await serverFixture.serverUrl()}gzip/simple.txt.gz|gzip`, + { throwIfMissing: true }, + ); + expect(await response.text()).toEqual("Hello"); +}); diff --git a/tests/kvstore/http.spec.ts b/tests/kvstore/http.spec.ts new file mode 100644 index 0000000000..9f5d862481 --- /dev/null +++ b/tests/kvstore/http.spec.ts @@ -0,0 +1,25 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { TEST_FILES_DIR } from "#tests/kvstore/test_data.js"; +import { testKvStore } from "#tests/kvstore/test_util.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_FILES_DIR)); + +testKvStore(serverFixture.serverUrl); diff --git a/tests/kvstore/ngauth.browser_test.ts b/tests/kvstore/ngauth.browser_test.ts new file mode 100644 index 0000000000..152250e233 --- /dev/null +++ b/tests/kvstore/ngauth.browser_test.ts @@ -0,0 +1,142 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/ngauth/register.js"; +import "#src/kvstore/ngauth/register_credentials_provider.js"; +import { http, passthrough } from "msw"; +import { expect, test, afterEach } from "vitest"; +import { mswFixture } from "#tests/fixtures/msw"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; +import { statusMessageObserverFixture } from "#tests/fixtures/status_message_observer.js"; +import { clearCookies } from "#tests/util/clear_cookies.js"; +import { mswRequestLog } from "#tests/util/msw_request_log.js"; + +const msw = mswFixture(); + +const statusMessageObserver = statusMessageObserverFixture(); + +declare const FAKE_NGAUTH_SERVER: string; + +const BUCKET = "mybucket"; + +const sharedKvStoreContext = sharedKvStoreContextFixture(); +const sharedKvStoreContext2 = sharedKvStoreContextFixture(); +afterEach(() => { + clearCookies(); +}); + +test("login", async () => { + using requestLog = mswRequestLog(await msw(), { + redact: ["(?<=neuroglancer=)[a-f0-9]+"], + }); + (await msw()).use( + http.get( + `https://storage.googleapis.com/storage/v1/b/mybucket/o/missing`, + async () => { + return new Response(null, { status: 404 }); + }, + ), + http.all(`${FAKE_NGAUTH_SERVER}/*`, () => passthrough()), + ); + { + const readPromise = (await sharedKvStoreContext()).kvStoreContext.read( + `gs+ngauth+${FAKE_NGAUTH_SERVER}/${BUCKET}/missing`, + ); + console.log("Waiting for login"); + const loginButton = await ( + await statusMessageObserver() + ).waitForButton(/\blogin\b/); + console.log("Clicking login"); + loginButton.click(); + console.log("Waiting for read to complete"); + expect(await readPromise).toBe(undefined); + expect.soft(await requestLog.popAll()).toMatchInlineSnapshot(` + [ + { + "request": { + "url": "http://localhost:*/token", + }, + "response": { + "status": 401, + }, + }, + { + "request": { + "body": "{"token":"fake_token","bucket":"mybucket"}", + "url": "http://localhost:*/gcs_token", + }, + "response": { + "body": "{"token":"fake_gcs_token:mybucket"}", + "status": 200, + }, + }, + { + "request": { + "headers": [ + "authorization: Bearer fake_gcs_token:mybucket", + ], + "url": "https://storage.googleapis.com/storage/v1/b/mybucket/o/missing?alt=media&neuroglancer=*", + }, + "response": { + "status": 404, + }, + }, + ] + `); + } + + // Now that cookies has been set, login is not required. + { + const readPromise = (await sharedKvStoreContext2()).kvStoreContext.read( + `gs+ngauth+${FAKE_NGAUTH_SERVER}/${BUCKET}/missing`, + ); + expect(await readPromise).toBe(undefined); + expect(await requestLog.popAll()).toMatchInlineSnapshot(` + [ + { + "request": { + "url": "http://localhost:*/token", + }, + "response": { + "body": "fake_token", + "status": 200, + }, + }, + { + "request": { + "body": "{"token":"fake_token","bucket":"mybucket"}", + "url": "http://localhost:*/gcs_token", + }, + "response": { + "body": "{"token":"fake_gcs_token:mybucket"}", + "status": 200, + }, + }, + { + "request": { + "headers": [ + "authorization: Bearer fake_gcs_token:mybucket", + ], + "url": "https://storage.googleapis.com/storage/v1/b/mybucket/o/missing?alt=media&neuroglancer=*", + }, + "response": { + "status": 404, + }, + }, + ] + `); + } +}); diff --git a/tests/kvstore/s3.spec.ts b/tests/kvstore/s3.spec.ts new file mode 100644 index 0000000000..2f64b292db --- /dev/null +++ b/tests/kvstore/s3.spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/s3/register.js"; +import { beforeAll } from "vitest"; +import { + createBucket, + fakeS3ServerFixture, + writeObject, +} from "#tests/fixtures/fake_s3_server.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { getTestFiles } from "#tests/kvstore/test_data.js"; +import { testKvStore } from "#tests/kvstore/test_util.js"; + +const msw = mswFixture(); +const fakeS3Server = fakeS3ServerFixture({ msw }); + +const BUCKET = "mybucket"; + +beforeAll(async () => { + // Add data to S3. + await createBucket(fakeS3Server, BUCKET); + for (const [relativePath, content] of await getTestFiles()) { + await writeObject( + fakeS3Server, + BUCKET, + relativePath, + new Uint8Array(content), + ); + } +}); + +testKvStore(constantFixture(`s3://${BUCKET}/`)); diff --git a/tests/kvstore/test_data.ts b/tests/kvstore/test_data.ts new file mode 100644 index 0000000000..89f87f30e7 --- /dev/null +++ b/tests/kvstore/test_data.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fs from "node:fs/promises"; +import path from "node:path"; + +export const TEST_DATA_DIR = path.join( + import.meta.dirname, + "..", + "..", + "testdata", + "kvstore", +); +export const TEST_FILES_DIR = path.join(TEST_DATA_DIR, "files"); + +export async function findFilesRecursively(rootDir: string): Promise { + const relativePaths: string[] = []; + for (const entry of await fs.readdir(rootDir, { + recursive: true, + withFileTypes: true, + })) { + if (!entry.isFile()) { + continue; + } + const fullPath = path.join(entry.parentPath, entry.name); + const relativePath = path + .relative(rootDir, fullPath) + .replaceAll(path.sep, "/"); + relativePaths.push(relativePath); + } + return relativePaths; +} + +export async function getTestFiles( + rootDir: string = TEST_FILES_DIR, +): Promise> { + const map = new Map(); + for (const relativePath of await findFilesRecursively(rootDir)) { + const content = await fs.readFile(path.join(rootDir, relativePath)); + map.set(relativePath, content); + } + return map; +} diff --git a/tests/kvstore/test_util.ts b/tests/kvstore/test_util.ts new file mode 100644 index 0000000000..14a3cb71a7 --- /dev/null +++ b/tests/kvstore/test_util.ts @@ -0,0 +1,213 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, test } from "vitest"; +import type { KvStore } from "#src/kvstore/index.js"; +import { listKvStoreRecursively, readKvStore } from "#src/kvstore/index.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; + +export const sharedKvStoreContext = sharedKvStoreContextFixture(); + +export function testRead(url: Fixture) { + test("read not found", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}missing`), + ).toBe(undefined); + }); + test("read full", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(0); + expect.soft(response!.length).toEqual(3); + expect.soft(await response!.response.text()).toEqual("abc"); + }); + test("read byte range zero length", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { offset: 1, length: 0 }, + }); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(1); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("read byte range zero length empty file", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}empty`, { + byteRange: { offset: 0, length: 0 }, + }); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(0); + expect.soft(response!.offset).toEqual(0); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("read byte range offset+length", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { offset: 1, length: 1 }, + }); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(1); + expect.soft(response!.length).toEqual(1); + expect.soft(await response!.response.text()).toEqual("b"); + }); + test("read byte range suffixLength", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { suffixLength: 1 }, + }); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(2); + expect.soft(response!.length).toEqual(1); + expect.soft(await response!.response.text()).toEqual("c"); + }); + test("read byte range suffixLength=0", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { suffixLength: 0 }, + }); + expect(response).toBeTruthy(); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(3); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("stat on directory returns not found", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.stat(`${await url()}baz`); + expect(response).toEqual(undefined); + }); + test("read on directory returns not found", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}baz`); + expect(response).toEqual(undefined); + }); +} + +export function testList(url: Fixture) { + test("list with empty prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(await url(), { + responseKeys: "suffix", + }), + ).toMatchInlineSnapshot(` + { + "directories": [ + "baz", + ], + "entries": [ + { + "key": "#", + }, + { + "key": "a", + }, + { + "key": "b", + }, + { + "key": "c", + }, + { + "key": "empty", + }, + ], + } + `); + }); + + test("list with file prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(`${await url()}e`, { + responseKeys: "suffix", + }), + ).toMatchInlineSnapshot(` + { + "directories": [], + "entries": [ + { + "key": "mpty", + }, + ], + } + `); + }); + + test("list with directory prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(`${await url()}baz/`, { + responseKeys: "suffix", + }), + ).toMatchInlineSnapshot(` + { + "directories": [], + "entries": [ + { + "key": "x", + }, + ], + } + `); + }); +} + +export function testKvStore(url: Fixture) { + describe("kvstore", () => { + testRead(url); + testList(url); + }); +} + +export async function readAllFromKvStore( + kvStore: KvStore, + prefix: string, +): Promise> { + const keys = await listKvStoreRecursively(kvStore, prefix, { + responseKeys: "suffix", + }); + const values = await Promise.all( + keys.map(async ({ key }) => { + const readResponse = await readKvStore(kvStore, prefix + key, { + throwIfMissing: true, + }); + return Buffer.from(await readResponse.response.arrayBuffer()); + }), + ); + return new Map(Array.from(keys, ({ key }, i) => [key, values[i]])); +} diff --git a/tests/kvstore/url.spec.ts b/tests/kvstore/url.spec.ts new file mode 100644 index 0000000000..db1981963f --- /dev/null +++ b/tests/kvstore/url.spec.ts @@ -0,0 +1,182 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, test } from "vitest"; +import { + finalPipelineUrlComponent, + kvstoreEnsureDirectoryPipelineUrl, + parsePipelineUrlComponent, + parseUrlSuffix, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; + +describe("kvstoreEnsureDirectoryPipelineUrl", () => { + test("single pipeline component", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo")).toEqual( + "http://foo/", + ); + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo/")).toEqual( + "http://foo/", + ); + }); + + test("with query parameters", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo?a=b")).toEqual( + "http://foo/?a=b", + ); + }); + + test("with fragment parameters", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo#a=b")).toEqual( + "http://foo/#a=b", + ); + }); + + test("multiple pipeline component", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo|zarr")).toEqual( + "http://foo|zarr:", + ); + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo|zarr:")).toEqual( + "http://foo|zarr:", + ); + }); +}); + +describe("pipelineUrlJoin", () => { + test("simple", () => { + expect(pipelineUrlJoin("gs://foo", "a", "b")).toEqual("gs://foo/a/b"); + }); + test("query parameter", () => { + expect(pipelineUrlJoin("gs://foo?a=b", "a", "b")).toEqual( + "gs://foo/a/b?a=b", + ); + expect(pipelineUrlJoin("gs://foo?a=b|zarr", "a", "b")).toEqual( + "gs://foo?a=b|zarr:a/b", + ); + }); +}); + +describe("finalPipelineUrlComponent", () => { + test("single component", () => { + expect(finalPipelineUrlComponent("")).toEqual(""); + expect(finalPipelineUrlComponent("gs://a")).toEqual("gs://a"); + }); + test("multiple components", () => { + expect(finalPipelineUrlComponent("gs://a|zarr")).toEqual("zarr"); + expect(finalPipelineUrlComponent("gs://a|zip:foo|zarr:")).toEqual("zarr:"); + }); +}); + +describe("parsePipelineUrlComponent", () => { + test("scheme only", () => { + expect(parsePipelineUrlComponent("zarr")).toEqual({ + scheme: "zarr", + suffix: undefined, + url: "zarr", + }); + }); + test("empty suffix", () => { + expect(parsePipelineUrlComponent("zarr:")).toEqual({ + scheme: "zarr", + suffix: "", + url: "zarr:", + }); + }); +}); + +describe("parseUrlSuffix", () => { + test("no suffix", () => { + expect(parseUrlSuffix(undefined)).toMatchInlineSnapshot(` + { + "authorityAndPath": undefined, + "fragment": undefined, + "query": undefined, + } + `); + }); + test("empty suffix", () => { + expect(parseUrlSuffix("")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": undefined, + "query": undefined, + } + `); + }); + test("path only", () => { + expect(parseUrlSuffix("a/b/")).toMatchInlineSnapshot(` + { + "authorityAndPath": "a/b/", + "fragment": undefined, + "query": undefined, + } + `); + }); + test("query only", () => { + expect(parseUrlSuffix("?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": undefined, + "query": "query", + } + `); + }); + test("fragment only", () => { + expect(parseUrlSuffix("#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": "fragment", + "query": undefined, + } + `); + }); + test("path and query", () => { + expect(parseUrlSuffix("//host/path?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": undefined, + "query": "query", + } + `); + }); + test("path and fragment", () => { + expect(parseUrlSuffix("//host/path#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment", + "query": undefined, + } + `); + }); + test("path and query and fragment", () => { + expect(parseUrlSuffix("//host/path?query#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment", + "query": "query", + } + `); + }); + test("path and fragment with fake query", () => { + expect(parseUrlSuffix("//host/path#fragment?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment?query", + "query": undefined, + } + `); + }); +}); diff --git a/tests/kvstore/zip.spec.ts b/tests/kvstore/zip.spec.ts new file mode 100644 index 0000000000..ad20d07e10 --- /dev/null +++ b/tests/kvstore/zip.spec.ts @@ -0,0 +1,177 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register.js"; +import "#src/kvstore/zip/register_backend.js"; +import "#src/kvstore/zip/register_frontend.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { describe, expect, test } from "vitest"; +import yauzl from "yauzl"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { TEST_DATA_DIR } from "#tests/kvstore/test_data.js"; +import { + testKvStore, + sharedKvStoreContext, + readAllFromKvStore, +} from "#tests/kvstore/test_util.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_DATA_DIR)); + +function readAllUsingYauzl(zipPath: string) { + return new Promise((resolve, reject) => { + const map = new Map(); + yauzl.open(zipPath, { lazyEntries: true }, function (err, zipfile) { + if (err) { + reject(err); + return; + } + zipfile.on("entry", async (entry) => { + if (/\/$/.test(entry.fileName)) { + zipfile.readEntry(); + return; + } + zipfile.openReadStream(entry, async (err, readStream) => { + if (err) { + reject(err); + return; + } + const parts: Buffer[] = []; + readStream.on("data", (chunk) => { + parts.push(chunk); + }); + readStream.on("end", () => { + map.set(entry.fileName, Buffer.concat(parts)); + zipfile.readEntry(); + }); + }); + }); + zipfile.on("end", () => { + zipfile.close(); + resolve(map); + }); + zipfile.readEntry(); + }); + }); +} + +describe("yauzl success cases", async () => { + const relativePath = "zip/from-yauzl/success"; + const zipFiles = await fs.readdir(path.join(TEST_DATA_DIR, relativePath)); + test.for(zipFiles)("%s", async (zipFile) => { + const url = + (await serverFixture.serverUrl()) + `${relativePath}/${zipFile}|zip:`; + const { kvStoreContext } = await sharedKvStoreContext(); + const kvStore = kvStoreContext.getKvStore(url); + const contentFromZip = await readAllFromKvStore( + kvStore.store, + kvStore.path, + ); + const expectedFiles = await readAllUsingYauzl( + path.join(TEST_DATA_DIR, relativePath, zipFile), + ); + expect(contentFromZip).toEqual(expectedFiles); + }); +}); + +describe("yauzl failure cases", async () => { + const relativePath = "zip/from-yauzl/failure"; + const zipFiles = await fs.readdir(path.join(TEST_DATA_DIR, relativePath)); + test.for(zipFiles)("%s", async (zipFile) => { + const url = + (await serverFixture.serverUrl()) + `${relativePath}/${zipFile}|zip:`; + const { kvStoreContext } = await sharedKvStoreContext(); + const kvStore = kvStoreContext.getKvStore(url); + const expectedError = new RegExp( + zipFile + .replace(/(_[0-9]+)?\.zip$/, "") + .split(/\s+/) + .join(".*"), + "i", + ); + await expect( + readAllFromKvStore(kvStore.store, kvStore.path).then(() => null), + ).rejects.toThrowError(expectedError); + }); +}); + +testKvStore( + async () => (await serverFixture.serverUrl()) + "zip/files.zip|zip:", +); + +describe("completion", () => { + test("empty prefix", async () => { + const url = (await serverFixture.serverUrl()) + "zip/files.zip|zip:"; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "%23|", + }, + { + "value": "a|", + }, + { + "value": "b|", + }, + { + "value": "c|", + }, + { + "value": "empty|", + }, + ], + "defaultCompletion": undefined, + "offset": 41, + } + `); + }); + + test("single letter prefix", async () => { + const url = (await serverFixture.serverUrl()) + "zip/files.zip|zip:b"; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "b|", + }, + ], + "defaultCompletion": undefined, + "offset": 41, + } + `); + }); +}); diff --git a/tests/util/clear_cookies.ts b/tests/util/clear_cookies.ts new file mode 100644 index 0000000000..54ab46b3dd --- /dev/null +++ b/tests/util/clear_cookies.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Clears all cookies that are accessible to JavaScript. HTTP-only cookies +// cannot be cleared. +export function clearCookies(): void { + for (const cookie of document.cookie.split(";")) { + document.cookie = cookie + .replace(/^ +/, "") + .replace(/=.*/, `=;expires=${new Date(0).toUTCString()};path=/`); + } + window.localStorage.clear(); +} diff --git a/tests/util/msw_request_log.ts b/tests/util/msw_request_log.ts new file mode 100644 index 0000000000..a8e4982888 --- /dev/null +++ b/tests/util/msw_request_log.ts @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { type LifeCycleEventsMap, type SetupApi } from "msw"; + +interface RequestLogEntry { + request: { + url: string; + headers?: string[]; + body?: string; + }; + response: { + status: number; + body?: string; + }; +} + +export function mswRequestLog( + msw: SetupApi, + options: { + redact?: string[]; + } = {}, +) { + const redactPatterns = [ + "(?<=http://localhost:)[0-9]+", + ...(options.redact ?? []), + ]; + const redactRegexp = new RegExp( + redactPatterns.map((s) => `(?:${s})`).join("|"), + "g", + ); + const redact = (s: string) => s.replaceAll(redactRegexp, "*"); + const getHeaders = (headers: Headers): { headers?: string[] } => { + const list: string[] = []; + for (const [name, value] of headers.entries()) { + if (name === "accept" || name === "content-type") { + continue; + } + list.push(redact(`${name}: ${value}`)); + } + if (list.length === 0) return {}; + return { headers: list }; + }; + const getBody = async (r: Request | Response): Promise<{ body?: string }> => { + const body = redact(await r.text()); + if (!body) return {}; + return { body }; + }; + const log: Promise[] = []; + const outstandingRequests = new Map< + string, + { resolve: (value: RequestLogEntry) => void } + >(); + const handler = async ({ + request, + response, + requestId, + }: { + request: Request; + response: Response; + requestId: string; + }) => { + const resolvers = outstandingRequests.get(requestId); + if (resolvers === undefined) return; + outstandingRequests.delete(requestId); + request = request.clone(); + response = response.clone(); + const entry: RequestLogEntry = { + request: { + url: redact(request.url), + ...getHeaders(request.headers), + ...(await getBody(request)), + }, + response: { + status: response.status, + ...(await getBody(response)), + }, + }; + resolvers.resolve(entry); + }; + const requestHandler = ({ + request, + requestId, + }: { + request: Request; + requestId: string; + }) => { + if (new URL(request.url).origin === window.origin) { + return; + } + const { promise, resolve } = Promise.withResolvers(); + outstandingRequests.set(requestId, { resolve }); + log.push(promise); + }; + // request:start event is always sequenced before the `fetch` resolves, but + // `response:*` events sometimes don't. To avoid missing events, log entries + // are added on `response:start` and resolved by the corresponding + // `response:*` event. + msw.events.on("request:start", requestHandler); + msw.events.on("response:mocked", handler); + msw.events.on("response:bypass", handler); + return { + [Symbol.dispose]: () => { + msw.events.removeListener("request:start", requestHandler); + msw.events.removeListener("response:mocked", handler); + msw.events.removeListener("response:bypass", handler); + }, + log, + popAll: () => { + const result = log.slice(); + log.length = 0; + return Promise.all(result); + }, + }; +} diff --git a/tsconfig.json b/tsconfig.json index 172a9e26e7..e2185ad26e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,6 +34,5 @@ "testdata", "examples", "config", - "tests", ], } diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 00f4e15afb..8b489d1ca7 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1,29 +1,60 @@ +import path from "node:path"; +import mswPlugin from "@iodigital/vite-plugin-msw"; import { defineWorkspace } from "vitest/config"; +import { getFakeGcsServerBin } from "build_tools/vitest/build_fake_gcs_server.ts"; +import { startFakeNgauthServer } from "./build_tools/vitest/fake_ngauth_server.ts"; +import { startTestDataServer } from "./build_tools/vitest/test_data_server.ts"; + +const fakeNgauthServer = await startFakeNgauthServer(); +const testDataServer = await startTestDataServer( + path.join(import.meta.dirname, "testdata"), +); +const fakeGcsServerBin = await getFakeGcsServerBin(); export default defineWorkspace([ { test: { name: "node", - environment: "node", - setupFiles: ["./build_tools/vitest/setup-crypto.ts"], - include: ["src/**/*.spec.ts"], + environment: "jsdom", + setupFiles: [ + "./build_tools/vitest/polyfill-browser-globals-in-node.ts", + "@vitest/web-worker", + ], + include: ["src/**/*.spec.ts", "tests/**/*.spec.ts"], benchmark: { include: ["src/**/*.benchmark.ts"], }, + testTimeout: 10000, + }, + define: { + FAKE_GCS_SERVER_BIN: JSON.stringify(fakeGcsServerBin), }, }, { + define: { + FAKE_NGAUTH_SERVER: JSON.stringify(fakeNgauthServer.url), + TEST_DATA_SERVER: JSON.stringify(testDataServer.url), + }, + esbuild: { + target: "es2022", + }, + plugins: [mswPlugin({ mode: "browser", handlers: [] })], + optimizeDeps: { + include: ["nifti-reader-js"], + entries: ["src/util/polyfills.ts"], + }, test: { name: "browser", - include: ["src/**/*.browser_test.ts"], + include: ["src/**/*.browser_test.ts", "tests/**/*.browser_test.ts"], benchmark: { include: [], }, browser: { - provider: "webdriverio", + provider: "playwright", enabled: true, headless: true, - name: "chrome", + instances: [{ browser: "chromium" }], + screenshotFailures: false, }, }, }, From 7c45c03e1306fabbb37e18c284ef4e2e5700d7a1 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sat, 18 Jan 2025 22:12:47 -0800 Subject: [PATCH 31/41] chore(lint): Use oxlint in addition to eslint oxlint is much faster than eslint, completing in about 0.5 seconds, compared to eslint completing in about 15 seconds. It is still missing some important rules, but critically, it supports "import/no-cycle", which is the one rule that is incompatible with per-file caching. Consequently, eslint can now be run with caching enabled, which greatly improves iteration time. --- .oxlintrc.json | 60 ++++ eslint.config.js | 15 +- package-lock.json | 313 +++++++++++++++++++- package.json | 13 +- src/annotation/bounding_box.ts | 6 +- src/annotation/frontend_source.ts | 4 +- src/annotation/renderlayer.ts | 10 +- src/annotation/type_handler.ts | 4 +- src/axes_lines.ts | 10 +- src/datasource/enabled_backend_modules.ts | 1 - src/datasource/nggraph/backend.ts | 0 src/mesh/frontend.ts | 20 +- src/single_mesh/frontend.ts | 4 +- src/skeleton/frontend.ts | 6 +- src/ui/tool_palette.ts | 2 +- src/volume_rendering/volume_render_layer.ts | 4 +- src/webgl/buffer.ts | 6 +- src/webgl/index_emulation.ts | 10 +- src/webgl/spheres.ts | 6 +- src/webgl/vertex_id.ts | 6 +- src/widget/transfer_function.ts | 16 +- tests/kvstore/zip.spec.ts | 2 +- 22 files changed, 427 insertions(+), 91 deletions(-) create mode 100644 .oxlintrc.json delete mode 100644 src/datasource/nggraph/backend.ts diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..11df356ad1 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,60 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["import", "typescript", "oxc", "unicorn", "promise", "vitest"], + "env": { + "browser": true + }, + "settings": {}, + "rules": { + // Seems to be buggy + "no-loss-of-precision": "off", + "import/no-cycle": "error", + "import/first": "error", + "no-unsafe-finally": "off", + "require-yield": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + "erasing-op": "off", + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ], + "no-new-array": "off", + "no-document-cookie": "off", + "@typescript-eslint/consistent-type-imports": "error" + }, + "overrides": [ + { + "files": ["*.test.ts", "*.spec.ts"], + "rules": { + "@typescript-eslint/no-explicit-any": "off" + } + } + ], + "ignorePatterns": [ + "**/node_modules", + "**/dist", + "**/python", + "templates/neuroglancer/sliceview", + "src/third_party/jpgjs/jpg.js", + "**/templates", + "**/build", + "**/.tox", + "**/.nox", + "lib", + "**/python", + "**/config", + "**/typings", + "src/mesh/draco/stub.js", + "**/tsconfig.tsbuildinfo", + "examples" + ] +} diff --git a/eslint.config.js b/eslint.config.js index a7c11e0791..cbc657c4c5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -55,6 +55,8 @@ export default tseslint.config( "no-constant-condition": "off", + "no-unused-disable": "off", + "@typescript-eslint/no-unused-vars": [ "error", { @@ -69,19 +71,16 @@ export default tseslint.config( "no-unsafe-finally": "off", "require-yield": "off", "no-inner-declarations": "off", + + // Supported by oxlint + "import/namespace": "off", + "import/default": "off", + "import/no-named-as-default": "off", "import/no-named-as-default-member": "off", - "import/no-cycle": [ - "error", - { - ignoreExternal: true, - disableScc: true, - }, - ], "@typescript-eslint/consistent-type-imports": "error", "import/no-unresolved": "error", "import/no-extraneous-dependencies": "error", - "import/first": "error", "import/order": [ "error", diff --git a/package-lock.json b/package-lock.json index 95cce58459..52a790c9e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,8 +40,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -49,6 +51,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", @@ -119,6 +122,100 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/runtime": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", @@ -1482,6 +1579,118 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, + "node_modules/@oxlint/darwin-arm64": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-0.15.7.tgz", + "integrity": "sha512-+8jOC9MfzIhbRdmNYl+gLlGZe8dhl2hrQRLJ+mriPRXxtpfBmT5aOmEQrs9BX5GPnh6hy4ArMvjDbCCXD+bl+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint/darwin-x64": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-0.15.7.tgz", + "integrity": "sha512-4y1v3zCtQU0dv5SxwBZqtYiqtQTUSvEdK3XzWg/JxN8qEleHonQrbSvGKmlkzraEouKTIm1bXjmnrX26MX22cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint/linux-arm64-gnu": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-0.15.7.tgz", + "integrity": "sha512-g01PWQl1+HLlMGK3lwH8G+A/5vA6H7tcKUHnx/qGz4+LM1zKfp1w2d2aoXxPqpIgtBPn19JRcBiEMv+nr40fiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-arm64-musl": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-0.15.7.tgz", + "integrity": "sha512-8Dg7qaHXNgiZgP3TxQU8k/5fpzGfcxYVLK58Sj/vSZ3vMrI68ipkq+rkNBjAXT1Aq2/eM6L/9CLH8pex+I1Nkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-gnu": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-0.15.7.tgz", + "integrity": "sha512-hLsfcOgoky/FUGF2s3v7+wd0xGGuyE7EBPSTV7BPQYEm5+P5ZeWXPlUg8uTPee6bIxHa6lZLqunRl8Jn44b/ig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-musl": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-0.15.7.tgz", + "integrity": "sha512-BW9dACxzLRZq67lPFis/NCiitQucZbbrONeK0mReBWPSM3MaegLY82kZU7sMq3fpBbzGaKFoNLp2EcsNfS5IVw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/win32-arm64": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-0.15.7.tgz", + "integrity": "sha512-VvIaIdfCjcYy8cj3yAjHwj2dDFIFxdUS7G+KeDK/iH7O3uXW8wOec2wFYcd8xmVYHEcnw8fgNAXy04gXpB6KnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/win32-x64": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.15.7.tgz", + "integrity": "sha512-1WKZTgtJswATA8NYeUfMnN4ei7AUVyomrWBiPwYGMRMOo4jeGkOlOr2/iYq/vbtOCyOuqAo2JjfzN5sBOPfI/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4534,9 +4743,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -4552,12 +4761,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "optional": true, "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -4728,9 +4938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -4745,7 +4955,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/caseless": { "version": "0.12.0", @@ -6209,10 +6420,11 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", + "version": "1.5.83", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", + "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", "dev": true, + "license": "ISC", "optional": true, "peer": true }, @@ -6589,6 +6801,30 @@ } } }, + "node_modules/eslint-formatter-codeframe": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", + "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-formatter-codeframe/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -6755,6 +6991,16 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-oxlint": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.15.7.tgz", + "integrity": "sha512-u/Abrwh/6uu533ofqKlzmZra8ezgoMfUpRJ4I0UQmque/TqDPa+WSbdTLqRopmuTtBExUKJ4/jnyrFB3jk4GOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.3.1" + } + }, "node_modules/eslint-rspack-plugin": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-rspack-plugin/-/eslint-rspack-plugin-4.2.1.tgz", @@ -6965,10 +7211,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -9652,6 +9899,13 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -10847,6 +11101,33 @@ "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true }, + "node_modules/oxlint": { + "version": "0.15.7", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-0.15.7.tgz", + "integrity": "sha512-ECx9retPd7Rvq62TasGODyQ4mrMtqBCCB18xOYGiAf8PP61snHaokLeTWQFf+pTURWpJZ9pIi2pMIDKh2P2SpQ==", + "dev": true, + "license": "MIT", + "bin": { + "oxc_language_server": "bin/oxc_language_server", + "oxlint": "bin/oxlint" + }, + "engines": { + "node": ">=14.*" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/darwin-arm64": "0.15.7", + "@oxlint/darwin-x64": "0.15.7", + "@oxlint/linux-arm64-gnu": "0.15.7", + "@oxlint/linux-arm64-musl": "0.15.7", + "@oxlint/linux-x64-gnu": "0.15.7", + "@oxlint/linux-x64-musl": "0.15.7", + "@oxlint/win32-arm64": "0.15.7", + "@oxlint/win32-x64": "0.15.7" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", diff --git a/package.json b/package.json index 2473cb3a1e..264dc7414e 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,8 @@ "test:watch": "vitest watch", "benchmark": "vitest bench --run", "benchmark:watch": "vitest bench", - "lint:check": "eslint .", - "lint:fix": "eslint . --fix", + "lint:check": "oxlint && eslint . --cache --format codeframe", + "lint:fix": "oxlint --fix && eslint . --cache --fix --format codeframe && prettier --cache -w -l .", "format:check": "prettier --cache . -c", "format:fix": "prettier --cache -w -l .", "typecheck": "tsc --noEmit", @@ -62,8 +62,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -71,6 +73,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", @@ -252,12 +255,6 @@ "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/register_default.ts" }, - "#datasource/nggraph/backend": { - "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/backend.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nggraph:disabled": "./src/util/false.ts", - "default": "./src/datasource/nggraph/backend.ts" - }, "#datasource/nggraph/register_default": { "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", diff --git a/src/annotation/bounding_box.ts b/src/annotation/bounding_box.ts index 60100918f9..00ed93eba1 100644 --- a/src/annotation/bounding_box.ts +++ b/src/annotation/bounding_box.ts @@ -37,7 +37,7 @@ import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js" import { tile2dArray } from "#src/util/array.js"; import { getViewFrustrumWorldBounds, mat4 } from "#src/util/geom.js"; import { CORNERS_PER_BOX, EDGES_PER_BOX } from "#src/webgl/bounding_box.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, @@ -293,7 +293,7 @@ void setBoundingBoxFillColor(vec4 color) { class PerspectiveViewRenderHelper extends RenderHelper { private edgeBoxCornerOffsetsBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( this.gl, tile2dArray( edgeBoxCornerOffsetData, @@ -346,7 +346,7 @@ emitAnnotation(vec4(vColor.rgb, getLineAlpha() * vClipCoefficient)); ); private boxCornerOffsetsBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( this.gl, tile2dArray( vertexBasePositions, diff --git a/src/annotation/frontend_source.ts b/src/annotation/frontend_source.ts index 77f80d9d83..c33e684172 100644 --- a/src/annotation/frontend_source.ts +++ b/src/annotation/frontend_source.ts @@ -61,7 +61,7 @@ import { ENDIANNESS, Endianness } from "#src/util/endian.js"; import * as matrix from "#src/util/matrix.js"; import type { Signal } from "#src/util/signal.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { RPC } from "#src/worker_rpc.js"; import { @@ -90,7 +90,7 @@ export function computeNumPickIds( } export class AnnotationGeometryData { - buffer: Buffer | undefined; + buffer: GLBuffer | undefined; bufferValid = false; serializedAnnotations: SerializedAnnotations; numPickIds = 0; diff --git a/src/annotation/renderlayer.ts b/src/annotation/renderlayer.ts index 90c7d120ca..b0ab74f9e4 100644 --- a/src/annotation/renderlayer.ts +++ b/src/annotation/renderlayer.ts @@ -128,7 +128,7 @@ import type { AnyConstructor, MixinConstructor } from "#src/util/mixin.js"; import { NullarySignal } from "#src/util/signal.js"; import type { Uint64 } from "#src/util/uint64.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { ParameterizedContextDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import type { @@ -228,7 +228,7 @@ export class AnnotationLayer extends RefCounted { /** * Stores a serialized representation of the information needed to render the annotations. */ - buffer: Buffer | undefined; + buffer: GLBuffer | undefined; numPickIds = 0; @@ -367,7 +367,7 @@ export class AnnotationLayer extends RefCounted { let { buffer } = this; if (buffer === undefined) { buffer = this.buffer = this.registerDisposer( - new Buffer(this.chunkManager.gl), + new GLBuffer(this.chunkManager.gl), ); } this.generation = generation; @@ -385,7 +385,7 @@ export class AnnotationLayer extends RefCounted { interface AnnotationGeometryDataInterface { serializedAnnotations: SerializedAnnotations; - buffer: Buffer; + buffer: GLBuffer; numPickIds: number; } @@ -609,7 +609,7 @@ function AnnotationRenderLayer< if (!chunk.bufferValid) { let { buffer } = chunk; if (buffer === undefined) { - buffer = chunk.buffer = new Buffer(this.gl); + buffer = chunk.buffer = new GLBuffer(this.gl); } const { serializedAnnotations } = chunk; buffer.setData(serializedAnnotations.data); diff --git a/src/annotation/type_handler.ts b/src/annotation/type_handler.ts index 4e6af18194..dc2f25f638 100644 --- a/src/annotation/type_handler.ts +++ b/src/annotation/type_handler.ts @@ -31,7 +31,7 @@ import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js" import type { WatchableValueInterface } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import type { mat4 } from "#src/util/geom.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { GL } from "#src/webgl/context.js"; import type { @@ -65,7 +65,7 @@ export type AnnotationShaderGetter = ParameterizedContextDependentShaderGetter< >; export interface AnnotationRenderContext { - buffer: Buffer; + buffer: GLBuffer; annotationLayer: AnnotationLayer; renderContext: SliceViewPanelRenderContext | PerspectiveViewRenderContext; bufferOffset: number; diff --git a/src/axes_lines.ts b/src/axes_lines.ts index d281948665..e13d90c011 100644 --- a/src/axes_lines.ts +++ b/src/axes_lines.ts @@ -17,7 +17,7 @@ import type { ProjectionParameters } from "#src/projection_parameters.js"; import { RefCounted } from "#src/util/disposable.js"; import { mat4 } from "#src/util/geom.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderProgram } from "#src/webgl/shader.js"; import { trivialColorShader } from "#src/webgl/trivial_shaders.js"; @@ -46,14 +46,14 @@ export function computeAxisLineMatrix( } export class AxesLineHelper extends RefCounted { - vertexBuffer: Buffer; - colorBuffer: Buffer; + vertexBuffer: GLBuffer; + colorBuffer: GLBuffer; trivialColorShader: ShaderProgram; constructor(public gl: GL) { super(); this.vertexBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( gl, new Float32Array([ 0, @@ -88,7 +88,7 @@ export class AxesLineHelper extends RefCounted { const alpha = 0.5; this.colorBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( gl, new Float32Array([ 1, diff --git a/src/datasource/enabled_backend_modules.ts b/src/datasource/enabled_backend_modules.ts index 926dea0f29..62f3d8564e 100644 --- a/src/datasource/enabled_backend_modules.ts +++ b/src/datasource/enabled_backend_modules.ts @@ -5,7 +5,6 @@ import "#datasource/deepzoom/backend"; import "#datasource/dvid/backend"; import "#datasource/graphene/backend"; import "#datasource/n5/backend"; -import "#datasource/nggraph/backend"; import "#datasource/nifti/backend"; import "#datasource/obj/backend"; import "#datasource/precomputed/backend"; diff --git a/src/datasource/nggraph/backend.ts b/src/datasource/nggraph/backend.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/mesh/frontend.ts b/src/mesh/frontend.ts index 8260fc06aa..bccb3c9ec6 100644 --- a/src/mesh/frontend.ts +++ b/src/mesh/frontend.ts @@ -67,7 +67,7 @@ import { } from "#src/util/geom.js"; import * as matrix from "#src/util/matrix.js"; import type { Uint64 } from "#src/util/uint64.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; @@ -86,19 +86,19 @@ function copyMeshDataToGpu( gl: GL, chunk: FragmentChunk | MultiscaleFragmentChunk, ) { - chunk.vertexBuffer = Buffer.fromData( + chunk.vertexBuffer = GLBuffer.fromData( gl, chunk.meshData.vertexPositions, gl.ARRAY_BUFFER, gl.STATIC_DRAW, ); - chunk.indexBuffer = Buffer.fromData( + chunk.indexBuffer = GLBuffer.fromData( gl, chunk.meshData.indices, gl.ELEMENT_ARRAY_BUFFER, gl.STATIC_DRAW, ); - chunk.normalBuffer = Buffer.fromData( + chunk.normalBuffer = GLBuffer.fromData( gl, chunk.meshData.vertexNormals, gl.ARRAY_BUFFER, @@ -680,9 +680,9 @@ export class ManifestChunk extends Chunk { export class FragmentChunk extends Chunk { declare source: FragmentSource; - vertexBuffer: Buffer; - indexBuffer: Buffer; - normalBuffer: Buffer; + vertexBuffer: GLBuffer; + indexBuffer: GLBuffer; + normalBuffer: GLBuffer; meshData: EncodedMeshData; constructor(source: FragmentSource, x: any) { @@ -1099,9 +1099,9 @@ export class MultiscaleManifestChunk extends Chunk { export class MultiscaleFragmentChunk extends Chunk { meshData: EncodedMeshData & { subChunkOffsets: Uint32Array }; declare source: MultiscaleFragmentSource; - vertexBuffer: Buffer; - indexBuffer: Buffer; - normalBuffer: Buffer; + vertexBuffer: GLBuffer; + indexBuffer: GLBuffer; + normalBuffer: GLBuffer; constructor(source: MultiscaleFragmentSource, x: any) { super(source); diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index 0fae89510b..ee15858ce2 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -45,7 +45,7 @@ import type { mat4 } from "#src/util/geom.js"; import { vec3 } from "#src/util/geom.js"; import type { ProgressOptions } from "#src/util/progress_listener.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { GL } from "#src/webgl/context.js"; import { @@ -396,7 +396,7 @@ export class VertexChunkData { export class SingleMeshChunk extends Chunk { declare source: SingleMeshSource; - indexBuffer: Buffer; + indexBuffer: GLBuffer; numIndices: number; indices: Uint32Array; vertexData: VertexChunkData; diff --git a/src/skeleton/frontend.ts b/src/skeleton/frontend.ts index 2d6dfb4dd3..c95e8303ad 100644 --- a/src/skeleton/frontend.ts +++ b/src/skeleton/frontend.ts @@ -51,7 +51,7 @@ import { NullarySignal } from "#src/util/signal.js"; import type { Trackable } from "#src/util/trackable.js"; import { CompoundTrackable } from "#src/util/trackable.js"; import { TrackableEnum } from "#src/util/trackable_enum.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, @@ -781,7 +781,7 @@ export class SkeletonChunk extends Chunk { declare source: SkeletonSource; vertexAttributes: Uint8Array; indices: Uint32Array; - indexBuffer: Buffer; + indexBuffer: GLBuffer; numIndices: number; numVertices: number; vertexAttributeOffsets: Uint32Array; @@ -822,7 +822,7 @@ export class SkeletonChunk extends Chunk { vertexAttributeTextures[i] = texture; } gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, null); - this.indexBuffer = Buffer.fromData( + this.indexBuffer = GLBuffer.fromData( gl, this.indices, WebGL2RenderingContext.ARRAY_BUFFER, diff --git a/src/ui/tool_palette.ts b/src/ui/tool_palette.ts index 8425a95883..d48764fe3f 100644 --- a/src/ui/tool_palette.ts +++ b/src/ui/tool_palette.ts @@ -1028,7 +1028,7 @@ export class MultiToolPaletteState implements Trackable { this.checkTitles(palette); palette.location.value = { ...DEFAULT_TOOL_PALETTE_PANEL_LOCATION, - ...(location ?? {}), + ...location, }; palette.location.locationChanged.dispatch(); this.add(palette); diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index ee6064b678..51cf025338 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -74,7 +74,7 @@ import { drawBoxes, glsl_getBoxFaceVertexPosition, } from "#src/webgl/bounding_box.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { @@ -250,7 +250,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { return this.dataHistogramSpecifications.visibleHistograms; } - private histogramIndexBuffer: RefCountedValue; + private histogramIndexBuffer: RefCountedValue; constructor(options: VolumeRenderingRenderLayerOptions) { super(); diff --git a/src/webgl/buffer.ts b/src/webgl/buffer.ts index d976cde8de..bf4c18c64d 100644 --- a/src/webgl/buffer.ts +++ b/src/webgl/buffer.ts @@ -24,7 +24,7 @@ import type { AttributeIndex } from "#src/webgl/shader.js"; export type BufferType = number; export type WebGLDataType = number; export type WebGLBufferUsage = number; -export class Buffer implements Disposable { +export class GLBuffer implements Disposable { buffer: WebGLBuffer | null; constructor( public gl: WebGL2RenderingContext, @@ -98,7 +98,7 @@ export class Buffer implements Disposable { bufferType?: BufferType, usage?: WebGLBufferUsage, ) { - const buffer = new Buffer(gl, bufferType); + const buffer = new GLBuffer(gl, bufferType); buffer.setData(data, usage); return buffer; } @@ -118,7 +118,7 @@ export function getMemoizedBuffer( }), () => { const result = new RefCountedValue( - Buffer.fromData( + GLBuffer.fromData( gl, getter(...args), bufferType, diff --git a/src/webgl/index_emulation.ts b/src/webgl/index_emulation.ts index c1976599f6..c804937d53 100644 --- a/src/webgl/index_emulation.ts +++ b/src/webgl/index_emulation.ts @@ -15,7 +15,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; import { glsl_uint32 } from "#src/webgl/shader_lib.js"; @@ -23,11 +23,11 @@ import { glsl_uint32 } from "#src/webgl/shader_lib.js"; export class CountingBuffer extends RefCounted { length: number | undefined; webglType: number | undefined; - buffer: Buffer; + buffer: GLBuffer; constructor(public gl: GL) { super(); - this.buffer = this.registerDisposer(new Buffer(gl)); + this.buffer = this.registerDisposer(new GLBuffer(gl)); } resize(length: number) { @@ -115,7 +115,7 @@ export class IndexBufferAttributeHelper { builder.addAttribute("highp uint", this.name); } - bind(buffer: Buffer, shader: ShaderProgram) { + bind(buffer: GLBuffer, shader: ShaderProgram) { const attrib = shader.attribute(this.name); buffer.bindToVertexAttribI( attrib, @@ -130,7 +130,7 @@ export class IndexBufferAttributeHelper { } export function makeIndexBuffer(gl: WebGL2RenderingContext, data: Uint32Array) { - return Buffer.fromData( + return GLBuffer.fromData( gl, data, WebGL2RenderingContext.ARRAY_BUFFER, diff --git a/src/webgl/spheres.ts b/src/webgl/spheres.ts index e42e6790e2..e9a899a850 100644 --- a/src/webgl/spheres.ts +++ b/src/webgl/spheres.ts @@ -19,7 +19,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; @@ -71,8 +71,8 @@ export function getSphereIndexArray( } export class SphereRenderHelper extends RefCounted { - private vertexBuffer: Buffer; - private indexBuffer: Buffer; + private vertexBuffer: GLBuffer; + private indexBuffer: GLBuffer; private numIndices: number; constructor(gl: GL, latitudeBands: number, longitudeBands: number) { diff --git a/src/webgl/vertex_id.ts b/src/webgl/vertex_id.ts index 9f20345679..7ca492268a 100644 --- a/src/webgl/vertex_id.ts +++ b/src/webgl/vertex_id.ts @@ -22,7 +22,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder } from "#src/webgl/shader.js"; @@ -40,11 +40,11 @@ int getVertexId () { export class VertexIdHelper extends RefCounted { size: number; - buffer: Buffer; + buffer: GLBuffer; constructor(gl: WebGL2RenderingContext) { super(); - this.buffer = new Buffer(gl); + this.buffer = new GLBuffer(gl); this.size = 0; } diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 35e325de9b..507fab64d6 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -51,7 +51,7 @@ import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Uint64 } from "#src/util/uint64.js"; import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import { Buffer, getMemoizedBuffer } from "#src/webgl/buffer.js"; +import { GLBuffer, getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { @@ -685,12 +685,12 @@ function getTextureVertexBufferArray() { */ class TransferFunctionPanel extends IndirectRenderedPanel { texture: DirectLookupTableTexture; - private textureVertexBuffer: Buffer; - private controlPointsVertexBuffer: Buffer; + private textureVertexBuffer: GLBuffer; + private controlPointsVertexBuffer: GLBuffer; private controlPointsPositionArray = new Float32Array(); - private controlPointsColorBuffer: Buffer; + private controlPointsColorBuffer: GLBuffer; private controlPointsColorArray = new Float32Array(); - private linePositionBuffer: Buffer; + private linePositionBuffer: GLBuffer; private linePositionArray = new Float32Array(); get drawOrder() { return 1; @@ -740,13 +740,13 @@ class TransferFunctionPanel extends IndirectRenderedPanel { ), ).value; this.controlPointsVertexBuffer = this.registerDisposer( - new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.controlPointsColorBuffer = this.registerDisposer( - new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.linePositionBuffer = this.registerDisposer( - new Buffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); } diff --git a/tests/kvstore/zip.spec.ts b/tests/kvstore/zip.spec.ts index ad20d07e10..640cf06398 100644 --- a/tests/kvstore/zip.spec.ts +++ b/tests/kvstore/zip.spec.ts @@ -42,7 +42,7 @@ function readAllUsingYauzl(zipPath: string) { return; } zipfile.on("entry", async (entry) => { - if (/\/$/.test(entry.fileName)) { + if (entry.fileName.endsWith("/")) { zipfile.readEntry(); return; } From 6b207e3f2cfb12246eb24557f743fe0fad4c6ebf Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sun, 19 Jan 2025 22:24:00 -0800 Subject: [PATCH 32/41] fix(precomputed): Fix annotation source Fixes https://github.com/google/neuroglancer/issues/697. --- src/datasource/precomputed/frontend.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index bf532e0bbb..69393aca7e 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -24,6 +24,7 @@ import { makeDataBoundsBoundingBoxAnnotationSet, parseAnnotationPropertySpecs, } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { BoundingBox, @@ -405,9 +406,12 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase declare key: any; metadata: AnnotationMetadata; declare OPTIONS: PrecomputedAnnotationSourceOptions; - constructor(options: PrecomputedAnnotationSourceOptions) { + constructor( + chunkManager: ChunkManager, + options: PrecomputedAnnotationSourceOptions, + ) { const { parameters } = options; - super(options.sharedKvStoreContext.chunkManager, { + super(chunkManager, { rank: parameters.rank, relationships: parameters.relationships.map((x) => x.name), properties: parameters.properties, From bdfd8dc3de3e14ebbd5380fb5b8d89aa696a409f Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Mon, 20 Jan 2025 11:16:04 -0800 Subject: [PATCH 33/41] chore(examples): Update example lockfiles --- examples/parcel/parcel-project-source/package-lock.json | 3 +++ examples/rsbuild/rsbuild-project-source/package-lock.json | 3 +++ examples/rspack/rspack-project-source/package-lock.json | 3 +++ examples/vite/vite-project-source/package-lock.json | 3 +++ examples/webpack/webpack-project-source/package-lock.json | 3 +++ 5 files changed, 15 insertions(+) diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index d948e32fbb..fa9f90d194 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -52,8 +52,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -61,6 +63,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json index 60f9b77745..26f3795879 100644 --- a/examples/rsbuild/rsbuild-project-source/package-lock.json +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -50,8 +50,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -59,6 +61,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json index 014e357e9d..e801f0dde5 100644 --- a/examples/rspack/rspack-project-source/package-lock.json +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -51,8 +51,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -60,6 +62,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index e163cabd93..2816c75a6d 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -50,8 +50,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -59,6 +61,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 1a2e108e58..4f42245835 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -56,8 +56,10 @@ "css-loader": "^7.1.2", "esbuild": "^0.24.2", "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", "eslint-rspack-plugin": "^4.2.1", "express": "^4.21.2", "glob": "^11.0.1", @@ -65,6 +67,7 @@ "jsdom": "^26.0.0", "msw": "^2.7.0", "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", "playwright": "^1.49.1", "prettier": "3.4.2", "s3rver": "^3.7.1", From 85231c0068f77a04fc2824b67422aba1083dd3df Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Mon, 20 Jan 2025 11:55:40 -0800 Subject: [PATCH 34/41] fix(kvstore/url): fix relative path handling This fixes issues with Neuroglancer precomputed sources at the root of a kvstore and with ".." relative path components. --- src/kvstore/url.ts | 6 ++++-- tests/kvstore/url.spec.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/kvstore/url.ts b/src/kvstore/url.ts index 89a29298b7..d2c863c631 100644 --- a/src/kvstore/url.ts +++ b/src/kvstore/url.ts @@ -174,10 +174,12 @@ export function resolveRelativePath(basePath: string, relativePath: string) { `Invalid relative path ${JSON.stringify(relativePath)} from base path ${JSON.stringify(origBasePath)}`, ); } - basePath = basePath.substring(0, prevSlash - 1); + basePath = basePath.substring(0, prevSlash); continue; } - basePath += "/"; + if (basePath !== "") { + basePath += "/"; + } basePath += component; } if (relativePath.endsWith("/")) { diff --git a/tests/kvstore/url.spec.ts b/tests/kvstore/url.spec.ts index db1981963f..be128500d1 100644 --- a/tests/kvstore/url.spec.ts +++ b/tests/kvstore/url.spec.ts @@ -21,6 +21,7 @@ import { parsePipelineUrlComponent, parseUrlSuffix, pipelineUrlJoin, + resolveRelativePath, } from "#src/kvstore/url.js"; describe("kvstoreEnsureDirectoryPipelineUrl", () => { @@ -180,3 +181,19 @@ describe("parseUrlSuffix", () => { `); }); }); + +describe("resolveRelativePath", () => { + test("empty base", () => { + expect(resolveRelativePath("", "a")).toEqual("a"); + expect(resolveRelativePath("", "a/")).toEqual("a/"); + expect(resolveRelativePath("", "")).toEqual(""); + expect(() => resolveRelativePath("", "..")).toThrowError( + /Invalid relative path/, + ); + }); + + test("non empty base", () => { + expect(resolveRelativePath("base/b", "../c")).toEqual("base/c"); + expect(resolveRelativePath("base/b", "../c/")).toEqual("base/c/"); + }); +}); From 90e8ace9900e01d1669d33b68c2054730bb78991 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Mon, 20 Jan 2025 20:32:15 -0800 Subject: [PATCH 35/41] fix(annotations): fix toggling of default annotation subsources In 93a57abde58328f36d0627bdff81a4cda8805c24 a bug was introduced that prevented default annotation subsources from rendering if they were enabled, then disabled, then enabled again. --- src/ui/annotations.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/annotations.ts b/src/ui/annotations.ts index 051b9a4e12..6744105eaf 100644 --- a/src/ui/annotations.ts +++ b/src/ui/annotations.ts @@ -2043,6 +2043,7 @@ export function UserLayerWithAnnotationsMixin< subsourceId: subsourceEntry.id, role, }); + this.annotationDisplayState.annotationProperties.value = []; this.addAnnotationLayerState(state, loadedSubsource); } From 82172998d7d963897609e74e90b401eced6c3c03 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 21 Jan 2025 14:28:50 -0800 Subject: [PATCH 36/41] fix(url): fix buggy url parsing in the case of s3: scheme Fixes https://github.com/google/neuroglancer/issues/699. --- src/kvstore/url.ts | 2 +- tests/kvstore/url.spec.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/kvstore/url.ts b/src/kvstore/url.ts index d2c863c631..83fdd78a00 100644 --- a/src/kvstore/url.ts +++ b/src/kvstore/url.ts @@ -16,7 +16,7 @@ export function kvstoreEnsureDirectoryPipelineUrl(url: string): string { const m = url.match( - /^((?:.*?|)?)([a-zA-Z][a-zA-Z0-9-+.]*)(?:(:[^?#|]*)((?:[?#][^|]*)?))?$/, + /^((?:.*?\|)?)([a-zA-Z][a-zA-Z0-9-+.]*)(?:(:[^?#|]*)((?:[?#][^|]*)?))?$/, ); if (m === null) { throw new Error(`Invalid URL: ${url}`); diff --git a/tests/kvstore/url.spec.ts b/tests/kvstore/url.spec.ts index be128500d1..1c4ad25fe8 100644 --- a/tests/kvstore/url.spec.ts +++ b/tests/kvstore/url.spec.ts @@ -54,6 +54,12 @@ describe("kvstoreEnsureDirectoryPipelineUrl", () => { "http://foo|zarr:", ); }); + + test("s3", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("s3://bucket/path")).toEqual( + "s3://bucket/path/", + ); + }); }); describe("pipelineUrlJoin", () => { From f3430586b43fa710fb1925e1130b92caf07fe2bd Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 22 Jan 2025 20:29:36 -0800 Subject: [PATCH 37/41] fix(precomputed): fix non-sharded annotation spatial index chunk URLs Fixes https://github.com/google/neuroglancer/issues/700. --- src/datasource/precomputed/backend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 1189847503..4bf3912530 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -753,7 +753,7 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete const { chunkGridPosition } = chunk; if (shardedKvStore === undefined) { const { kvStore } = this; - const path = `${kvStore.path}/${chunkGridPosition.join("_")}`; + const path = `${kvStore.path}${chunkGridPosition.join("_")}`; response = await kvStore.store.read(path, { signal }); } else { const { upperChunkBound } = this.spec; From 18da7fc6b3a6ed1547c91ded317083cff544eeb7 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 23 Jan 2025 09:07:21 -0800 Subject: [PATCH 38/41] fix(single_mesh): fix single_mesh data sources Fixes https://github.com/google/neuroglancer/issues/702. --- src/datasource/index.ts | 1 + src/datasource/obj/frontend.ts | 66 -------------------------- src/datasource/obj/register_default.ts | 4 +- src/datasource/vtk/frontend.ts | 65 ------------------------- src/datasource/vtk/register_default.ts | 4 +- src/single_mesh/frontend.ts | 48 +++++++++++++++++++ 6 files changed, 53 insertions(+), 135 deletions(-) delete mode 100644 src/datasource/obj/frontend.ts delete mode 100644 src/datasource/vtk/frontend.ts diff --git a/src/datasource/index.ts b/src/datasource/index.ts index 746dc22b36..98c048c728 100644 --- a/src/datasource/index.ts +++ b/src/datasource/index.ts @@ -402,6 +402,7 @@ export class DataSourceRegistry extends RefCounted { ): Promise { const redirectLog = new Set(); let url: string = options.url; + url = url.trim(); // Trim any trailing "|" characters. url = url.replace(/\|+$/, ""); let originalCanonicalUrl: string | undefined; diff --git a/src/datasource/obj/frontend.ts b/src/datasource/obj/frontend.ts deleted file mode 100644 index 19d2c6a8ce..0000000000 --- a/src/datasource/obj/frontend.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { - DataSource, - GetKvStoreBasedDataSourceOptions, - KvStoreBasedDataSourceProvider, -} from "#src/datasource/index.js"; -import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; -import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; - -export class ObjDataSource implements KvStoreBasedDataSourceProvider { - get scheme() { - return "obj"; - } - get description() { - return "Wavefront OBJ mesh"; - } - - get singleFile() { - return true; - } - - async get(options: GetKvStoreBasedDataSourceOptions): Promise { - ensureEmptyUrlSuffix(options.url); - const meshSource = await getSingleMeshSource( - options.registry.sharedKvStoreContext, - options.kvStoreUrl, - options, - ); - const modelSpace = makeCoordinateSpace({ - rank: 3, - names: ["x", "y", "z"], - units: ["m", "m", "m"], - scales: Float64Array.of(1e-9, 1e-9, 1e-9), - }); - const dataSource: DataSource = { - modelTransform: makeIdentityTransform(modelSpace), - subsources: [ - { - id: "default", - default: true, - subsource: { singleMesh: meshSource }, - }, - ], - }; - return dataSource; - } -} diff --git a/src/datasource/obj/register_default.ts b/src/datasource/obj/register_default.ts index 4e4e2832bd..b7a9b56ec3 100644 --- a/src/datasource/obj/register_default.ts +++ b/src/datasource/obj/register_default.ts @@ -19,8 +19,8 @@ import { registerProvider, } from "#src/datasource/default_provider.js"; import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -import { ObjDataSource } from "#src/datasource/obj/frontend.js"; +import { SingleMeshDataSource } from "#src/single_mesh/frontend.js"; -const provider = new ObjDataSource(); +const provider = new SingleMeshDataSource("obj", "Wavefront OBJ mesh"); registerKvStoreBasedDataProvider(provider); registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/datasource/vtk/frontend.ts b/src/datasource/vtk/frontend.ts deleted file mode 100644 index 824773c572..0000000000 --- a/src/datasource/vtk/frontend.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { - DataSource, - GetKvStoreBasedDataSourceOptions, - KvStoreBasedDataSourceProvider, -} from "#src/datasource/index.js"; -import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; -import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; - -export class VtkDataSource implements KvStoreBasedDataSourceProvider { - get scheme() { - return "vtk"; - } - get description() { - return "VTK mesh"; - } - get singleFile() { - return true; - } - - async get(options: GetKvStoreBasedDataSourceOptions): Promise { - ensureEmptyUrlSuffix(options.url); - const meshSource = await getSingleMeshSource( - options.registry.sharedKvStoreContext, - options.kvStoreUrl, - options, - ); - const modelSpace = makeCoordinateSpace({ - rank: 3, - names: ["x", "y", "z"], - units: ["m", "m", "m"], - scales: Float64Array.of(1e-9, 1e-9, 1e-9), - }); - const dataSource: DataSource = { - modelTransform: makeIdentityTransform(modelSpace), - subsources: [ - { - id: "default", - default: true, - subsource: { singleMesh: meshSource }, - }, - ], - }; - return dataSource; - } -} diff --git a/src/datasource/vtk/register_default.ts b/src/datasource/vtk/register_default.ts index e960750f7b..7bf980be94 100644 --- a/src/datasource/vtk/register_default.ts +++ b/src/datasource/vtk/register_default.ts @@ -19,8 +19,8 @@ import { registerProvider, } from "#src/datasource/default_provider.js"; import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -import { VtkDataSource } from "#src/datasource/vtk/frontend.js"; +import { SingleMeshDataSource } from "#src/single_mesh/frontend.js"; -const provider = new VtkDataSource(); +const provider = new SingleMeshDataSource("vtk", "VTK mesh"); registerKvStoreBasedDataProvider(provider); registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index ee15858ce2..babbb00987 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -85,6 +85,16 @@ import { TextureFormat, } from "#src/webgl/texture_access.js"; import { SharedObject } from "#src/worker_rpc.js"; +import type { + DataSource, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, +} from "#src/datasource/index.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; +import { + makeCoordinateSpace, + makeIdentityTransform, +} from "#src/coordinate_transform.js"; const DEFAULT_FRAGMENT_MAIN = `void main() { emitGray(); @@ -681,3 +691,41 @@ export async function getSingleMeshSource( parameters: { meshSourceUrl: url, info }, }); } + +export class SingleMeshDataSource implements KvStoreBasedDataSourceProvider { + constructor( + public scheme: string, + public description: string, + ) {} + + get singleFile() { + return true; + } + + async get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); + const meshSource = await getSingleMeshSource( + options.registry.sharedKvStoreContext, + `${options.url.scheme}://${options.kvStoreUrl}`, + options, + ); + const modelSpace = makeCoordinateSpace({ + rank: 3, + names: ["x", "y", "z"], + units: ["m", "m", "m"], + scales: Float64Array.of(1e-9, 1e-9, 1e-9), + }); + const dataSource: DataSource = { + canonicalUrl: `${options.kvStoreUrl}|${options.url.scheme}:`, + modelTransform: makeIdentityTransform(modelSpace), + subsources: [ + { + id: "default", + default: true, + subsource: { singleMesh: meshSource }, + }, + ], + }; + return dataSource; + } +} From 5a54a489ed3fd679a5beae9906338c602371a9fa Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 23 Jan 2025 10:06:23 -0800 Subject: [PATCH 39/41] fix(sliceview): fix reuse of rpc message objects Previously, sliceview/frontend.ts reused the same message object for multiple worker RPC calls. When the code was originally written, that was fine (although still not likely to be helpful for performance or readability) because all messages were sent immediately (which involved structurally cloning the object). However, 2cdc1f3131d9a157a066c1ce02cdab0f977e7e85 introduced a queue of messages used while waiting for the chunk worker to initialize, which made this message object reuse problematic. Fixes https://github.com/google/neuroglancer/issues/701. --- src/sliceview/frontend.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index 18c6ee50d7..4cd15754fd 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -413,7 +413,6 @@ export class SliceView extends Base { const { visibleLayers, visibleLayerList } = this; const { displayDimensionRenderInfo } = this.projectionParameters.value; const rpc = this.rpc!; - const rpcMessage: any = { id: this.rpcId }; let changed = false; visibleLayerList.length = 0; for (const renderLayer of this.layerManager.readyRenderLayers()) { @@ -454,20 +453,22 @@ export class SliceView extends Base { layerInfo.displayDimensionRenderInfo = displayDimensionRenderInfo; layerInfo.transformGeneration = curTransformGeneration; } - rpcMessage.layerId = renderLayer.rpcId; - rpcMessage.sources = serializeAllTransformedSources( - layerInfo.allSources, - ); - rpcMessage.displayDimensionRenderInfo = displayDimensionRenderInfo; this.flushBackendProjectionParameters(); - rpc.invoke(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, rpcMessage); + rpc.invoke(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, { + id: this.rpcId, + layerId: renderLayer.rpcId, + sources: serializeAllTransformedSources(layerInfo.allSources), + displayDimensionRenderInfo: displayDimensionRenderInfo, + }); changed = true; } } for (const [renderLayer, layerInfo] of visibleLayers) { if (layerInfo.lastSeenGeneration === curUpdateGeneration) continue; - rpcMessage.layerId = renderLayer.rpcId; - rpc.invoke(SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, rpcMessage); + rpc.invoke(SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, { + id: this.rpcId, + layerId: renderLayer.rpcId, + }); visibleLayers.delete(renderLayer); disposeTransformedSources(renderLayer, layerInfo.allSources); invokeDisposers(layerInfo.disposers); From 6f9335f1f2560d67f7c40378206414a7493c0c73 Mon Sep 17 00:00:00 2001 From: Vincent Aranega Date: Thu, 23 Jan 2025 22:54:32 -0600 Subject: [PATCH 40/41] Add missing event handler for position plot when rendered as tool in a palette (#690) --- src/widget/position_widget.ts | 57 ++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 79f324d2ba..0e97096ac7 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -84,6 +84,7 @@ import { EnumSelectWidget } from "#src/widget/enum_widget.js"; import { makeIcon } from "#src/widget/icon.js"; import { NumberInputWidget } from "#src/widget/number_input_widget.js"; import { PositionPlot } from "#src/widget/position_plot.js"; +import { EventAction } from "#src/util/event_action_map.js"; export const positionDragType = "neuroglancer-position"; @@ -1380,6 +1381,28 @@ class DimensionTool extends Tool { return this.viewer.coordinateSpaceCombiner.combined; } + private adjustDimensionHandler( + actionEvent: ActionEvent, + positionWidget: PositionWidget, + ) { + actionEvent.stopPropagation(); + const event = actionEvent.detail; + const { deltaY } = event; + if (deltaY === 0) { + return; + } + positionWidget.adjustDimensionPosition(this.dimensionId, Math.sign(deltaY)); + } + + private adjustVelocityHandler( + actionEvent: ActionEvent, + viewer: SupportsDimensionTool, + ) { + actionEvent.stopPropagation(); + const factor = getWheelZoomAmount(actionEvent.detail); + viewer.velocity.multiplyVelocity(this.dimensionId, factor); + } + activate(activation: ToolActivation) { const { viewer } = this; const { content } = makeToolActivationStatusMessage(activation); @@ -1391,26 +1414,11 @@ class DimensionTool extends Tool { activation.bindInputEventMap(TOOL_INPUT_EVENT_MAP); activation.bindAction( "adjust-position-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const event = actionEvent.detail; - const { deltaY } = event; - if (deltaY === 0) { - return; - } - positionWidget.adjustDimensionPosition( - this.dimensionId, - Math.sign(deltaY), - ); - }, + (actionEvent) => this.adjustDimensionHandler(actionEvent, positionWidget), ); activation.bindAction( "adjust-velocity-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const factor = getWheelZoomAmount(actionEvent.detail); - viewer.velocity.multiplyVelocity(this.dimensionId, factor); - }, + (actionEvent) => this.adjustVelocityHandler(actionEvent, viewer), ); activation.bindAction("toggle-playback", (event) => { event.stopPropagation(); @@ -1557,6 +1565,21 @@ class DimensionTool extends Tool { }), ).element, ); + + this.registerDisposer(new MouseEventBinder(plot.element, inputEventMap)); + + registerActionListener( + plot.element, + "adjust-via-wheel", + (actionEvent) => this.adjustDimensionHandler(actionEvent, positionWidget), + ); + + registerActionListener( + plot.element, + "adjust-velocity-via-wheel", + (actionEvent) => this.adjustVelocityHandler(actionEvent, viewer), + ); + return { positionWidget }; } From b08a82a3f08e31bc65e09664f6081712ab1a9e29 Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 24 Jan 2025 13:08:33 -0500 Subject: [PATCH 41/41] Merge upstream changes to linc neuroglancer --- src/widget/position_widget.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 0e97096ac7..e985b8fdaa 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -84,7 +84,6 @@ import { EnumSelectWidget } from "#src/widget/enum_widget.js"; import { makeIcon } from "#src/widget/icon.js"; import { NumberInputWidget } from "#src/widget/number_input_widget.js"; import { PositionPlot } from "#src/widget/position_plot.js"; -import { EventAction } from "#src/util/event_action_map.js"; export const positionDragType = "neuroglancer-position";