diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..f9b0c516 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +rustflags = ["--cfg=web_sys_unstable_apis"] + +[target.wasm32-unknown-unknown] +rustflags = ["--cfg=web_sys_unstable_apis"] \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 66ee797a..52882daa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,6 +224,9 @@ name = "arrow-schema" version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54df8c47918eb634c20e29286e69494fdc20cafa5173eb6dad49c7f6acece733" +dependencies = [ + "bitflags 2.3.3", +] [[package]] name = "arrow-select" @@ -280,6 +283,114 @@ dependencies = [ "streaming-iterator", ] +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compat" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b48b4ff0c2026db683dea961cd8ea874737f56cffca86fa84415eaddc51c00d" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -302,6 +413,12 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + [[package]] name = "async-trait" version = "0.1.72" @@ -313,13 +430,19 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "atomic-waker" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" + [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -357,6 +480,27 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "blocking" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "log", +] + [[package]] name = "brotli" version = "3.3.4" @@ -451,7 +595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -483,6 +627,15 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -530,6 +683,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -557,25 +719,61 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "errno" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "ethnum" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0198b9d0078e0f30dedc7acbb21c974e838fc8fae3ee170128658a98cb2c1c04" +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fallible-streaming-iterator" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "flatbuffers" version = "23.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640" dependencies = [ - "bitflags", + "bitflags 1.3.2", "rustc_version", ] @@ -658,6 +856,21 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "futures-macro" version = "0.3.28" @@ -718,6 +931,18 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "h2" version = "0.3.20" @@ -781,6 +1006,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + [[package]] name = "http" version = "0.2.9" @@ -882,12 +1113,32 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "integer-encoding" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.2", + "libc", + "windows-sys", +] + [[package]] name = "ipnet" version = "2.8.0" @@ -918,6 +1169,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lexical-core" version = "0.8.5" @@ -994,11 +1254,20 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "log" version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +dependencies = [ + "value-bag", +] [[package]] name = "lz4_flex" @@ -1148,6 +1417,12 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + [[package]] name = "parquet" version = "45.0.0" @@ -1167,6 +1442,7 @@ dependencies = [ "bytes", "chrono", "flate2", + "futures", "hashbrown 0.14.0", "num", "num-bigint", @@ -1174,6 +1450,7 @@ dependencies = [ "seq-macro", "snap", "thrift", + "tokio", "twox-hash", "zstd", ] @@ -1194,6 +1471,8 @@ version = "0.4.0-beta.5" dependencies = [ "arrow", "arrow2", + "async-compat", + "async-std", "bytes", "clap", "console_error_panic_hook", @@ -1264,6 +1543,22 @@ dependencies = [ "array-init-cursor", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1399,6 +1694,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "ryu" version = "1.0.15" @@ -1640,9 +1949,21 @@ dependencies = [ "mio", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys", ] +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "tokio-util" version = "0.7.8" @@ -1731,12 +2052,24 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "value-bag" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "want" version = "0.3.1" diff --git a/Cargo.toml b/Cargo.toml index d3d1f5e6..b94060af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,8 @@ async = [ "dep:futures", "dep:range-reader", "dep:reqwest", + "dep:async-compat", + "dep:async-std" ] debug = ["console_error_panic_hook", "clap"] @@ -75,10 +77,12 @@ parquet2 = { version = "0.17", default_features = false, optional = true } arrow = { version = "45.0", default-features = false, optional = true, features = [ "ipc", + "ffi", ] } parquet = { version = "45.0", default-features = false, optional = true, features = [ "arrow", "base64", + "async" ] } bytes = { version = "1", optional = true } @@ -91,12 +95,13 @@ wasm-bindgen-futures = { version = "0.4.30", optional = true } futures = { version = "0.3", optional = true } range-reader = { version = "0.2", optional = true } reqwest = { version = "0.11.12", optional = true, default-features = false } - +async-compat = { version = "0.2.1", optional = true} # Pass "wasm" and "thin" down to the transitive zstd dependency zstd = { version = "*", features = ["wasm", "thin"], default-features = false, optional = true } +async-std = { version = "1.12.0", optional = true } [dependencies.web-sys] -version = "0.3.4" +version = "0.3.6" features = [ 'console', 'Headers', @@ -107,6 +112,8 @@ features = [ 'Window', "Document", "Element", + "ReadableStream", + "ReadableStreamDefaultController" ] [dev-dependencies] diff --git a/package.json b/package.json index 7858411d..cca0dfe4 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,12 @@ "test": "ts-node node_modules/tape/bin/tape ./tests/js/index.ts" }, "devDependencies": { + "@fastify/static": "^6.10.2", "@types/node": "^17.0.21", "@types/tape": "^4.13.2", "apache-arrow": "^7.0.0", "benny": "^3.7.1", + "fastify": "^4.21.0", "gh-pages": "^3.2.3", "tape": "^5.5.2", "ts-node": "^10.7.0", diff --git a/scripts/build.sh b/scripts/build.sh old mode 100644 new mode 100755 index c3ae7f28..dd899208 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -19,6 +19,7 @@ wasm-pack build \ --out-dir tmp_build/node \ --out-name arrow1 \ --target nodejs \ + --features async \ $FLAGS # Build web version into tmp_build/esm @@ -28,6 +29,7 @@ wasm-pack build \ --out-dir tmp_build/esm \ --out-name arrow1 \ --target web \ + --features async \ $FLAGS # Build bundler version into tmp_build/bundler @@ -37,6 +39,7 @@ wasm-pack build \ --out-dir tmp_build/bundler \ --out-name arrow1 \ --target bundler \ + --features async \ $FLAGS ###################################### diff --git a/src/arrow1/error.rs b/src/arrow1/error.rs index 1c739df6..20c4bc39 100644 --- a/src/arrow1/error.rs +++ b/src/arrow1/error.rs @@ -10,6 +10,10 @@ pub enum ParquetWasmError { #[error(transparent)] ParquetError(Box), + + #[cfg(feature = "async")] + #[error("HTTP error: `{0}`")] + HTTPError(Box), } pub type Result = std::result::Result; @@ -26,3 +30,10 @@ impl From for ParquetWasmError { Self::ParquetError(Box::new(err)) } } + +#[cfg(feature = "async")] +impl From for ParquetWasmError { + fn from(err: reqwest::Error) -> Self { + Self::HTTPError(Box::new(err)) + } +} diff --git a/src/arrow1/ffi.rs b/src/arrow1/ffi.rs new file mode 100644 index 00000000..d7dfca35 --- /dev/null +++ b/src/arrow1/ffi.rs @@ -0,0 +1,197 @@ +use std::sync::Arc; + +use arrow::array::{make_array, Array}; +use arrow::datatypes::{Field, Schema, DataType}; +use arrow::ffi::{self, from_ffi, to_ffi}; +use arrow::record_batch::RecordBatch; +use wasm_bindgen::prelude::*; + +use crate::arrow1::error::Result; + +/// Wrapper around an ArrowArray FFI struct in Wasm memory. +#[wasm_bindgen] +pub struct FFIArrowArray(Box); + +#[wasm_bindgen] +impl FFIArrowArray { + #[wasm_bindgen] + pub fn addr(&self) -> *const ffi::FFI_ArrowArray { + self.0.as_ref() as *const _ + } + + #[wasm_bindgen] + pub fn free(self) { + drop(self.0) + } + + #[wasm_bindgen] + pub fn drop(self) { + drop(self.0) + } +} + +/// Wrapper around an ArrowSchema FFI struct in Wasm memory. +#[wasm_bindgen] +pub struct FFIArrowField(Box); + +#[wasm_bindgen] +impl FFIArrowField { + #[wasm_bindgen] + pub fn addr(&self) -> *const ffi::FFI_ArrowSchema { + self.0.as_ref() as *const _ + } +} + +impl From<&Field> for FFIArrowField { + fn from(value: &Field) -> Self { + todo!() + } +} + +/// Wrapper around a collection of FFI ArrowSchema structs in Wasm memory +#[wasm_bindgen] +pub struct FFIArrowSchema(Vec); + +#[wasm_bindgen] +impl FFIArrowSchema { + /// The number of fields in this schema + #[wasm_bindgen] + pub fn length(&self) -> usize { + self.0.len() + } + + #[wasm_bindgen] + pub fn addr(&self, i: usize) -> *const ffi::FFI_ArrowSchema { + self.0.get(i).unwrap().addr() + } +} + +impl From<&Schema> for FFIArrowSchema { + fn from(value: &Schema) -> Self { + for field in value.fields.into_iter() {} + todo!() + } +} + +/// Wrapper to represent an Arrow Chunk in Wasm memory, e.g. a collection of FFI ArrowArray +/// structs +#[wasm_bindgen] +pub struct FFIArrowRecordBatch { + arrays: Vec, + schema: FFIArrowSchema, +} + +#[wasm_bindgen] +impl FFIArrowRecordBatch { + /// The number of columns in this record batch. + #[wasm_bindgen(js_name = numColumns)] + pub fn num_columns(&self) -> usize { + self.arrays.len() + } + + /// Get the number of Fields in the table schema + #[wasm_bindgen(js_name = schemaLength)] + pub fn schema_length(&self) -> usize { + self.schema.length() + } + + /// Get the pointer to one ArrowSchema FFI struct + /// @param i number the index of the field in the schema to use + #[wasm_bindgen(js_name = schemaAddr)] + pub fn schema_addr(&self, i: usize) -> *const ffi::FFI_ArrowSchema { + self.schema.addr(i) + } + + /// Get the pointer to one ArrowArray FFI struct for a given chunk index and column index + /// @param column number The column index to use + /// @returns number pointer to an ArrowArray FFI struct in Wasm memory + #[wasm_bindgen(js_name = arrayAddr)] + pub fn array_addr(&self, column: usize) -> *const ffi::FFI_ArrowArray { + self.arrays[column].addr() + } +} + +impl From for FFIArrowRecordBatch { + fn from(value: RecordBatch) -> Self { + let mut arrays = Vec::with_capacity(value.num_columns()); + let mut fields = Vec::with_capacity(value.num_columns()); + + for column in value.columns() { + let data = column.to_data(); + let (out_array, out_schema) = to_ffi(&data).unwrap(); + arrays.push(FFIArrowArray(Box::new(out_array))); + fields.push(FFIArrowField(Box::new(out_schema))); + } + + Self { + arrays, + schema: FFIArrowSchema(fields), + } + } +} + +impl From for RecordBatch { + fn from(value: FFIArrowRecordBatch) -> Self { + let mut columns = Vec::with_capacity(value.schema_length()); + let mut fields = Vec::with_capacity(value.schema_length()); + for (array, schema) in value.arrays.into_iter().zip(value.schema.0.into_iter()) { + let array = make_array(from_ffi(*array.0, &schema.0).unwrap()); + let name = schema.0.name(); + let data_type = DataType::try_from(schema.0.as_ref()).unwrap(); + let nullable = schema.0.nullable(); + columns.push(array); + fields.push(Field::new(name, data_type, nullable)) + } + + let x = RecordBatch::try_new(Arc::new(Schema::new(fields)), columns); + // RecordBatch::n + + todo!() + } +} + +/// Wrapper around an Arrow Table in Wasm memory (a list of FFI ArrowSchema structs plus a list of +/// lists of ArrowArray FFI structs.) +#[wasm_bindgen] +pub struct FFIArrowTable(Vec); + +impl From> for FFIArrowTable { + fn from(value: Vec) -> Self { + let mut batches = Vec::with_capacity(value.len()); + for batch in value { + batches.push(batch.into()); + } + Self(batches) + } +} + +#[wasm_bindgen] +impl FFIArrowTable { + // TODO: access to +} + +impl From> for FFIArrowTable { + fn from(batches: Vec) -> Self { + Self {0: batches} + } +} + +impl FFIArrowTable { + pub fn from_iterator(value: impl IntoIterator) -> Self { + let mut batches = vec![]; + for batch in value.into_iter() { + batches.push(batch.into()); + } + Self(batches) + } + + pub fn try_from_iterator( + value: impl IntoIterator>, + ) -> Result { + let mut batches = vec![]; + for batch in value.into_iter() { + batches.push(batch?.into()); + } + Ok(Self(batches)) + } +} diff --git a/src/arrow1/mod.rs b/src/arrow1/mod.rs index 0ad50435..2963bba3 100644 --- a/src/arrow1/mod.rs +++ b/src/arrow1/mod.rs @@ -1,6 +1,9 @@ #[cfg(feature = "reader")] pub mod reader; +#[cfg(feature = "reader")] +pub mod ffi; + pub mod wasm; #[cfg(feature = "writer")] @@ -10,3 +13,6 @@ pub mod writer; pub mod writer_properties; pub mod error; + +#[cfg(all(feature = "reader", feature = "async"))] +pub mod reader_async; diff --git a/src/arrow1/reader.rs b/src/arrow1/reader.rs index c64e0dbe..5497a9d4 100644 --- a/src/arrow1/reader.rs +++ b/src/arrow1/reader.rs @@ -1,4 +1,5 @@ use crate::arrow1::error::Result; +use crate::arrow1::ffi::FFIArrowTable; use arrow::ipc::writer::StreamWriter; use bytes::Bytes; use parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder; @@ -32,3 +33,14 @@ pub fn read_parquet(parquet_file: Vec) -> Result> { // the latter seems likely to incur an extra copy of the vec Ok(output_file) } + +pub fn read_parquet_ffi(parquet_file: Vec) -> Result { + // Create Parquet reader + let cursor: Bytes = parquet_file.into(); + let builder = ParquetRecordBatchReaderBuilder::try_new(cursor).unwrap(); + + // Create Arrow reader + let reader = builder.build().unwrap(); + + FFIArrowTable::try_from_iterator(reader) +} diff --git a/src/arrow1/reader_async.rs b/src/arrow1/reader_async.rs new file mode 100644 index 00000000..2ebc8ae0 --- /dev/null +++ b/src/arrow1/reader_async.rs @@ -0,0 +1,120 @@ +use std::sync::Arc; + +use crate::arrow1::error::Result; +use crate::common::fetch::{create_reader, get_content_length}; + +use arrow::ipc::writer::StreamWriter; +use futures::stream::{Stream, StreamExt}; +use parquet::arrow::async_reader::{ParquetRecordBatchStream, ParquetRecordBatchStreamBuilder}; + +use async_compat::{Compat, CompatExt}; +use parquet::file::metadata::FileMetaData; +use range_reader::RangedAsyncReader; + +pub async fn read_metadata_async( + url: String, + content_length: Option, +) -> Result { + let content_length = match content_length { + Some(content_length) => content_length, + None => get_content_length(url.clone()).await?, + }; + let reader = create_reader(url, content_length, None); + let builder = ParquetRecordBatchStreamBuilder::new(reader.compat()).await?; + let meta = builder.metadata().file_metadata().clone(); + Ok(meta) +} + +pub async fn _read_row_group( + url: String, + content_length: Option, + row_group: usize, +) -> Result<( + ParquetRecordBatchStream>, + Arc, +)> { + let content_length = match content_length { + Some(content_length) => content_length, + None => get_content_length(url.clone()).await?, + }; + let reader = create_reader(url, content_length, None); + let builder = ParquetRecordBatchStreamBuilder::new(reader.compat()).await?; + let arrow_schema = builder.schema().clone(); + let parquet_reader = builder.with_row_groups(vec![row_group]).build()?; + Ok((parquet_reader, arrow_schema)) +} + +pub async fn read_row_group( + url: String, + content_length: Option, + row_group: usize, +) -> Result> { + let (mut parquet_reader, arrow_schema) = + _read_row_group(url, content_length, row_group).await?; + // Create IPC Writer + let mut output_file = Vec::new(); + { + let mut writer = StreamWriter::try_new(&mut output_file, &arrow_schema)?; + while let Some(maybe_record_batch) = parquet_reader.next().await { + let record_batch = maybe_record_batch?; + writer.write(&record_batch)?; + } + writer.finish()?; + } + Ok(output_file) +} + +pub async fn read_parquet(url: String) -> Result> { + let length = get_content_length(url.clone()).await?; + let reader = create_reader(url, length, None); + let builder = ParquetRecordBatchStreamBuilder::new(reader.compat()).await?; + // quite a few options here - projection masks, row group subselection, etc... + let arrow_schema = builder.schema().clone(); + let parquet_reader = builder.build()?; + let intermediate: Vec<_> = parquet_reader.collect().await; + // Create IPC Writer + let mut output_file = Vec::new(); + { + let mut writer = StreamWriter::try_new(&mut output_file, &arrow_schema)?; + + // Iterate over record batches, writing them to IPC stream + for maybe_record_batch in intermediate { + let record_batch = maybe_record_batch?; + writer.write(&record_batch)?; + } + writer.finish()?; + } + + Ok(output_file) +} +pub type BoxedVecStream = + Box, std::io::Error>> + Unpin + Send>; +pub async fn read_parquet_stream(url: String, content_length: usize) -> Result { + let reader = create_reader(url, content_length, None); + let builder = ParquetRecordBatchStreamBuilder::new(reader.compat()).await?; + let arrow_schema = builder.schema().clone(); + let parquet_reader = builder.build()?; + // preferred flow: fetch -> parquet reader stream -> ipc writer sink -> ReadableStream sink + Ok(Box::new(parquet_reader.map(move |maybe_record_batch| { + let record_batch = maybe_record_batch.unwrap(); + let mut intermediate_vec = Vec::new(); + { + let mut writer = StreamWriter::try_new(&mut intermediate_vec, &arrow_schema).unwrap(); + let _ = writer.write(&record_batch); + // writer.close(); + } + Ok::, std::io::Error>(intermediate_vec) + }))) +} + +pub type BoxedFFIStream = Box + Unpin + Send>; +pub async fn read_ffi_stream(url: String, content_length: usize) -> Result { + let reader = create_reader(url, content_length, None); + let builder = ParquetRecordBatchStreamBuilder::new(reader.compat()).await?; + let parquet_reader = builder.build()?; + let stream = parquet_reader.map(|maybe_record_batch| { + let record_batch = maybe_record_batch.unwrap(); + super::ffi::FFIArrowRecordBatch::from(record_batch) + }); + Ok(Box::new(stream)) +} \ No newline at end of file diff --git a/src/arrow1/wasm.rs b/src/arrow1/wasm.rs index 0bad3fa1..91ab1596 100644 --- a/src/arrow1/wasm.rs +++ b/src/arrow1/wasm.rs @@ -1,7 +1,14 @@ +use std::cell::RefCell; +use std::rc::Rc; + use crate::arrow1::error::WasmResult; -use crate::utils::assert_parquet_file_not_empty; +use crate::utils::{assert_parquet_file_not_empty, copy_vec_to_uint8_array}; +use js_sys::{Object, Uint8Array}; +use std::io::Write; use wasm_bindgen::prelude::*; +use super::ffi::FFIArrowRecordBatch; + /// Read a Parquet file into Arrow data using the [`arrow`](https://crates.io/crates/arrow) and /// [`parquet`](https://crates.io/crates/parquet) Rust crates. /// @@ -66,3 +73,133 @@ pub fn write_parquet( writer_props, )?) } + +#[wasm_bindgen(js_name = readParquetAsync)] +#[cfg(all(feature = "reader", feature = "async"))] +pub async fn read_parquet_async(url: String) -> WasmResult { + let buffer = crate::arrow1::reader_async::read_parquet(url).await?; + copy_vec_to_uint8_array(&buffer) +} +#[wasm_bindgen(js_name = "ParquetReader")] +#[cfg(all(feature = "reader", feature = "async"))] +#[derive(Clone)] +pub struct JsParquetReader { + url: String, + content_length: Option, + _stream: Option>>, +} + +#[wasm_bindgen(js_class = "ParquetReader")] +#[cfg(all(feature = "reader", feature = "async"))] +impl JsParquetReader { + #[wasm_bindgen(constructor)] + pub fn new(url: String, content_length: u32) -> Self { + Self { + url, + content_length: Some(content_length), + _stream: None, + } + } + + pub async fn pull( + &mut self, + controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + use crate::common::stream::ReadableStreamSink; + use futures::StreamExt; + // store a mutable stream ref on this struct. + // in theory, we could just dispense with polling at all and offload + // the scheduling problem on the consuming context. + // However, it is generally a good idea to enqueue as many items as the sink + // is willing to accept. + // Both approaches involve crossing the JS-WASM boundary, how many though? + // Start push with backpressure: 1 per chunk (enqueue) + 1-2 per timer. + // At least 1 timer per highwater mark. + // Pull (with restraint): 1 per enqueue (which can be equal to the highwater mark) + + // 1 per pull. + let mut unwrapped_stream = self._stream.as_deref().unwrap().lock().await; + let desired_count = controller.desired_size().unwrap() as u32; + let mut wrapped_controller = ReadableStreamSink::from(controller); + for _ in 0..desired_count { + let chunk = unwrapped_stream.next().await; + if let Some(Ok(chunk)) = chunk { + let _ = wrapped_controller.write(&chunk); + } else { + wrapped_controller.close(); + } + } + Ok(true) + } + pub async fn start( + &mut self, + _controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + use crate::arrow1::reader_async::read_parquet_stream; + let content_length = usize::try_from(self.content_length.unwrap()).unwrap(); + let intermediate_stream = read_parquet_stream(self.url.clone(), content_length).await?; + self._stream = Some(Rc::new(futures::lock::Mutex::new(intermediate_stream))); + Ok(true) + } + pub async fn cancel(&mut self, _controller: web_sys::ReadableStreamDefaultController) {} + + pub fn stream(&self) -> web_sys::ReadableStream { + let wrapper: Object = Into::::into(self.clone()).into(); + + web_sys::ReadableStream::new_with_underlying_source(&wrapper).unwrap() + } +} +#[wasm_bindgen(js_name = "FFIStreamReader")] +#[cfg(all(feature = "reader", feature = "async"))] +#[derive(Clone)] +pub struct JsFFIStreamReader { + url: String, + content_length: Option, + _stream: Option>>, +} +#[wasm_bindgen(js_class = "FFIStreamReader")] +#[cfg(all(feature = "reader", feature = "async"))] +impl JsFFIStreamReader { + #[wasm_bindgen(constructor)] + pub fn new(url: String, content_length: u32) -> Self { + Self { + url, + content_length: Some(content_length), + _stream: None, + } + } + + pub async fn pull( + &mut self, + controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + use futures::StreamExt; + let mut unwrapped_stream = self._stream.as_deref().unwrap().lock().await; + let desired_count = controller.desired_size().unwrap() as u32; + for _ in 0..desired_count { + let chunk = unwrapped_stream.next().await; + if let Some(chunk) = chunk { + let _ = controller.enqueue_with_chunk(&chunk.into()); + } else { + let _ = controller.close(); + } + } + Ok(true) + } + pub async fn start( + &mut self, + _controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + use crate::arrow1::reader_async::read_ffi_stream; + let content_length = usize::try_from(self.content_length.unwrap()).unwrap(); + let intermediate_stream = read_ffi_stream(self.url.clone(), content_length).await?; + self._stream = Some(Rc::new(futures::lock::Mutex::new(intermediate_stream))); + Ok(true) + } + pub async fn cancel(&mut self, _controller: web_sys::ReadableStreamDefaultController) {} + + pub fn stream(&self) -> web_sys::ReadableStream { + let wrapper: Object = Into::::into(self.clone()).into(); + + web_sys::ReadableStream::new_with_underlying_source(&wrapper).unwrap() + } +} \ No newline at end of file diff --git a/src/arrow1/writer_properties.rs b/src/arrow1/writer_properties.rs index 460f83f9..499a28e5 100644 --- a/src/arrow1/writer_properties.rs +++ b/src/arrow1/writer_properties.rs @@ -1,5 +1,4 @@ use crate::common::writer_properties::{Compression, Encoding, WriterVersion}; -use parquet::basic::{BrotliLevel, GzipLevel, ZstdLevel}; use wasm_bindgen::prelude::*; impl From for parquet::basic::Encoding { @@ -23,10 +22,10 @@ impl From for parquet::basic::Compression { match x { Compression::UNCOMPRESSED => parquet::basic::Compression::UNCOMPRESSED, Compression::SNAPPY => parquet::basic::Compression::SNAPPY, - Compression::GZIP => parquet::basic::Compression::GZIP(GzipLevel::default()), - Compression::BROTLI => parquet::basic::Compression::BROTLI(BrotliLevel::default()), + Compression::GZIP => parquet::basic::Compression::GZIP(Default::default()), + Compression::BROTLI => parquet::basic::Compression::BROTLI(Default::default()), Compression::LZ4 => parquet::basic::Compression::LZ4, - Compression::ZSTD => parquet::basic::Compression::ZSTD(ZstdLevel::default()), + Compression::ZSTD => parquet::basic::Compression::ZSTD(Default::default()), // TODO: fix this. Though LZ4 isn't supported in arrow1 for wasm anyways Compression::LZ4_RAW => parquet::basic::Compression::LZ4, } diff --git a/src/arrow2/ffi.rs b/src/arrow2/ffi.rs index 4c00a021..76668eac 100644 --- a/src/arrow2/ffi.rs +++ b/src/arrow2/ffi.rs @@ -153,7 +153,7 @@ impl FFIArrowSchema { } } -/// Wrapper around an Arrow Table in Wasm memory (a lisjst of FFI ArrowSchema structs plus a list of +/// Wrapper around an Arrow Table in Wasm memory (a list of FFI ArrowSchema structs plus a list of /// lists of ArrowArray FFI structs.) #[wasm_bindgen] pub struct FFIArrowTable { diff --git a/src/arrow2/reader_async.rs b/src/arrow2/reader_async.rs index e7875233..22b9501d 100644 --- a/src/arrow2/reader_async.rs +++ b/src/arrow2/reader_async.rs @@ -1,6 +1,6 @@ use crate::arrow2::error::ParquetWasmError; use crate::arrow2::error::Result; -use crate::common::fetch::{get_content_length, make_range_request}; +use crate::common::fetch::{create_reader, get_content_length}; use arrow2::array::Array; use arrow2::chunk::Chunk; use arrow2::datatypes::Schema; @@ -10,38 +10,13 @@ use arrow2::io::parquet::read::RowGroupMetaData; use arrow2::io::parquet::read::{read_columns_many_async, RowGroupDeserializer}; use futures::future::BoxFuture; use parquet2::read::read_metadata_async as _read_metadata_async; -use range_reader::{RangeOutput, RangedAsyncReader}; - -/// Create a RangedAsyncReader -fn create_reader( - url: String, - content_length: usize, - min_request_size: Option, -) -> RangedAsyncReader { - // at least 4kb per s3 request. Adjust to your liking. - let min_request_size = min_request_size.unwrap_or(4 * 1024); - - // Closure for making an individual HTTP range request to a file - let range_get = Box::new(move |start: u64, length: usize| { - let url = url.clone(); - - Box::pin(async move { - let data = make_range_request(url.clone(), start, length) - .await - .unwrap(); - Ok(RangeOutput { start, data }) - }) as BoxFuture<'static, std::io::Result> - }); - - RangedAsyncReader::new(content_length, min_request_size, range_get) -} pub async fn read_metadata_async( url: String, content_length: Option, ) -> Result { let content_length = match content_length { - Some(_content_length) => _content_length, + Some(content_length) => content_length, None => get_content_length(url.clone()).await?, }; @@ -60,13 +35,16 @@ fn all_elements_equal(arr: &[&Option]) -> bool { arr.iter().all(|&item| item == first) } -pub async fn read_row_group( +pub async fn _read_row_group( url: String, - // content_length: Option, + content_length: Option, row_group_meta: &RowGroupMetaData, arrow_schema: &Schema, - chunk_fn: impl Fn(Chunk>) -> Chunk>, -) -> Result> { +) -> Result { + let content_length = match content_length { + Some(_content_length) => _content_length, + None => get_content_length(url.clone()).await?, + }; // Extract the file paths from each underlying column let file_paths: Vec<&Option> = row_group_meta .columns() @@ -92,14 +70,17 @@ pub async fn read_row_group( }; // Note: for simplicity requesting the content length with a HEAD request always. - let content_length = get_content_length(url.clone()).await.unwrap(); let reader_factory = || { Box::pin(futures::future::ready(Ok(create_reader( url.clone(), content_length, None, - )))) as BoxFuture<'static, std::result::Result> + )))) + as BoxFuture< + 'static, + std::result::Result, + > }; // no chunk size in deserializing @@ -117,13 +98,23 @@ pub async fn read_row_group( ) .await?; + let deserializer = RowGroupDeserializer::new(column_chunks, row_group_meta.num_rows(), None); + Ok(deserializer) +} + +pub async fn read_row_group( + url: String, + content_length: Option, + row_group_meta: &RowGroupMetaData, + arrow_schema: &Schema, + chunk_fn: impl Fn(Chunk>) -> Chunk>, +) -> Result> { // Create IPC writer let mut output_file = Vec::new(); let options = IPCWriteOptions { compression: None }; let mut writer = IPCStreamWriter::new(&mut output_file, options); writer.start(arrow_schema, None)?; - - let deserializer = RowGroupDeserializer::new(column_chunks, row_group_meta.num_rows(), None); + let deserializer = _read_row_group(url, content_length, row_group_meta, arrow_schema).await?; for maybe_chunk in deserializer { let chunk = chunk_fn(maybe_chunk?); writer.write(&chunk, None)?; diff --git a/src/arrow2/wasm.rs b/src/arrow2/wasm.rs index 7346c42b..cc4dea42 100644 --- a/src/arrow2/wasm.rs +++ b/src/arrow2/wasm.rs @@ -1,7 +1,11 @@ +use std::rc::Rc; + use crate::arrow2::error::WasmResult; use crate::arrow2::ffi::FFIArrowTable; use crate::utils::{assert_parquet_file_not_empty, copy_vec_to_uint8_array}; +use arrow2::io::ipc::write::{StreamWriter as IPCStreamWriter, WriteOptions as IPCWriteOptions}; use js_sys::Uint8Array; +use js_sys::{Object, Reflect, Symbol}; use wasm_bindgen::prelude::*; /// Read a Parquet file into Arrow data using the [`arrow2`](https://crates.io/crates/arrow2) and @@ -202,11 +206,13 @@ pub async fn read_metadata_async( #[cfg(all(feature = "reader", feature = "async"))] pub async fn read_row_group_async( url: String, + content_length: Option, row_group_meta: &crate::arrow2::metadata::RowGroupMetaData, arrow_schema: &crate::arrow2::schema::ArrowSchema, ) -> WasmResult { let buffer = crate::arrow2::reader_async::read_row_group( url, + content_length, &row_group_meta.clone().into(), &arrow_schema.clone().into(), |chunk| chunk, @@ -214,6 +220,158 @@ pub async fn read_row_group_async( .await?; copy_vec_to_uint8_array(&buffer) } +/// Read a multiple row group parquet file out to Uint8Array chunks, presented as either +/// an async iterator OR a stream (accessed via .stream(), similar to Blob::stream or Observable's +/// FileAttachment::stream()). +/// +/// Example: +/// +/// ```js +/// import { tableFromIPC } from "apache-arrow"; +/// // Edit the `parquet-wasm` import as necessary +/// import { ParquetReader } from "parquet-wasm"; +/// +/// const url = "https://example.com/file.parquet"; +/// const headResp = await fetch(url, {method: 'HEAD'}); +/// const length = parseInt(headResp.headers.get('Content-Length')); +/// let reader = new ParquetReader(url, length); +/// // direct async iterator usage +/// let tables = [] +/// for await (const buf of reader) { +/// tables.push(tableFromIPC(buf)); +/// } +/// let combined = tables[0].concat(tables.slice(1)); +/// // explicit stream usage +/// reader = new ParquetReader(url, length); +/// tables = []; +/// for await (const buf of reader.stream()) { +/// tables.push(tableFromIPC(buf)); +/// } +/// combined = tables[0].concat(tables.slice(1)); +#[wasm_bindgen(js_name = "ParquetReader")] +#[cfg(all(feature = "reader", feature = "async"))] +#[derive(Clone)] +pub struct JsParquetReader { + url: String, + content_length: Option, + metadata: Option, + current_row_group: u32, + _writer: Option< + Rc>>, + >, +} + +pub fn set_iterator(obj: &Object) { + let func = js_sys::Function::new_no_args("return this"); + let _ = Reflect::set(obj, &Symbol::async_iterator(), &func); +} + +#[wasm_bindgen(js_class = "ParquetReader")] +#[cfg(all(feature = "reader", feature = "async"))] +impl JsParquetReader { + async fn initialize_metadata(&mut self) { + let converted = usize::try_from(self.content_length.unwrap()).unwrap(); + let metadata = + crate::arrow2::reader_async::read_metadata_async(self.url.clone(), Some(converted)) + .await + .unwrap(); + self.metadata = Some(crate::arrow2::metadata::FileMetaData::from(metadata)); + } + pub async fn next(&mut self) -> WasmResult> { + // check for the existence of metadata + let metadata = match &self.metadata { + Some(_meta) => _meta.clone(), + None => { + self.initialize_metadata().await; + + self.metadata.clone().unwrap() + } + }; + // now read the row groups + if self.current_row_group >= metadata.num_row_groups().try_into().unwrap() { + // we're done here + Ok(None) + } else { + let row_group_meta = + metadata.row_group(usize::try_from(self.current_row_group).unwrap()); + let arrow_schema = metadata.arrow_schema().unwrap_or_else(|_| { + let bar: Vec = vec![]; + arrow2::datatypes::Schema::from(bar).into() + }); + let buffer = crate::arrow2::reader_async::_read_row_group( + self.url.clone(), + Some(usize::try_from(self.content_length.unwrap()).unwrap()), + &row_group_meta.clone().into(), + &arrow_schema.into(), + ) + .await?; + let mut guard = self._writer.as_deref().unwrap().lock().await; + for maybe_chunk in buffer { + let chunk = maybe_chunk?; + guard.write(&chunk, None)?; + } + self.current_row_group += 1; + Ok(Some(true)) + } + } + #[wasm_bindgen(constructor)] + pub fn new(url: String, content_length: u32) -> Self { + Self { + url, + metadata: None, + content_length: Some(content_length), + current_row_group: 0, + _writer: None, + } + } + + pub async fn start( + &mut self, + _controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + use crate::common::stream::ReadableStreamSink; + self.initialize_metadata().await; + let options = IPCWriteOptions { compression: None }; + let mut writer = IPCStreamWriter::new(ReadableStreamSink::from(_controller), options); + let arrow_schema = self + .metadata + .clone() + .unwrap() + .arrow_schema() + .unwrap_or_else(|_| { + let bar: Vec = vec![]; + arrow2::datatypes::Schema::from(bar).into() + }) + .into(); + let _ = writer.start(&arrow_schema, None); + self._writer = Some(Rc::new(futures::lock::Mutex::new(writer))); + Ok(true) + } + + pub async fn pull( + &mut self, + controller: web_sys::ReadableStreamDefaultController, + ) -> WasmResult { + let chunk = self.next().await?; + match chunk { + Some(_chunk) => { + // let _ = controller.enqueue_with_chunk(&chunk.into()); + } + None => { + // yet another lengthy borrow + let mut guard = self._writer.as_deref().unwrap().lock().await; + guard.finish()?; + let _ = controller.close(); + } + } + Ok(true) + } + pub fn stream(&self) -> web_sys::ReadableStream { + let wrapper: Object = Into::::into(self.clone()).into(); + + web_sys::ReadableStream::new_with_underlying_source(&wrapper).unwrap() + } +} /// Write Arrow data to a Parquet file using the [`arrow2`](https://crates.io/crates/arrow2) and /// [`parquet2`](https://crates.io/crates/parquet2) Rust crates. diff --git a/src/common/fetch.rs b/src/common/fetch.rs index 6fdd6dec..36ced20d 100644 --- a/src/common/fetch.rs +++ b/src/common/fetch.rs @@ -1,6 +1,8 @@ use std::convert::TryInto; use futures::channel::oneshot; +use futures::future::BoxFuture; +use range_reader::{RangeOutput, RangedAsyncReader}; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::spawn_local; @@ -65,3 +67,27 @@ pub async fn make_range_request( let data = receiver.await.unwrap(); Ok(data) } + +/// Create a RangedAsyncReader +pub fn create_reader( + url: String, + content_length: usize, + min_request_size: Option, +) -> RangedAsyncReader { + // at least 4kb per s3 request. Adjust to your liking. + let min_request_size = min_request_size.unwrap_or(4 * 1024); + + // Closure for making an individual HTTP range request to a file + let range_get = Box::new(move |start: u64, length: usize| { + let url = url.clone(); + + Box::pin(async move { + let data = make_range_request(url.clone(), start, length) + .await + .unwrap(); + Ok(RangeOutput { start, data }) + }) as BoxFuture<'static, std::io::Result> + }); + + RangedAsyncReader::new(content_length, min_request_size, range_get) +} diff --git a/src/common/mod.rs b/src/common/mod.rs index 7781af36..ed1ce218 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -3,3 +3,6 @@ pub mod writer_properties; #[cfg(feature = "async")] pub mod fetch; + +#[cfg(feature = "async")] +pub mod stream; diff --git a/src/common/stream.rs b/src/common/stream.rs new file mode 100644 index 00000000..c01ed786 --- /dev/null +++ b/src/common/stream.rs @@ -0,0 +1,82 @@ +use std::task::Poll; +use std::time::Duration; + +use futures::AsyncWrite; +use js_sys::Uint8Array; +use wasm_bindgen_futures::spawn_local; + +pub struct ReadableStreamSink(web_sys::ReadableStreamDefaultController); + +impl std::io::Write for ReadableStreamSink { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + let intermediate = Uint8Array::from(buf); + let _ = self.0.enqueue_with_chunk(&intermediate); + Ok(intermediate.byte_length() as usize) + } + + fn flush(&mut self) -> std::io::Result<()> { + todo!() + } +} +impl ReadableStreamSink { + pub fn close(&mut self) { + let _ = self.0.close(); + } +} + +impl From for ReadableStreamSink { + fn from(value: web_sys::ReadableStreamDefaultController) -> Self { + Self(value) + } +} + +pub struct AsyncReadableStreamSink { + controller: web_sys::ReadableStreamDefaultController, +} + +#[cfg(all(feature = "reader", feature = "async"))] +impl AsyncWrite for AsyncReadableStreamSink { + fn poll_write( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &[u8], + ) -> Poll> { + let this = self.get_mut(); + if this.controller.desired_size().unwrap() <= 0.0 { + let waker = cx.waker().clone(); + let sleep_duration = Duration::from_millis(16); + spawn_local(async move { + async_std::task::sleep(sleep_duration).await; + waker.wake_by_ref(); + }); + Poll::Pending + } else { + let intermediate = Uint8Array::from(buf); + let buf_size = usize::try_from(intermediate.byte_length()).unwrap(); + let _ = this.controller.enqueue_with_chunk(&intermediate); + Poll::Ready(Ok(buf_size)) + } + } + + fn poll_flush( + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> Poll> { + todo!() + } + + fn poll_close( + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> Poll> { + let this = self.get_mut(); + let _ = this.controller.close(); + Poll::Ready(Ok(())) + } +} + +impl From for AsyncReadableStreamSink { + fn from(value: web_sys::ReadableStreamDefaultController) -> Self { + Self { controller: value } + } +} diff --git a/tests/js/arrow1.ts b/tests/js/arrow1.ts index 1297a618..be63fb6b 100644 --- a/tests/js/arrow1.ts +++ b/tests/js/arrow1.ts @@ -1,8 +1,8 @@ import * as test from "tape"; import * as wasm from "../../pkg/node/arrow1"; -import { readFileSync } from "fs"; -import { tableFromIPC, tableToIPC } from "apache-arrow"; -import { testArrowTablesEqual, readExpectedArrowData } from "./utils"; +import { readFileSync, statSync } from "fs"; +import { RecordBatchStreamReader, Table, tableFromIPC, tableToIPC } from "apache-arrow"; +import { testArrowTablesEqual, readExpectedArrowData, temporaryServer } from "./utils"; // Path from repo root const dataDir = "tests/data"; @@ -34,6 +34,24 @@ test("read file", async (t) => { t.end(); }); +test("read file async", async (t) => { + const server = await temporaryServer(); + const listeningPort = server.addresses()[0].port; + const rootUrl = `http://localhost:${listeningPort}`; + + const expectedTable = readExpectedArrowData(); + + for (const testFile of testFiles) { + const dataPath = `${dataDir}/${testFile}`; + const url = `${rootUrl}/${testFile}`; + const table = tableFromIPC(await wasm.readParquetAsync(url)); + testArrowTablesEqual(t, expectedTable, table); + } + + await server.close(); + t.end(); +}) + test("read-write-read round trip (with writer properties)", async (t) => { const dataPath = `${dataDir}/1-partition-brotli.parquet`; const buffer = readFileSync(dataPath); @@ -77,3 +95,24 @@ test("error produced trying to read file with arrayBuffer", (t) => { t.end(); }); + +test("read file stream", async (t) => { + const server = await temporaryServer(); + const listeningPort = server.addresses()[0].port; + const rootUrl = `http://localhost:${listeningPort}`; + + const expectedTable = readExpectedArrowData(); + + for (const testFile of testFiles) { + const dataPath = `${dataDir}/${testFile}`; + const url = `${rootUrl}/${testFile}`; + const contentLength = statSync(dataPath).size; + const instance = new wasm.ParquetReader(url, contentLength); + const reader = await RecordBatchStreamReader.from(instance.stream()); + const table = new Table(await reader.readAll()) + testArrowTablesEqual(t, expectedTable, table); + } + + await server.close(); + t.end(); +}) diff --git a/tests/js/arrow2.ts b/tests/js/arrow2.ts index 4c6cb952..3925ffd7 100644 --- a/tests/js/arrow2.ts +++ b/tests/js/arrow2.ts @@ -1,8 +1,8 @@ import * as test from "tape"; import * as wasm from "../../pkg/node/arrow2"; -import { readFileSync } from "fs"; -import { RecordBatch, Table, tableFromIPC, tableToIPC } from "apache-arrow"; -import { testArrowTablesEqual, readExpectedArrowData } from "./utils"; +import { readFileSync, statSync } from "fs"; +import { RecordBatch, RecordBatchStreamReader, Table, tableFromIPC, tableToIPC } from "apache-arrow"; +import { testArrowTablesEqual, readExpectedArrowData, temporaryServer } from "./utils"; // Path from repo root const dataDir = "tests/data"; @@ -97,3 +97,24 @@ test("iterate over row groups", (t) => { t.end(); }); + +test("read file stream", async (t) => { + const server = await temporaryServer(); + const listeningPort = server.addresses()[0].port; + const rootUrl = `http://localhost:${listeningPort}`; + + const expectedTable = readExpectedArrowData(); + + for (const testFile of testFiles) { + const dataPath = `${dataDir}/${testFile}`; + const url = `${rootUrl}/${testFile}`; + const contentLength = statSync(dataPath).size; + const instance = new wasm.ParquetReader(url, contentLength); + const reader = await RecordBatchStreamReader.from(instance.stream()); + const table = new Table(await reader.readAll()) + testArrowTablesEqual(t, expectedTable, table); + } + + await server.close(); + t.end(); +}) diff --git a/tests/js/utils.ts b/tests/js/utils.ts index 96fc3bfa..8947284c 100644 --- a/tests/js/utils.ts +++ b/tests/js/utils.ts @@ -1,6 +1,9 @@ import { Test } from "tape"; import { readFileSync } from "fs"; import { tableFromIPC, Table } from "apache-arrow"; +import fastify, { FastifyInstance } from 'fastify'; +import fastifyStatic from "@fastify/static"; +import path = require("path"); const dataDir = "tests/data"; @@ -53,3 +56,15 @@ export function readExpectedArrowData(): Table { const buffer = readFileSync(expectedArrowPath); return tableFromIPC(buffer); } + +export async function temporaryServer() { + const server = fastify().register(fastifyStatic, { + root: path.join(__dirname, '../data') + }); + await server.listen({ + port: 0, + host: 'localhost' + }); + return server as FastifyInstance; + +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 92a01624..386bf878 100644 --- a/yarn.lock +++ b/yarn.lock @@ -49,47 +49,156 @@ __metadata: languageName: node linkType: hard -"@cspotcode/source-map-consumer@npm:0.8.0": - version: 0.8.0 - resolution: "@cspotcode/source-map-consumer@npm:0.8.0" - checksum: c0c16ca3d2f58898f1bd74c4f41a189dbcc202e642e60e489cbcc2e52419c4e89bdead02c886a12fb13ea37798ede9e562b2321df997ebc210ae9bd881561b4e +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@fastify/accept-negotiator@npm:^1.0.0": + version: 1.1.0 + resolution: "@fastify/accept-negotiator@npm:1.1.0" + checksum: 5c8f263680af0aece8c1fdea4d4c094a7f82cc5ed90b709357eb52a01e3388d1ac74a17e5a1d5d53f2d3ca93ae50d283ee451a6435b2cbe1b9847fff4d7d0732 + languageName: node + linkType: hard + +"@fastify/ajv-compiler@npm:^3.5.0": + version: 3.5.0 + resolution: "@fastify/ajv-compiler@npm:3.5.0" + dependencies: + ajv: ^8.11.0 + ajv-formats: ^2.1.1 + fast-uri: ^2.0.0 + checksum: 5e5b16469f8d586473d0b32e3a9cf38c0d86ef2a6fb7ea12ed7f3665642bd8eb2dde9adcc317814369cb5a58210bfdac35996fa87d1cc23e88bbc799f0b128b0 + languageName: node + linkType: hard + +"@fastify/deepmerge@npm:^1.0.0": + version: 1.3.0 + resolution: "@fastify/deepmerge@npm:1.3.0" + checksum: 33ec927905dca320d7ae9535a1521909f7c82339706345324ab6287ad100589a799b8257c15b0e582c7bb74e2aa4883d82ba0228d7b116aa8789ada4f78d6974 + languageName: node + linkType: hard + +"@fastify/error@npm:^3.2.0": + version: 3.3.0 + resolution: "@fastify/error@npm:3.3.0" + checksum: 202507c8c7f49922cac2f5afc82802151b0bd9c583ca1c2850bf43d0f4cd97eedb3a3388b9016da74f8a01b517a5861d1f666c506dd64fd22995e559bc139264 + languageName: node + linkType: hard + +"@fastify/fast-json-stringify-compiler@npm:^4.3.0": + version: 4.3.0 + resolution: "@fastify/fast-json-stringify-compiler@npm:4.3.0" + dependencies: + fast-json-stringify: ^5.7.0 + checksum: 2734afabe2539d3e15d2bd9f8dfee756d9cd969f7303dc085dd91c744ff61742bb0d3ebd3b561cf3c32be54567048a634b4962f943eb6bd9ed3fbd71cbf6a4fa languageName: node linkType: hard -"@cspotcode/source-map-support@npm:0.7.0": - version: 0.7.0 - resolution: "@cspotcode/source-map-support@npm:0.7.0" +"@fastify/send@npm:^2.0.0": + version: 2.1.0 + resolution: "@fastify/send@npm:2.1.0" dependencies: - "@cspotcode/source-map-consumer": 0.8.0 - checksum: 9faddda7757cd778b5fd6812137b2cc265810043680d6399acc20441668fafcdc874053be9dccd0d9110087287bfad27eb3bf342f72bceca9aa9059f5d0c4be8 + "@lukeed/ms": ^2.0.1 + escape-html: ~1.0.3 + fast-decode-uri-component: ^1.0.1 + http-errors: 2.0.0 + mime: ^3.0.0 + checksum: c0eeddd35c53167e41ee7c25ccbb964e5a1e4a17c827da6486db656581f83f162237d6f8104b698a4a136d8ea054f2d028bfa4c7d1c4126db51584680f43e1f1 + languageName: node + linkType: hard + +"@fastify/static@npm:^6.10.2": + version: 6.10.2 + resolution: "@fastify/static@npm:6.10.2" + dependencies: + "@fastify/accept-negotiator": ^1.0.0 + "@fastify/send": ^2.0.0 + content-disposition: ^0.5.3 + fastify-plugin: ^4.0.0 + glob: ^8.0.1 + p-limit: ^3.1.0 + readable-stream: ^4.0.0 + checksum: 724fe72346ff0fa280f6a281ebcf784a7ede9da3e49cc28c19c7f2a2886d25c735883f77ff99fc13425b4a1d3cb831f7b21a20a1996db221cfec2cfa25e9c3c8 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@ljharb/resumer@npm:^0.0.1": + version: 0.0.1 + resolution: "@ljharb/resumer@npm:0.0.1" + dependencies: + "@ljharb/through": ^2.3.9 + checksum: 1cff0a485cb857933d2921cb05a349f8fe894fa2bb6b31a347010ecccc4a2b369e43ebe5383a32a60ee6c9572d2c83fcab383eb01727e1507bf29c59f312dae6 + languageName: node + linkType: hard + +"@ljharb/through@npm:^2.3.9": + version: 2.3.9 + resolution: "@ljharb/through@npm:2.3.9" + checksum: a47ffed12ef4b08d07458db8bff5f7a13a7030fddf7dbfa947a765581a634d42ee90f7b8c249315aad122c21ad061e97a74f65aef3c03d2c09291d11312f0bfb + languageName: node + linkType: hard + +"@lukeed/ms@npm:^2.0.1": + version: 2.0.1 + resolution: "@lukeed/ms@npm:2.0.1" + checksum: c7b46933bf7bad3e024dcbbe2ad6201392b4ed2a05a717c0ef7e96a03fb885d44f08b4b749c392cc51c2736a6a45a08c77f1863ace1c072928fbfd9908a13db3 languageName: node linkType: hard "@tsconfig/node10@npm:^1.0.7": - version: 1.0.8 - resolution: "@tsconfig/node10@npm:1.0.8" - checksum: b8d5fffbc6b17ef64ef74f7fdbccee02a809a063ade785c3648dae59406bc207f70ea2c4296f92749b33019fa36a5ae716e42e49cc7f1bbf0fd147be0d6b970a + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df languageName: node linkType: hard "@tsconfig/node12@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node12@npm:1.0.9" - checksum: a01b2400ab3582b86b589c6d31dcd0c0656f333adecde85d6d7d4086adb059808b82692380bb169546d189bf771ae21d02544a75b57bd6da4a5dd95f8567bec9 + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a languageName: node linkType: hard "@tsconfig/node14@npm:^1.0.0": - version: 1.0.1 - resolution: "@tsconfig/node14@npm:1.0.1" - checksum: 976345e896c0f059867f94f8d0f6ddb8b1844fb62bf36b727de8a9a68f024857e5db97ed51d3325e23e0616a5e48c034ff51a8d595b3fe7e955f3587540489be + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d languageName: node linkType: hard "@tsconfig/node16@npm:^1.0.2": - version: 1.0.2 - resolution: "@tsconfig/node16@npm:1.0.2" - checksum: ca94d3639714672bbfd55f03521d3f56bb6a25479bd425da81faf21f13e1e9d15f40f97377dedbbf477a5841c5b0c8f4cd1b391f33553d750b9202c54c2c07aa + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff languageName: node linkType: hard @@ -114,10 +223,17 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^17.0.21, @types/node@npm:^17.0.8": - version: 17.0.21 - resolution: "@types/node@npm:17.0.21" - checksum: 89dcd2fe82f21d3634266f8384e9c865cf8af49685639fbdbd799bdd1040480fb1e8eeda2d3b9fce41edbe704d2a4be9f427118c4ae872e8d9bb7cbeb3c41a94 +"@types/node@npm:*": + version: 20.4.8 + resolution: "@types/node@npm:20.4.8" + checksum: 86a3963c0c7af3410553d1dfa4b018a20b3cb3ab4d8e8ffe27408b6338c5de0374b0bf379bc705da2205b466daa751ccfe062f453ba9bde34fdb0e5163ca6a68 + languageName: node + linkType: hard + +"@types/node@npm:^17.0.21, @types/node@npm:^17.0.8": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 languageName: node linkType: hard @@ -129,11 +245,37 @@ __metadata: linkType: hard "@types/tape@npm:^4.13.2": - version: 4.13.2 - resolution: "@types/tape@npm:4.13.2" + version: 4.13.4 + resolution: "@types/tape@npm:4.13.4" + dependencies: + "@types/node": "*" + "@types/through": "*" + checksum: d69eada4645076a18bd728aa2cab9400082b1ad2124089c6e0e2931bf98fdad16579e9051db1f922c28ae0cb5f9ad2e88fac4ba9c5ba18e8400cc7558f28803d + languageName: node + linkType: hard + +"@types/through@npm:*": + version: 0.0.30 + resolution: "@types/through@npm:0.0.30" dependencies: "@types/node": "*" - checksum: 055a896c10289e2f3ce023f66c1845941179590b3d6c342db3df117b682fb36d825822ed02238208cc00aa2360b223b64cd1bcb605f5edeac32893dbf3a2d96a + checksum: 9578470db0b527c26e246a1220ae9bffc6bf47f20f89c54aac467c083ab1f7e16c00d9a7b4bb6cb4e2dfae465027270827e5908a6236063f6214625e50585d78 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + +"abstract-logging@npm:^2.0.1": + version: 2.0.1 + resolution: "abstract-logging@npm:2.0.1" + checksum: 6967d15e5abbafd17f56eaf30ba8278c99333586fa4f7935fd80e93cfdc006c37fcc819c5d63ee373a12e6cb2d0417f7c3c6b9e42b957a25af9937d26749415e languageName: node linkType: hard @@ -145,11 +287,37 @@ __metadata: linkType: hard "acorn@npm:^8.4.1": - version: 8.7.0 - resolution: "acorn@npm:8.7.0" + version: 8.10.0 + resolution: "acorn@npm:8.10.0" bin: acorn: bin/acorn - checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0 + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 languageName: node linkType: hard @@ -208,6 +376,13 @@ __metadata: languageName: node linkType: hard +"archy@npm:^1.0.0": + version: 1.0.0 + resolution: "archy@npm:1.0.0" + checksum: 504ae7af655130bab9f471343cfdb054feaec7d8e300e13348bc9fe9e660f83d422e473069584f73233c701ae37d1c8452ff2522f2a20c38849e0f406f1732ac + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -229,6 +404,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + "array-union@npm:^1.0.1": version: 1.0.2 resolution: "array-union@npm:1.0.2" @@ -245,15 +430,29 @@ __metadata: languageName: node linkType: hard -"array.prototype.every@npm:^1.1.3": - version: 1.1.3 - resolution: "array.prototype.every@npm:1.1.3" +"array.prototype.every@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.every@npm:1.1.4" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 is-string: ^1.0.7 - checksum: bbcc864ac1271307043a16262455a6f917d183060a7e5b99c7c710ee611d40c1065f4ec674323b50cf8b987f2d0c9ca9e9ff9cbf4bcc7740f82e731ec2a58d6f + checksum: 6a11683fd0148a1f70108ad20eeb5e174813dc22799264584a543d463810ed42261aad0c1c5de1097ea515ec159d20deb9babb465f4ae3ceeb11e28094c3b5b3 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.1": + version: 1.0.1 + resolution: "arraybuffer.prototype.slice@npm:1.0.1" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: e3e9b2a3e988ebfeddce4c7e8f69df730c9e48cb04b0d40ff0874ce3d86b3d1339dd520ffde5e39c02610bc172ecfbd4bc93324b1cabd9554c44a56b131ce0ce languageName: node linkType: hard @@ -265,11 +464,18 @@ __metadata: linkType: hard "async@npm:^2.6.1": - version: 2.6.3 - resolution: "async@npm:2.6.3" + version: 2.6.4 + resolution: "async@npm:2.6.4" dependencies: lodash: ^4.17.14 - checksum: 5e5561ff8fca807e88738533d620488ac03a5c43fce6c937451f7e35f943d33ad06c24af3f681a48cca3d2b0002b3118faff0a128dc89438a9bf0226f712c499 + checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 + languageName: node + linkType: hard + +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 languageName: node linkType: hard @@ -280,6 +486,17 @@ __metadata: languageName: node linkType: hard +"avvio@npm:^8.2.1": + version: 8.2.1 + resolution: "avvio@npm:8.2.1" + dependencies: + archy: ^1.0.0 + debug: ^4.0.0 + fastq: ^1.6.1 + checksum: 4c96922ea123d13b26cb78a071a8989fde62ee8580352b6d2f05b7976ed3d23efa663c12ee1be35501dfe65e12a769a2ea522bcdb7ca35a5ba4d86766467075a + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -287,6 +504,13 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + "benchmark@npm:^2.1.4": version: 2.1.4 resolution: "benchmark@npm:2.1.4" @@ -333,6 +557,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -454,6 +688,22 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:^0.5.3": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: 5.2.1 + checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 + languageName: node + linkType: hard + +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -461,26 +711,41 @@ __metadata: languageName: node linkType: hard -"deep-equal@npm:^2.0.5": - version: 2.0.5 - resolution: "deep-equal@npm:2.0.5" +"debug@npm:^4.0.0": + version: 4.3.4 + resolution: "debug@npm:4.3.4" dependencies: - call-bind: ^1.0.0 - es-get-iterator: ^1.1.1 - get-intrinsic: ^1.0.1 - is-arguments: ^1.0.4 - is-date-object: ^1.0.2 - is-regex: ^1.1.1 + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"deep-equal@npm:^2.2.2": + version: 2.2.2 + resolution: "deep-equal@npm:2.2.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + es-get-iterator: ^1.1.3 + get-intrinsic: ^1.2.1 + is-arguments: ^1.1.1 + is-array-buffer: ^3.0.2 + is-date-object: ^1.0.5 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 isarray: ^2.0.5 - object-is: ^1.1.4 + object-is: ^1.1.5 object-keys: ^1.1.1 - object.assign: ^4.1.2 - regexp.prototype.flags: ^1.3.0 - side-channel: ^1.0.3 - which-boxed-primitive: ^1.0.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.5.0 + side-channel: ^1.0.4 + which-boxed-primitive: ^1.0.2 which-collection: ^1.0.1 - which-typed-array: ^1.1.2 - checksum: 2bb7332badf589b540184d25098acac750e30fe11c8dce4523d03fc5db15f46881a0105e6bf0b64bb0c57213a95ed964029ff0259026ad6f7f9e0019f8200de5 + which-typed-array: ^1.1.9 + checksum: eb61c35157b6ecb96a5359b507b083fbff8ddb4c86a78a781ee38485f77a667465e45d63ee2ebd8a00e86d94c80e499906900cd82c2debb400237e1662cd5397 languageName: node linkType: hard @@ -491,19 +756,27 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3": - version: 1.1.3 - resolution: "define-properties@npm:1.1.3" +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" dependencies: - object-keys: ^1.0.12 - checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 languageName: node linkType: hard -"defined@npm:^1.0.0": - version: 1.0.0 - resolution: "defined@npm:1.0.0" - checksum: 77672997c5001773371c4dbcce98da0b3dc43089d6da2ad87c4b800adb727633cea8723ea3889fe0c2112a2404e2fd07e3bfd0e55f7426aa6441d8992045dbd5 +"defined@npm:^1.0.1": + version: 1.0.1 + resolution: "defined@npm:1.0.1" + checksum: b1a852300bdb57f297289b55eafdd0c517afaa3ec8190e78fce91b9d8d0c0369d4505ecbdacfd3d98372e664f4a267d9bd793938d4a8c76209c9d9516fbe2101 + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a languageName: node linkType: hard @@ -539,47 +812,78 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.18.5, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.22.1 + resolution: "es-abstract@npm:1.22.1" dependencies: + array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.1 + available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.2.1 get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 has: ^1.0.3 - has-symbols: ^1.0.2 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.1 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + 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.1 + is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 - is-weakref: ^1.0.1 - object-inspect: ^1.11.0 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.3 object-keys: ^1.1.1 - object.assign: ^4.1.2 - string.prototype.trimend: ^1.0.4 - string.prototype.trimstart: ^1.0.4 - unbox-primitive: ^1.0.1 - checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 - languageName: node - linkType: hard - -"es-get-iterator@npm:^1.1.1": - version: 1.1.2 - resolution: "es-get-iterator@npm:1.1.2" + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.5.0 + safe-array-concat: ^1.0.0 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.7 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + 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.10 + checksum: 614e2c1c3717cb8d30b6128ef12ea110e06fd7d75ad77091ca1c5dbfb00da130e62e4bbbbbdda190eada098a22b27fe0f99ae5a1171dac2c8663b1e8be8a3a9b + languageName: node + linkType: hard + +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" dependencies: call-bind: ^1.0.2 - get-intrinsic: ^1.1.0 - has-symbols: ^1.0.1 - is-arguments: ^1.1.0 + get-intrinsic: ^1.1.3 + has-symbols: ^1.0.3 + is-arguments: ^1.1.1 is-map: ^2.0.2 is-set: ^2.0.2 - is-string: ^1.0.5 + is-string: ^1.0.7 isarray: ^2.0.5 - checksum: f75e66acb6a45686fa08b3ade9c9421a70d36a0c43ed4363e67f4d7aab2226cb73dd977cb48abbaf75721b946d3cd810682fcf310c7ad0867802fbf929b17dcf + stop-iteration-iterator: ^1.0.0 + checksum: 8fa118da42667a01a7c7529f8a8cca514feeff243feec1ce0bb73baaa3514560bd09d2b3438873cf8a5aaec5d52da248131de153b28e2638a061b6e4df13267d + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 languageName: node linkType: hard @@ -594,6 +898,13 @@ __metadata: languageName: node linkType: hard +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + "escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -601,13 +912,118 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.3": +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"fast-content-type-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-content-type-parse@npm:1.0.0" + checksum: 9e9187be17bea18a2ee715c5737b983181cbe84f286a291db0595e421e04b578da10ca10845639be08664a4db6a793f7709822935cf38cfdf9ecba38d84ead9e + languageName: node + linkType: hard + +"fast-decode-uri-component@npm:^1.0.1": + version: 1.0.1 + resolution: "fast-decode-uri-component@npm:1.0.1" + checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d languageName: node linkType: hard +"fast-json-stringify@npm:^5.7.0": + version: 5.8.0 + resolution: "fast-json-stringify@npm:5.8.0" + dependencies: + "@fastify/deepmerge": ^1.0.0 + ajv: ^8.10.0 + ajv-formats: ^2.1.1 + fast-deep-equal: ^3.1.3 + fast-uri: ^2.1.0 + rfdc: ^1.2.0 + checksum: 04232ace5a5758e6a92b9a4518234a1c05e55ef9b788c80bf741ec6a64cf7273a9ef07938ca4b82a96ea470295b4c3e84a657a9bbaacee4bd97daa16595b1a9a + languageName: node + linkType: hard + +"fast-querystring@npm:^1.0.0": + version: 1.1.2 + resolution: "fast-querystring@npm:1.1.2" + dependencies: + fast-decode-uri-component: ^1.0.1 + checksum: 7149f82ee9ac39a9c08c7ffe435b9f6deade76ae5e3675fe1835720513e8c4bc541e666b4b7b1c0c07e08f369dcf4828d00f2bee39889a90a168e1439cf27b0b + languageName: node + linkType: hard + +"fast-redact@npm:^3.1.1": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: 3f7becc70a5a2662a9cbfdc52a4291594f62ae998806ee00315af307f32d9559dbf512146259a22739ee34401950ef47598c1f4777d33b0ed5027203d67f549c + languageName: node + linkType: hard + +"fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0": + version: 2.2.0 + resolution: "fast-uri@npm:2.2.0" + checksum: edac64d50628f21d562cdc19ea86f5af00902dbb09d2f96fff5974e5317157825e9aa163af9defd11a0818aac6ea2e9958597bed98dd041200a08a976809d08b + languageName: node + linkType: hard + +"fastify-plugin@npm:^4.0.0": + version: 4.5.1 + resolution: "fastify-plugin@npm:4.5.1" + checksum: ddd1b2d470c3acd9397c2617b5842dcf71a6f9a32f05d02be1c12e8d37b8fc03af656900cec38e2afef5e9a3dfe5f994317810f4c5e9960b127b1ca179b56f73 + languageName: node + linkType: hard + +"fastify@npm:^4.21.0": + version: 4.21.0 + resolution: "fastify@npm:4.21.0" + dependencies: + "@fastify/ajv-compiler": ^3.5.0 + "@fastify/error": ^3.2.0 + "@fastify/fast-json-stringify-compiler": ^4.3.0 + abstract-logging: ^2.0.1 + avvio: ^8.2.1 + fast-content-type-parse: ^1.0.0 + fast-json-stringify: ^5.7.0 + find-my-way: ^7.6.0 + light-my-request: ^5.9.1 + pino: ^8.12.0 + process-warning: ^2.2.0 + proxy-addr: ^2.0.7 + rfdc: ^1.3.0 + secure-json-parse: ^2.5.0 + semver: ^7.5.0 + tiny-lru: ^11.0.1 + checksum: 25af01ac4cf899a1158f64fb8fd8296240dfe84eeb999b3f5ac40ff84221b0962dd5f729e499a89078e8416bcf54cf56ada028f61f9f97c4001dc7301ab740ea + languageName: node + linkType: hard + +"fastq@npm:^1.6.1": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + "filename-reserved-regex@npm:^2.0.0": version: 2.0.0 resolution: "filename-reserved-regex@npm:2.0.0" @@ -637,6 +1053,17 @@ __metadata: languageName: node linkType: hard +"find-my-way@npm:^7.6.0": + version: 7.6.2 + resolution: "find-my-way@npm:7.6.2" + dependencies: + fast-deep-equal: ^3.1.3 + fast-querystring: ^1.0.0 + safe-regex2: ^2.0.0 + checksum: 56c02350aba2cc4cff82b3e00171cf4db72756b8ca5f0e41562d21f89cf29512b9e83b6e29ab352303ca9d0dcbfcd8c93f50d52dc92f1eeecc4bc991404ef533 + languageName: node + linkType: hard + "find-replace@npm:^3.0.0": version: 3.0.0 resolution: "find-replace@npm:3.0.0" @@ -672,21 +1099,21 @@ __metadata: languageName: node linkType: hard -"foreach@npm:^2.0.5": - version: 2.0.5 - resolution: "foreach@npm:2.0.5" - checksum: dab4fbfef0b40b69ee5eab81bcb9626b8fa8b3469c8cfa26480f3e5e1ee08c40eae07048c9a967c65aeda26e774511ccc70b3f10a604c01753c6ef24361f0fc8 +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 languageName: node linkType: hard "fs-extra@npm:^10.0.0": - version: 10.0.1 - resolution: "fs-extra@npm:10.0.1" + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: c1faaa5eb9e1c5c7c7ff09f966e93922ecb068ae1b04801cfc983ef05fcc1f66bfbb8d8d0b745c910014c7a2e7317fb6cf3bfe7390450c1157e3cc1a218f221d + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 languageName: node linkType: hard @@ -715,14 +1142,34 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.1, get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.1 - resolution: "get-intrinsic@npm:1.1.1" +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": + version: 1.2.1 + resolution: "get-intrinsic@npm:1.2.1" dependencies: function-bind: ^1.1.1 has: ^1.0.3 - has-symbols: ^1.0.1 - checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f languageName: node linkType: hard @@ -761,17 +1208,39 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.3, glob@npm:^7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" +"glob@npm:^7.0.3, glob@npm:^7.2.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 - minimatch: ^3.0.4 + minimatch: ^3.1.1 once: ^1.3.0 path-is-absolute: ^1.0.0 - checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.0.1, glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 languageName: node linkType: hard @@ -788,17 +1257,26 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": - version: 4.2.9 - resolution: "graceful-fs@npm:4.2.9" - checksum: 68ea4e07ff2c041ada184f9278b830375f8e0b75154e3f080af6b70f66172fabb4108d19b3863a96b53fc068a310b9b6493d86d1291acc5f3861eb4b79d26ad6 + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard -"has-bigints@npm:^1.0.1": - version: 1.0.1 - resolution: "has-bigints@npm:1.0.1" - checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b languageName: node linkType: hard @@ -808,18 +1286,34 @@ __metadata: dependencies: call-bind: ^1.0.2 get-intrinsic: ^1.1.1 - checksum: 1cb60255cdd354a5f53997dd4c8ae0f821706ced3d1047bb810cb74400f28988b08d4d986318cb6610b79e6b9993a6592e678b6cef3ef0b71ab553eaa99b9c4d + checksum: 1cb60255cdd354a5f53997dd4c8ae0f821706ced3d1047bb810cb74400f28988b08d4d986318cb6610b79e6b9993a6592e678b6cef3ef0b71ab553eaa99b9c4d + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 @@ -844,6 +1338,26 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -854,25 +1368,32 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" dependencies: - get-intrinsic: ^1.1.0 + get-intrinsic: ^1.2.0 has: ^1.0.3 side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf + checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 languageName: node linkType: hard -"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.0": +"is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" dependencies: @@ -882,6 +1403,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -901,23 +1433,23 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.2.0": - version: 2.8.1 - resolution: "is-core-module@npm:2.8.1" +"is-core-module@npm:^2.9.0": + version: 2.13.0 + resolution: "is-core-module@npm:2.13.0" dependencies: has: ^1.0.3 - checksum: 418b7bc10768a73c41c7ef497e293719604007f88934a6ffc5f7c78702791b8528102fb4c9e56d006d69361549b3d9519440214a74aefc7e0b79e5e4411d377f + checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.2": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -940,7 +1472,7 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": +"is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a @@ -948,15 +1480,15 @@ __metadata: linkType: hard "is-number-object@npm:^1.0.4": - version: 1.0.6 - resolution: "is-number-object@npm:1.0.6" + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: ^1.0.0 - checksum: c697704e8fc2027fc41cb81d29805de4e8b6dc9c3efee93741dbf126a8ecc8443fef85adbc581415ae7e55d325e51d0a942324ae35c829131748cce39cba55f3 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 languageName: node linkType: hard -"is-regex@npm:^1.1.1, is-regex@npm:^1.1.4": +"is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: @@ -973,10 +1505,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a languageName: node linkType: hard @@ -998,16 +1532,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.7": - version: 1.1.8 - resolution: "is-typed-array@npm:1.1.8" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.18.5 - foreach: ^2.0.5 - has-tostringtag: ^1.0.0 - checksum: aa0f9f0716e19e2fb8aef69e69e4205479d25ace778e2339fc910948115cde4b0d9aff9d5d1e8b80f09a5664998278e05e54ad3dc9cb12cefcf86db71084ed00 + which-typed-array: ^1.1.11 + checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 languageName: node linkType: hard @@ -1018,7 +1548,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": +"is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: @@ -1051,6 +1581,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + "json2csv@npm:^5.0.6": version: 5.0.7 resolution: "json2csv@npm:5.0.7" @@ -1065,9 +1602,9 @@ __metadata: linkType: hard "jsonc-parser@npm:^3.0.0": - version: 3.0.0 - resolution: "jsonc-parser@npm:3.0.0" - checksum: 1df2326f1f9688de30c70ff19c5b2a83ba3b89a1036160da79821d1361090775e9db502dc57a67c11b56e1186fc1ed70b887f25c5febf9a3ec4f91435836c99d + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 languageName: node linkType: hard @@ -1104,9 +1641,20 @@ __metadata: linkType: hard "kleur@npm:^4.1.4": - version: 4.1.4 - resolution: "kleur@npm:4.1.4" - checksum: 7f6db36e378045dec14acd3cbf0b1e59130c09e984ee8b8ce56dd2d2257cfff90389c1e8f8b19bd09dd5d241080566a814b4ccd99fdcef91f59ef93ec33c8a44 + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 + languageName: node + linkType: hard + +"light-my-request@npm:^5.9.1": + version: 5.10.0 + resolution: "light-my-request@npm:5.10.0" + dependencies: + cookie: ^0.5.0 + process-warning: ^2.0.0 + set-cookie-parser: ^2.4.1 + checksum: 50450afd155c8a8800435d568b118ea24b0367d36defaf0467fc49f5e7591c3f8c90b97641f67792d3f25190d53c988c6bc03dd389dfec9dcdfd1907f01ff36f languageName: node linkType: hard @@ -1152,6 +1700,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + "lunr@npm:^2.3.9": version: 2.3.9 resolution: "lunr@npm:2.3.9" @@ -1175,12 +1732,21 @@ __metadata: languageName: node linkType: hard -"marked@npm:^4.0.12": - version: 4.0.12 - resolution: "marked@npm:4.0.12" +"marked@npm:^4.0.16": + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192 + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 + languageName: node + linkType: hard + +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 languageName: node linkType: hard @@ -1191,7 +1757,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -1200,19 +1766,26 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 languageName: node linkType: hard -"minimist@npm:^1.2.5": - version: 1.2.5 - resolution: "minimist@npm:1.2.5" - checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52 +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f languageName: node linkType: hard @@ -1223,14 +1796,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": - version: 1.12.0 - resolution: "object-inspect@npm:1.12.0" - checksum: 2b36d4001a9c921c6b342e2965734519c9c58c355822243c3207fbf0aac271f8d44d30d2d570d450b2cc6f0f00b72bcdba515c37827d2560e5f22b1899a31cf4 +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db languageName: node linkType: hard -"object-is@npm:^1.1.4, object-is@npm:^1.1.5": +"object-is@npm:^1.1.5": version: 1.1.5 resolution: "object-is@npm:1.1.5" dependencies: @@ -1240,22 +1813,29 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a languageName: node linkType: hard -"object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.0 + resolution: "on-exit-leak-free@npm:2.1.0" + checksum: 7334d98b87b0c89c9b69c747760b21196ff35afdedc4eaf1a0a3a02964463d7f6802481b120e4c8298967c74773ca7b914ab2eb3d9b279010eb7f67ac4960eed languageName: node linkType: hard @@ -1286,6 +1866,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -1325,7 +1914,7 @@ __metadata: languageName: node linkType: hard -"path-parse@npm:^1.0.6": +"path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a @@ -1355,6 +1944,44 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:v1.0.0": + version: 1.0.0 + resolution: "pino-abstract-transport@npm:1.0.0" + dependencies: + readable-stream: ^4.0.0 + split2: ^4.0.0 + checksum: 05dd0eda52dd99fd204b39fe7b62656744b63e863bc052cdd5105d25f226a236966d0a46e39a1ace4838f6e988c608837ff946d2d0bc92835ca7baa0a3bff8d8 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^6.0.0": + version: 6.2.2 + resolution: "pino-std-serializers@npm:6.2.2" + checksum: aeb0662edc46ec926de9961ed4780a4f0586bb7c37d212cd469c069639e7816887a62c5093bc93f260a4e0900322f44fc8ab1343b5a9fa2864a888acccdb22a4 + languageName: node + linkType: hard + +"pino@npm:^8.12.0": + version: 8.15.0 + resolution: "pino@npm:8.15.0" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.1.1 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: v1.0.0 + pino-std-serializers: ^6.0.0 + process-warning: ^2.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.2.0 + safe-stable-stringify: ^2.3.1 + sonic-boom: ^3.1.0 + thread-stream: ^2.0.0 + bin: + pino: bin.js + checksum: 9a54d0757f0256201fad01346be1c18b0a4378704fa383df867189da12151d664d2bd18b1e53df70633fbff6c90fd3175228c0c971eaaa734939709cc1a0005b + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -1371,6 +1998,64 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^2.0.0, process-warning@npm:^2.2.0": + version: 2.2.0 + resolution: "process-warning@npm:2.2.0" + checksum: 394ae451c2622ee7d014a7196d36658fc1a5d5cc9f3bfeb54aadd5b77fcfecc89a30a25db259ae76ff49fde3f3f3dd7031dcdfb4da2e5445dac795549352e5d0 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0": + version: 4.4.2 + resolution: "readable-stream@npm:4.4.2" + dependencies: + abort-controller: ^3.0.0 + buffer: ^6.0.3 + events: ^3.3.0 + process: ^0.11.10 + string_decoder: ^1.3.0 + checksum: 6f4063763dbdb52658d22d3f49ca976420e1fbe16bbd241f744383715845350b196a2f08b8d6330f8e219153dff34b140aeefd6296da828e1041a7eab1f20d5e + languageName: node + linkType: hard + +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: fa060f19f2f447adf678d1376928c76379dce5f72bd334da301685ca6cdcb7b11356813332cc243c88470796bc2e2b1e2917fc10df9143dd93c2ea608694971d + languageName: node + linkType: hard + "reduce-flatten@npm:^2.0.0": version: 2.0.0 resolution: "reduce-flatten@npm:2.0.0" @@ -1378,13 +2063,14 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.3.0": - version: 1.4.1 - resolution: "regexp.prototype.flags@npm:1.4.1" +"regexp.prototype.flags@npm:^1.5.0": + version: 1.5.0 + resolution: "regexp.prototype.flags@npm:1.5.0" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 77944a3ea5ae84f391fa80bff9babfedc47eadc9dc38e282b5fd746368fb787deec89c68ce3114195bf6b5782b160280a278b62d41ccc6e125afab1a7f816de8 + define-properties: ^1.2.0 + functions-have-names: ^1.2.3 + checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 languageName: node linkType: hard @@ -1395,23 +2081,36 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": - version: 2.0.0-next.3 - resolution: "resolve@npm:2.0.0-next.3" +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.4": + version: 2.0.0-next.4 + resolution: "resolve@npm:2.0.0-next.4" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: f34b3b93ada77d64a6d590c06a83e198f3a827624c4ec972260905fa6c4d612164fbf0200d16d2beefea4ad1755b001f4a9a1293d8fc2322a8f7d6bf692c4ff5 + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.3#~builtin": - version: 2.0.0-next.3 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin::version=2.0.0-next.3&hash=c3c19d" +"resolve@patch:resolve@^2.0.0-next.4#~builtin": + version: 2.0.0-next.4 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=c3c19d" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: 21684b4d99a4877337cdbd5484311c811b3e8910edb5d868eec85c6e6550b0f570d911f9a384f9e176172d6713f2715bd0b0887fa512cb8c6aeece018de6a9f8 + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 languageName: node linkType: hard @@ -1425,12 +2124,24 @@ __metadata: languageName: node linkType: hard -"resumer@npm:^0.0.0": - version: 0.0.0 - resolution: "resumer@npm:0.0.0" - dependencies: - through: ~2.3.4 - checksum: 21b1c257aac24840643fae9bc99ca6447a71a0039e7c6dcf64d0ead447ce511eff158d529f1b6258ad12668e66ee3e49ff14932d2b88a3bd578f483e79708104 +"ret@npm:~0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0": + version: 1.3.0 + resolution: "rfdc@npm:1.3.0" + checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 languageName: node linkType: hard @@ -1438,10 +2149,12 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: + "@fastify/static": ^6.10.2 "@types/node": ^17.0.21 "@types/tape": ^4.13.2 apache-arrow: ^7.0.0 benny: ^3.7.1 + fastify: ^4.21.0 gh-pages: ^3.2.3 tape: ^5.5.2 ts-node: ^10.7.0 @@ -1450,12 +2163,90 @@ __metadata: languageName: unknown linkType: soft +"safe-array-concat@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-array-concat@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: f43cb98fe3b566327d0c09284de2b15fb85ae964a89495c1b1a5d50c7c8ed484190f4e5e71aacc167e16231940079b326f2c0807aea633d47cc7322f40a6b57f + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + +"safe-regex2@npm:^2.0.0": + version: 2.0.0 + resolution: "safe-regex2@npm:2.0.0" + dependencies: + ret: ~0.2.0 + checksum: f5e182fca040dedd50ae052ea0eb035d9903b2db71243d5d8b43299735857288ef2ab52546a368d9c6fd1333b2a0d039297925e78ffc14845354f3f6158af7c2 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + +"secure-json-parse@npm:^2.5.0": + version: 2.7.0 + resolution: "secure-json-parse@npm:2.7.0" + checksum: d9d7d5a01fc6db6115744ba23cf9e67ecfe8c524d771537c062ee05ad5c11b64c730bc58c7f33f60bd6877f96b86f0ceb9ea29644e4040cb757f6912d4dd6737 + languageName: node + linkType: hard + "semver@npm:^6.0.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.5.0": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"set-cookie-parser@npm:^2.4.1": + version: 2.6.0 + resolution: "set-cookie-parser@npm:2.6.0" + checksum: bf11ebc594c53d84588f1b4c04f1b8ce14e0498b1c011b3d76b5c6d5aac481bbc3f7c5260ec4ce99bdc1d9aed19f9fc315e73166a36ca74d0f12349a73f6bdc9 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 languageName: node linkType: hard @@ -1470,7 +2261,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.3, side-channel@npm:^1.0.4": +"side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" dependencies: @@ -1499,6 +2290,38 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^3.1.0": + version: 3.3.0 + resolution: "sonic-boom@npm:3.3.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: 4a290dd0f3edf49894bb72c631ee304dc3f9be0752c43d516808a365f341821f5cf49997c80ee7c0e67167e0e5131dc71afe7c58812858eb965d6b9746c0cac7 + languageName: node + linkType: hard + +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: ^1.0.4 + checksum: d04173690b2efa40e24ab70e5e51a3ff31d56d699550cfad084104ab3381390daccb36652b25755e420245f3b0737de66c1879eaa2a8d4fc0a78f9bf892fcb42 + languageName: node + linkType: hard + "string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -1510,34 +2333,45 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.5": - version: 1.2.5 - resolution: "string.prototype.trim@npm:1.2.5" +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: d9f748ffca2a3ce722c421f7c2993b6490ec0cf19d9cb0904598c744e9367e54a3f13c7b99c8c0966c8a76484bd656a60281daa5d0534cc222cd72193fd63034 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimend@npm:1.0.4" +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimstart@npm:1.0.4" +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + +"string_decoder@npm:^1.3.0": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 languageName: node linkType: hard @@ -1568,6 +2402,13 @@ __metadata: languageName: node linkType: hard +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + "table-layout@npm:^1.0.1": version: 1.0.2 resolution: "table-layout@npm:1.0.2" @@ -1581,40 +2422,56 @@ __metadata: linkType: hard "tape@npm:^5.5.2": - version: 5.5.2 - resolution: "tape@npm:5.5.2" + version: 5.6.6 + resolution: "tape@npm:5.6.6" dependencies: - array.prototype.every: ^1.1.3 + "@ljharb/resumer": ^0.0.1 + "@ljharb/through": ^2.3.9 + array.prototype.every: ^1.1.4 call-bind: ^1.0.2 - deep-equal: ^2.0.5 - defined: ^1.0.0 + deep-equal: ^2.2.2 + defined: ^1.0.1 dotignore: ^0.1.2 for-each: ^0.3.3 get-package-type: ^0.1.0 - glob: ^7.2.0 + glob: ^7.2.3 has: ^1.0.3 has-dynamic-import: ^2.0.1 inherits: ^2.0.4 is-regex: ^1.1.4 - minimist: ^1.2.5 - object-inspect: ^1.12.0 + minimist: ^1.2.8 + object-inspect: ^1.12.3 object-is: ^1.1.5 object-keys: ^1.1.1 - object.assign: ^4.1.2 - resolve: ^2.0.0-next.3 - resumer: ^0.0.0 - string.prototype.trim: ^1.2.5 - through: ^2.3.8 + object.assign: ^4.1.4 + resolve: ^2.0.0-next.4 + string.prototype.trim: ^1.2.7 bin: tape: bin/tape - checksum: c76059318024880794bee0411a9dbc29869c251219ec69c44b7204e1c30ebe8e163cb2e46cf3bb125b710f1d6b537f17cf9938f5026d47dc93569bb615030178 + checksum: aac4722c7104f8478c8079aa1f441636b720f432074355c2edb1b0c0e2f2822004af2097669186d65ce7c70c57164d85d7da3662338e53515bdb778f5412af30 + languageName: node + linkType: hard + +"thread-stream@npm:^2.0.0": + version: 2.3.0 + resolution: "thread-stream@npm:2.3.0" + dependencies: + real-require: ^0.2.0 + checksum: e9ea58f9f36320165b41c2aae5c439bf68bd3575eb533c458483d8b290e31d519979e351408c7d6e248711611434332c2a3aae2165650b028cc3eb9b1052ac16 + languageName: node + linkType: hard + +"tiny-lru@npm:^11.0.1": + version: 11.0.1 + resolution: "tiny-lru@npm:11.0.1" + checksum: 709ab58a454028eae15dd249518a1e348520e22514e52fd625ef89ba04a42599522e9f6cc89f50f76d3809cc46cac352bd0b63f052d23562e7adafe3e728531a languageName: node linkType: hard -"through@npm:^2.3.8, through@npm:~2.3.4": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 languageName: node linkType: hard @@ -1628,10 +2485,10 @@ __metadata: linkType: hard "ts-node@npm:^10.7.0": - version: 10.7.0 - resolution: "ts-node@npm:10.7.0" + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" dependencies: - "@cspotcode/source-map-support": 0.7.0 + "@cspotcode/source-map-support": ^0.8.0 "@tsconfig/node10": ^1.0.7 "@tsconfig/node12": ^1.0.7 "@tsconfig/node14": ^1.0.0 @@ -1642,7 +2499,7 @@ __metadata: create-require: ^1.1.0 diff: ^4.0.1 make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.0 + v8-compile-cache-lib: ^3.0.1 yn: 3.1.1 peerDependencies: "@swc/core": ">=1.2.50" @@ -1661,14 +2518,14 @@ __metadata: ts-node-script: dist/bin-script.js ts-node-transpile-only: dist/bin-transpile.js ts-script: dist/bin-script-deprecated.js - checksum: 2a379e43f7478d0b79e1e63af91fe222d83857727957df4bd3bdf3c0a884de5097b12feb9bbf530074526b8874c0338b0e6328cf334f3a5e2c49c71e837273f7 + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 languageName: node linkType: hard "tslib@npm:^2.3.1": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 + version: 2.6.1 + resolution: "tslib@npm:2.6.1" + checksum: b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe languageName: node linkType: hard @@ -1679,40 +2536,87 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + 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 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + "typedoc@npm:^0.22.13": - version: 0.22.13 - resolution: "typedoc@npm:0.22.13" + version: 0.22.18 + resolution: "typedoc@npm:0.22.18" dependencies: - glob: ^7.2.0 + glob: ^8.0.3 lunr: ^2.3.9 - marked: ^4.0.12 - minimatch: ^5.0.1 + marked: ^4.0.16 + minimatch: ^5.1.0 shiki: ^0.10.1 peerDependencies: - typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x + typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x bin: typedoc: bin/typedoc - checksum: e453114fbbb5e3e366bcfde40fc3f7d76a038dbc3953e6cc9c9dd8f9747048ed77c2d082671e91537fb26bb11f7fc5846f9568262adf0087b328b3f96a47a85a + checksum: b813d8129682f6ed5a4e96bacaf019e4da1d2744ca89fef850d6bb4c034616567ce67e6a7f5cfc5f00aac573f0b45d44b1427aafa262ab88dce6b460cb9e744c languageName: node linkType: hard "typescript@npm:^4.6.2": - version: 4.6.2 - resolution: "typescript@npm:4.6.2" + version: 4.9.5 + resolution: "typescript@npm:4.9.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8a44ed7e6f6c4cb1ebe8cf236ecda2fb119d84dcf0fbd77e707b2dfea1bbcfc4e366493a143513ce7f57203c75da9d4e20af6fe46de89749366351046be7577c + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db languageName: node linkType: hard "typescript@patch:typescript@^4.6.2#~builtin": - version: 4.6.2 - resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin::version=4.6.2&hash=5d3a66" + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 40b493a71747fb89fa70df104e2c4a5e284b43750af5bea024090a5261cefa387f7a9372411b13030f7bf5555cee4275443d08805642ae5c74ef76740854a4c7 + checksum: 1f8f3b6aaea19f0f67cba79057674ba580438a7db55057eb89cc06950483c5d632115c14077f6663ea76fd09fce3c190e6414bb98582ec80aa5a4eaf345d5b68 languageName: node linkType: hard @@ -1730,15 +2634,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" dependencies: - function-bind: ^1.1.1 - has-bigints: ^1.0.1 - has-symbols: ^1.0.2 + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 which-boxed-primitive: ^1.0.2 - checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 languageName: node linkType: hard @@ -1756,17 +2660,26 @@ __metadata: languageName: node linkType: hard -"v8-compile-cache-lib@npm:^3.0.0": - version: 3.0.0 - resolution: "v8-compile-cache-lib@npm:3.0.0" - checksum: 674e312bbca796584b61dc915f33c7e7dc4e06d196e0048cb772c8964493a1ec723f1dd014d9419fd55c24a6eae148f60769da23f622e05cd13268063fa1ed6b +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 languageName: node linkType: hard "vscode-oniguruma@npm:^1.6.1": - version: 1.6.2 - resolution: "vscode-oniguruma@npm:1.6.2" - checksum: 6b754acdafd5b68242ea5938bb00a32effc16c77f471d4f0f337d879d0e8e592622998e2441f42d9a7ff799c1593f31c11f26ca8d9bf9917e3ca881d3c1f3e19 + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 languageName: node linkType: hard @@ -1777,7 +2690,7 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.1, which-boxed-primitive@npm:^1.0.2": +"which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" dependencies: @@ -1802,17 +2715,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2": - version: 1.1.7 - resolution: "which-typed-array@npm:1.1.7" +"which-typed-array@npm:^1.1.10, which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.9": + version: 1.1.11 + resolution: "which-typed-array@npm:1.1.11" dependencies: available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 - es-abstract: ^1.18.5 - foreach: ^2.0.5 + for-each: ^0.3.3 + gopd: ^1.0.1 has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.7 - checksum: 147837cf5866e36b6b2e427731709e02f79f1578477cbde68ed773a5307520a6cb6836c73c79c30690a473266ee59010b83b6d9b25d8d677a40ff77fb37a8a84 + checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 languageName: node linkType: hard @@ -1844,9 +2756,23 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 languageName: node linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard