From bff6728c685b65d19781a26bb1e5990362f16c75 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Tue, 31 Dec 2024 16:43:14 +0100 Subject: [PATCH 01/17] feat(library-config): Add library config support --- Cargo.lock | 352 +++++++++++++++++++++++++++++++ Cargo.toml | 3 +- crates/library-config/Cargo.toml | 25 +++ crates/library-config/index.d.ts | 12 ++ crates/library-config/src/lib.rs | 100 +++++++++ test/library-config/.gitignore | 1 + test/library-config/README.md | 17 ++ test/library-config/config.yaml | 8 + test/library-config/index.js | 16 ++ test/library-config/package.json | 10 + 10 files changed, 543 insertions(+), 1 deletion(-) create mode 100644 crates/library-config/Cargo.toml create mode 100644 crates/library-config/index.d.ts create mode 100644 crates/library-config/src/lib.rs create mode 100644 test/library-config/.gitignore create mode 100644 test/library-config/README.md create mode 100644 test/library-config/config.yaml create mode 100644 test/library-config/index.js create mode 100644 test/library-config/package.json diff --git a/Cargo.lock b/Cargo.lock index c042060..8fd589a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" version = "1.0.93" @@ -168,6 +217,15 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "build_common" +version = "14.3.1" +dependencies = [ + "cbindgen", + "serde", + "serde_json", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -186,6 +244,25 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +[[package]] +name = "cbindgen" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" +dependencies = [ + "clap", + "heck", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.87", + "tempfile", + "toml", +] + [[package]] name = "cc" version = "1.1.31" @@ -236,6 +313,33 @@ dependencies = [ "libloading", ] +[[package]] +name = "clap" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "cmake" version = "0.1.51" @@ -267,6 +371,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "convert_case" version = "0.6.0" @@ -383,6 +503,16 @@ dependencies = [ "prost", ] +[[package]] +name = "datadog-library-config-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "build_common", + "serde", + "serde_yaml", +] + [[package]] name = "datadog-trace-normalization" version = "6.0.0" @@ -541,6 +671,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "flate2" version = "1.0.34" @@ -659,8 +795,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -696,6 +834,12 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -909,6 +1053,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -979,6 +1129,19 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "library-config" +version = "0.1.0" +dependencies = [ + "anyhow", + "datadog-library-config-ffi", + "getrandom", + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-test", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1015,6 +1178,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1556,6 +1729,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.26" @@ -1589,6 +1771,12 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "sct" version = "0.7.1" @@ -1643,6 +1831,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" version = "0.11.15" @@ -1686,6 +1885,28 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1747,6 +1968,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -1796,6 +2023,19 @@ dependencies = [ "libc", ] +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "tokio" version = "1.41.1" @@ -1858,6 +2098,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.3" @@ -1901,6 +2175,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" @@ -1913,6 +2193,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.11.0" @@ -1929,6 +2215,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1970,6 +2266,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.95" @@ -1999,6 +2307,32 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +[[package]] +name = "wasm-bindgen-test" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "minicov", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "web-sys" version = "0.3.72" @@ -2047,6 +2381,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2210,6 +2553,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 7731b6c..408ea9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] default-members = [ - "crates/crashtracker" + "crates/crashtracker", + "crates/library-config" ] members = [ "crates/*" diff --git a/crates/library-config/Cargo.toml b/crates/library-config/Cargo.toml new file mode 100644 index 0000000..4a042c2 --- /dev/null +++ b/crates/library-config/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "library-config" +version = "0.1.0" +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = "1" +# TODO: set the right dependencies +# datadog-library-config-ffi = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } +datadog-library-config-ffi = { path = "../../../libdatadog/library-config-ffi" } + +wasm-bindgen = "0.2.84" +serde = { version = "1.0", features = ["derive"] } +serde-wasm-bindgen = "0.4" +getrandom = { version = "0.2", features = ["js"] } + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/crates/library-config/index.d.ts b/crates/library-config/index.d.ts new file mode 100644 index 0000000..c47d3ac --- /dev/null +++ b/crates/library-config/index.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export type JsConfigurator = Configurator +export declare class Configurator { + constructor(debugLogs: boolean) + setEnvp(envp: Array): void + setArgs(args: Array): void + getConfiguration(configString: string): Record +} diff --git a/crates/library-config/src/lib.rs b/crates/library-config/src/lib.rs new file mode 100644 index 0000000..8fb9a09 --- /dev/null +++ b/crates/library-config/src/lib.rs @@ -0,0 +1,100 @@ +use wasm_bindgen::prelude::*; +use datadog_library_config_ffi::slice; + +#[wasm_bindgen] +pub struct JsConfigurator { + configurator: Box, + envp: Vec, + args: Vec, +} + +#[wasm_bindgen] +impl JsConfigurator { + #[wasm_bindgen(constructor)] + pub fn new(debug_logs: bool) -> Self { + JsConfigurator { + configurator: datadog_library_config_ffi::ddog_library_configurator_new(debug_logs), + envp: Vec::new(), + args: Vec::new(), + } + } + + #[wasm_bindgen] + pub fn set_envp(&mut self, envp: Box<[JsValue]>) -> Result<(), JsValue> { + self.envp = envp.iter() + .filter_map(|val| val.as_string()) + .collect(); + Ok(()) + } + + #[wasm_bindgen] + pub fn set_args(&mut self, args: Box<[JsValue]>) -> Result<(), JsValue> { + self.args = args.iter() + .filter_map(|val| val.as_string()) + .collect(); + Ok(()) + } + + #[wasm_bindgen] + pub fn get_configuration( + &self, + config_string: String, + ) -> Result { + let envp_slices: Vec = self + .envp + .iter() + .map(|s| slice::CharSlice::from(s.as_str())) + .collect(); + let envp_slice = slice::Slice::from(&envp_slices); + + let args_slices: Vec = self + .args + .iter() + .map(|s| slice::CharSlice::from(s.as_str())) + .collect(); + let args_slice = slice::Slice::from(&args_slices); + + let res_config = self.configurator.get_configuration_from_bytes( + datadog_library_config_ffi::static_config::ProcessInfo { + envp: envp_slice, + args: args_slice, + language: slice::CharSlice::from("nodejs"), + }, + slice::CharSlice::from(config_string.as_str()), + ); + + match res_config { + Ok(config) => { + let mut hashmap = std::collections::HashMap::new(); + config.iter().for_each(|c| { + let key = String::from_utf8_lossy(c.name.to_env_name().to_bytes()).to_string(); + let value: String; + match &c.value { + datadog_library_config_ffi::static_config::LibraryConfigValue::StrVal( + v, + ) => { + value = String::from_utf8_lossy(v.as_cstr().into_std().to_bytes()) + .to_string(); + } + datadog_library_config_ffi::static_config::LibraryConfigValue::NumVal( + v, + ) => { + value = v.to_string(); + } + datadog_library_config_ffi::static_config::LibraryConfigValue::BoolVal( + v, + ) => { + value = v.to_string(); + } + } + hashmap.insert(key, value); + }); + Ok(serde_wasm_bindgen::to_value(&hashmap)?) + } + Err(e) => Err(JsValue::from_str(&format!( + "Failed to get configuration: {:?}", + e + ))), + } + } +} diff --git a/test/library-config/.gitignore b/test/library-config/.gitignore new file mode 100644 index 0000000..5fff1d9 --- /dev/null +++ b/test/library-config/.gitignore @@ -0,0 +1 @@ +pkg diff --git a/test/library-config/README.md b/test/library-config/README.md new file mode 100644 index 0000000..7f36661 --- /dev/null +++ b/test/library-config/README.md @@ -0,0 +1,17 @@ +# Libconfig example + +## How to run +Set the following env vars: +```bash +export OS=$(uname | tr '[:upper:]' '[:lower:]') # darwin / linux / windows +export ARCH=$(arch) # arm64 / amd64 +export LIBC='' # glibc / musl if on linux, else empty +``` + +From repository root +```bash +wasm-pack build ./crates/library-config +mv ./crates/library-config/pkg ./test/library-config + +node --experimental-modules --experimental-wasm-modules test/library-config/index.js +``` diff --git a/test/library-config/config.yaml b/test/library-config/config.yaml new file mode 100644 index 0000000..0bdcd11 --- /dev/null +++ b/test/library-config/config.yaml @@ -0,0 +1,8 @@ +rules: + - selectors: + - origin: language + matches: + - nodejs + operator: equals + configuration: + DD_SERVICE: my-service diff --git a/test/library-config/index.js b/test/library-config/index.js new file mode 100644 index 0000000..580d505 --- /dev/null +++ b/test/library-config/index.js @@ -0,0 +1,16 @@ +import * as libconfig from '/Users/baptiste.foy/go/src/github.com/DataDog/libdatadog-nodejs/test/library-config/pkg/library_config.js'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import fs from 'fs'; + +const rawConfig = fs.readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'config.yaml')); +let configurator = new libconfig.JsConfigurator(false); + +configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) +configurator.set_args(process.argv) + +// Apply each configuration as an environment variable +console.log("Configuration:") +configurator.get_configuration(rawConfig.toString()).forEach((value, key, map) => { + console.log(` - ${key}: ${value}`) +}); diff --git a/test/library-config/package.json b/test/library-config/package.json new file mode 100644 index 0000000..4e4bada --- /dev/null +++ b/test/library-config/package.json @@ -0,0 +1,10 @@ +{ + "private": true, + "main": "index.js", + "dependencies": { + "@datadog/segfaultify": "^0.1.1", + "body-parser": "^1.20.3", + "express": "^4.19.2" + }, + "type": "module" +} From 0e14199e64ee93cd8944ce24f558a549c4543587 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Wed, 8 Jan 2025 16:40:21 +0100 Subject: [PATCH 02/17] switch to wasm --- Cargo.lock | 213 +------------------------------ crates/library-config/Cargo.toml | 5 +- crates/library-config/index.d.ts | 12 -- crates/library-config/src/lib.rs | 59 +++------ test/library-config/README.md | 7 - test/library-config/config.yaml | 2 +- 6 files changed, 24 insertions(+), 274 deletions(-) delete mode 100644 crates/library-config/index.d.ts diff --git a/Cargo.lock b/Cargo.lock index 8fd589a..cfd8ad4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,55 +59,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys 0.59.0", -] - [[package]] name = "anyhow" version = "1.0.93" @@ -217,15 +168,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "build_common" -version = "14.3.1" -dependencies = [ - "cbindgen", - "serde", - "serde_json", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -244,25 +186,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" -[[package]] -name = "cbindgen" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" -dependencies = [ - "clap", - "heck", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 2.0.87", - "tempfile", - "toml", -] - [[package]] name = "cc" version = "1.1.31" @@ -313,33 +236,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - [[package]] name = "cmake" version = "0.1.51" @@ -371,12 +267,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -504,11 +394,10 @@ dependencies = [ ] [[package]] -name = "datadog-library-config-ffi" +name = "datadog-library-config" version = "0.0.1" dependencies = [ "anyhow", - "build_common", "serde", "serde_yaml", ] @@ -671,12 +560,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "flate2" version = "1.0.34" @@ -795,10 +678,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -834,12 +715,6 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -1053,12 +928,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.10.5" @@ -1134,8 +1003,7 @@ name = "library-config" version = "0.1.0" dependencies = [ "anyhow", - "datadog-library-config-ffi", - "getrandom", + "datadog-library-config", "serde", "serde-wasm-bindgen", "wasm-bindgen", @@ -1885,15 +1753,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -1968,12 +1827,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - [[package]] name = "subtle" version = "2.6.1" @@ -2023,19 +1876,6 @@ dependencies = [ "libc", ] -[[package]] -name = "tempfile" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "tokio" version = "1.41.1" @@ -2098,40 +1938,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - [[package]] name = "tower-service" version = "0.3.3" @@ -2193,12 +1999,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" version = "1.11.0" @@ -2553,15 +2353,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winnow" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - [[package]] name = "zerocopy" version = "0.7.35" diff --git a/crates/library-config/Cargo.toml b/crates/library-config/Cargo.toml index 4a042c2..c668d88 100644 --- a/crates/library-config/Cargo.toml +++ b/crates/library-config/Cargo.toml @@ -9,13 +9,12 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" # TODO: set the right dependencies -# datadog-library-config-ffi = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } -datadog-library-config-ffi = { path = "../../../libdatadog/library-config-ffi" } +# datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } +datadog-library-config = { path = "../../../libdatadog/library-config" } wasm-bindgen = "0.2.84" serde = { version = "1.0", features = ["derive"] } serde-wasm-bindgen = "0.4" -getrandom = { version = "0.2", features = ["js"] } [dev-dependencies] wasm-bindgen-test = "0.3.34" diff --git a/crates/library-config/index.d.ts b/crates/library-config/index.d.ts deleted file mode 100644 index c47d3ac..0000000 --- a/crates/library-config/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ - -/* auto-generated by NAPI-RS */ - -export type JsConfigurator = Configurator -export declare class Configurator { - constructor(debugLogs: boolean) - setEnvp(envp: Array): void - setArgs(args: Array): void - getConfiguration(configString: string): Record -} diff --git a/crates/library-config/src/lib.rs b/crates/library-config/src/lib.rs index 8fb9a09..0f6921f 100644 --- a/crates/library-config/src/lib.rs +++ b/crates/library-config/src/lib.rs @@ -1,9 +1,10 @@ +use std::collections::HashMap; + use wasm_bindgen::prelude::*; -use datadog_library_config_ffi::slice; #[wasm_bindgen] pub struct JsConfigurator { - configurator: Box, + configurator: Box, envp: Vec, args: Vec, } @@ -13,7 +14,7 @@ impl JsConfigurator { #[wasm_bindgen(constructor)] pub fn new(debug_logs: bool) -> Self { JsConfigurator { - configurator: datadog_library_config_ffi::ddog_library_configurator_new(debug_logs), + configurator: Box::new(datadog_library_config::Configurator::new(debug_logs)), envp: Vec::new(), args: Vec::new(), } @@ -40,57 +41,35 @@ impl JsConfigurator { &self, config_string: String, ) -> Result { - let envp_slices: Vec = self + let envp: Vec<&[u8]> = self .envp .iter() - .map(|s| slice::CharSlice::from(s.as_str())) + .map(|s| s.as_bytes()) .collect(); - let envp_slice = slice::Slice::from(&envp_slices); - let args_slices: Vec = self + let args: Vec<_> = self .args .iter() - .map(|s| slice::CharSlice::from(s.as_str())) + .map(|s| s.as_bytes()) .collect(); - let args_slice = slice::Slice::from(&args_slices); - let res_config = self.configurator.get_configuration_from_bytes( - datadog_library_config_ffi::static_config::ProcessInfo { - envp: envp_slice, - args: args_slice, - language: slice::CharSlice::from("nodejs"), + let res_config = self.configurator.get_config_from_bytes( + config_string.as_bytes(), + datadog_library_config::ProcessInfo { + envp: &envp, + args: &args, + language: b"nodejs", }, - slice::CharSlice::from(config_string.as_str()), ); match res_config { Ok(config) => { - let mut hashmap = std::collections::HashMap::new(); - config.iter().for_each(|c| { - let key = String::from_utf8_lossy(c.name.to_env_name().to_bytes()).to_string(); - let value: String; - match &c.value { - datadog_library_config_ffi::static_config::LibraryConfigValue::StrVal( - v, - ) => { - value = String::from_utf8_lossy(v.as_cstr().into_std().to_bytes()) - .to_string(); - } - datadog_library_config_ffi::static_config::LibraryConfigValue::NumVal( - v, - ) => { - value = v.to_string(); - } - datadog_library_config_ffi::static_config::LibraryConfigValue::BoolVal( - v, - ) => { - value = v.to_string(); - } - } - hashmap.insert(key, value); - }); + let hashmap: HashMap = config.into_iter().map(|c| { + let key = c.name.to_str().to_owned(); + (key, c.value) + }).collect(); Ok(serde_wasm_bindgen::to_value(&hashmap)?) - } + }, Err(e) => Err(JsValue::from_str(&format!( "Failed to get configuration: {:?}", e diff --git a/test/library-config/README.md b/test/library-config/README.md index 7f36661..c80ffee 100644 --- a/test/library-config/README.md +++ b/test/library-config/README.md @@ -1,13 +1,6 @@ # Libconfig example ## How to run -Set the following env vars: -```bash -export OS=$(uname | tr '[:upper:]' '[:lower:]') # darwin / linux / windows -export ARCH=$(arch) # arm64 / amd64 -export LIBC='' # glibc / musl if on linux, else empty -``` - From repository root ```bash wasm-pack build ./crates/library-config diff --git a/test/library-config/config.yaml b/test/library-config/config.yaml index 0bdcd11..597c05b 100644 --- a/test/library-config/config.yaml +++ b/test/library-config/config.yaml @@ -5,4 +5,4 @@ rules: - nodejs operator: equals configuration: - DD_SERVICE: my-service + DD_SERVICE: my-service-{{ environment[HOME] }} From e5bcdaf7865ad5880bd8395853ea85a21bba7e74 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 17 Jan 2025 15:55:10 +0100 Subject: [PATCH 03/17] use nodejs-specific wasm --- crates/library-config/src/lib.rs | 4 ++-- load.js | 10 ++++------ test/library-config/README.md | 12 ++++++++++-- test/library-config/config.yaml | 2 +- test/library-config/index.js | 13 +++++++------ test/library-config/package.json | 3 +-- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/crates/library-config/src/lib.rs b/crates/library-config/src/lib.rs index 0f6921f..897885b 100644 --- a/crates/library-config/src/lib.rs +++ b/crates/library-config/src/lib.rs @@ -12,9 +12,9 @@ pub struct JsConfigurator { #[wasm_bindgen] impl JsConfigurator { #[wasm_bindgen(constructor)] - pub fn new(debug_logs: bool) -> Self { + pub fn new() -> Self { JsConfigurator { - configurator: Box::new(datadog_library_config::Configurator::new(debug_logs)), + configurator: Box::new(datadog_library_config::Configurator::new(false)), // No debug log as WASM can't write to stdout envp: Vec::new(), args: Vec::new(), } diff --git a/load.js b/load.js index 6ce11fe..1a907e8 100644 --- a/load.js +++ b/load.js @@ -14,17 +14,16 @@ const ABI = process.versions.modules const inWebpack = typeof __webpack_require__ === 'function' const runtimeRequire = inWebpack ? __non_webpack_require__ : require -function maybeLoad (name) { +function maybeLoad (name, binary = false) { try { - return load(name) + return load(name, binary) } catch (e) { // Not found, skip. } } -function load (name) { - const filename = find(name) - +function load (name, binary = false) { + const filename = find(name, binary) if (!filename) { throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH}.`) } @@ -45,7 +44,6 @@ function find (name, binary = false) { const prebuildFolder = path.join(root, 'prebuilds', folder) const file = findFile(prebuildFolder, name, binary) - if (!file) return return path.join(prebuildFolder, file) diff --git a/test/library-config/README.md b/test/library-config/README.md index c80ffee..7bee164 100644 --- a/test/library-config/README.md +++ b/test/library-config/README.md @@ -1,10 +1,18 @@ # Libconfig example ## How to run +Set the following env vars: +```bash +export OS=$(uname | tr '[:upper:]' '[:lower:]') # darwin / linux / windows +export ARCH=$(arch) # arm64 / amd64 +export LIBC='' # glibc / musl if on linux, else empty +``` + From repository root ```bash -wasm-pack build ./crates/library-config -mv ./crates/library-config/pkg ./test/library-config +wasm-pack build --target nodejs ./crates/library-config +mkdir -p ./prebuilds/${OS}-${ARCH}${LIBC} +mv ./crates/library-config/pkg ./prebuilds/${OS}-${ARCH}${LIBC} node --experimental-modules --experimental-wasm-modules test/library-config/index.js ``` diff --git a/test/library-config/config.yaml b/test/library-config/config.yaml index 597c05b..6e0c9cd 100644 --- a/test/library-config/config.yaml +++ b/test/library-config/config.yaml @@ -5,4 +5,4 @@ rules: - nodejs operator: equals configuration: - DD_SERVICE: my-service-{{ environment[HOME] }} + DD_SERVICE: my-service-{{ environment_variables[HOME] }} diff --git a/test/library-config/index.js b/test/library-config/index.js index 580d505..954a342 100644 --- a/test/library-config/index.js +++ b/test/library-config/index.js @@ -1,10 +1,11 @@ -import * as libconfig from '/Users/baptiste.foy/go/src/github.com/DataDog/libdatadog-nodejs/test/library-config/pkg/library_config.js'; -import path from 'path'; -import { fileURLToPath } from 'url'; -import fs from 'fs'; +const path = require('path'); +const fs = require('fs'); +const loader = require('../../load.js'); -const rawConfig = fs.readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'config.yaml')); -let configurator = new libconfig.JsConfigurator(false); +const libconfig = loader.maybeLoad('library_config.js', true); + +const rawConfig = fs.readFileSync(path.join(__dirname, 'config.yaml')); +let configurator = new libconfig.JsConfigurator(); configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) configurator.set_args(process.argv) diff --git a/test/library-config/package.json b/test/library-config/package.json index 4e4bada..2f81fde 100644 --- a/test/library-config/package.json +++ b/test/library-config/package.json @@ -5,6 +5,5 @@ "@datadog/segfaultify": "^0.1.1", "body-parser": "^1.20.3", "express": "^4.19.2" - }, - "type": "module" + } } From d75b34122456d6608f8b02718c9b7980a1265325 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 17 Jan 2025 16:07:39 +0100 Subject: [PATCH 04/17] right dependency version --- Cargo.lock | 1 + crates/library-config/Cargo.toml | 4 +--- load.js | 25 ++++++++++++++++++++----- test/library-config/README.md | 11 ++--------- test/library-config/index.js | 2 +- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cfd8ad4..ad86da4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -396,6 +396,7 @@ dependencies = [ [[package]] name = "datadog-library-config" version = "0.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "serde", diff --git a/crates/library-config/Cargo.toml b/crates/library-config/Cargo.toml index c668d88..f5284ae 100644 --- a/crates/library-config/Cargo.toml +++ b/crates/library-config/Cargo.toml @@ -8,9 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -# TODO: set the right dependencies -# datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } -datadog-library-config = { path = "../../../libdatadog/library-config" } +datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v15.0.0" } wasm-bindgen = "0.2.84" serde = { version = "1.0", features = ["derive"] } diff --git a/load.js b/load.js index 1a907e8..f834dc5 100644 --- a/load.js +++ b/load.js @@ -14,16 +14,30 @@ const ABI = process.versions.modules const inWebpack = typeof __webpack_require__ === 'function' const runtimeRequire = inWebpack ? __non_webpack_require__ : require -function maybeLoad (name, binary = false) { +function maybeLoadWASM(name) { try { - return load(name, binary) + const root = __dirname + const prebuilds = path.join(root, 'prebuilds') + const folders = readdirSync(prebuilds) + if (folders.find(f => f === name)) { + return runtimeRequire(path.join(prebuilds, name, `${name}.js`)) + } + } catch (e) { + // Not found, skip. + } +} + +function maybeLoad (name) { + try { + return load(name) } catch (e) { // Not found, skip. } } -function load (name, binary = false) { - const filename = find(name, binary) +function load (name) { + const filename = find(name) + if (!filename) { throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH}.`) } @@ -44,6 +58,7 @@ function find (name, binary = false) { const prebuildFolder = path.join(root, 'prebuilds', folder) const file = findFile(prebuildFolder, name, binary) + if (!file) return return path.join(prebuildFolder, file) @@ -71,4 +86,4 @@ function findFile (root, name, binary = false) { || files.find(f => f === `${name}.node`) } -module.exports = { find, load, maybeLoad } +module.exports = { find, load, maybeLoad, maybeLoadWASM } diff --git a/test/library-config/README.md b/test/library-config/README.md index 7bee164..f6dc7e1 100644 --- a/test/library-config/README.md +++ b/test/library-config/README.md @@ -1,18 +1,11 @@ # Libconfig example ## How to run -Set the following env vars: -```bash -export OS=$(uname | tr '[:upper:]' '[:lower:]') # darwin / linux / windows -export ARCH=$(arch) # arm64 / amd64 -export LIBC='' # glibc / musl if on linux, else empty -``` - From repository root ```bash wasm-pack build --target nodejs ./crates/library-config -mkdir -p ./prebuilds/${OS}-${ARCH}${LIBC} -mv ./crates/library-config/pkg ./prebuilds/${OS}-${ARCH}${LIBC} +mkdir -p ./prebuilds/library_config +mv ./crates/library-config/pkg ./prebuilds/library_config node --experimental-modules --experimental-wasm-modules test/library-config/index.js ``` diff --git a/test/library-config/index.js b/test/library-config/index.js index 954a342..b3fbd54 100644 --- a/test/library-config/index.js +++ b/test/library-config/index.js @@ -2,7 +2,7 @@ const path = require('path'); const fs = require('fs'); const loader = require('../../load.js'); -const libconfig = loader.maybeLoad('library_config.js', true); +const libconfig = loader.maybeLoadWASM('library_config'); const rawConfig = fs.readFileSync(path.join(__dirname, 'config.yaml')); let configurator = new libconfig.JsConfigurator(); From 8c7fbb42d53e9ac2c518abf1e92d58dd6ce091ca Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Thu, 23 Jan 2025 17:00:44 +0100 Subject: [PATCH 05/17] test(ci): Build wasm differently --- .github/workflows/build.yml | 27 + .github/workflows/release.yml | 27 + Cargo.toml | 5 +- .../Cargo.toml | 4 +- .../src/lib.rs | 0 test.js | 4 +- test/crashtracker/.yarn/install-state.gz | Bin 0 -> 32714 bytes test/crashtracker/.yarnrc.yml | 1 + test/crashtracker/yarn.lock | 1057 ++++++++++------- test/library-config/README.md | 11 - .../library_config}/.gitignore | 0 test/wasm/library_config/README.md | 11 + .../library_config}/config.yaml | 2 +- .../library_config}/index.js | 10 +- .../library_config}/package.json | 0 test_wasm.js | 10 + 16 files changed, 697 insertions(+), 472 deletions(-) rename crates/{library-config => library_config}/Cargo.toml (90%) rename crates/{library-config => library_config}/src/lib.rs (100%) create mode 100644 test/crashtracker/.yarn/install-state.gz create mode 100644 test/crashtracker/.yarnrc.yml delete mode 100644 test/library-config/README.md rename test/{library-config => wasm/library_config}/.gitignore (100%) create mode 100644 test/wasm/library_config/README.md rename test/{library-config => wasm/library_config}/config.yaml (65%) rename test/{library-config => wasm/library_config}/index.js (71%) rename test/{library-config => wasm/library_config}/package.json (100%) create mode 100644 test_wasm.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c85d4b..090be50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,8 +7,35 @@ on: - main jobs: + build-test-wasm: + runs-on: ubuntu-latest + strategy: + matrix: + crate: + - library_config + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + - run: yarn install + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + - name: Build WASM + run: | + mkdir -p ./prebuilds/${{ matrix.crate }} + wasm-pack build --target nodejs ./crates/${{ matrix.crate }} --out-dir ../../prebuilds/${{ matrix.crate }} + - name: Test WASM + run: node test_wasm.js + - uses: actions/upload-artifact@v4 + with: + name: prebuilds-wasm + if-no-files-found: ignore + path: ./prebuilds/* + build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + needs: build-test-wasm with: package-manager: 'yarn' cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f2982b..da8c5e9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,35 @@ on: - v0.x jobs: + build-test-wasm: + runs-on: ubuntu-latest + strategy: + matrix: + crate: + - library_config + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + - run: yarn install + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + - name: Build WASM + run: | + mkdir -p ./prebuilds/${{ matrix.crate }} + wasm-pack build --target nodejs ./crates/${{ matrix.crate }} --out-dir ../../prebuilds/${{ matrix.crate }} + - name: Test WASM + run: node test_wasm.js + - uses: actions/upload-artifact@v4 + with: + name: prebuilds-wasm + if-no-files-found: ignore + path: ./prebuilds/* + build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + needs: build-test-wasm with: package-manager: 'yarn' cache: false diff --git a/Cargo.toml b/Cargo.toml index 408ea9d..b8ba21e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,9 @@ [workspace] default-members = [ - "crates/crashtracker", - "crates/library-config" + "crates/crashtracker" ] members = [ - "crates/*" + "crates/*", ] [profile.release] diff --git a/crates/library-config/Cargo.toml b/crates/library_config/Cargo.toml similarity index 90% rename from crates/library-config/Cargo.toml rename to crates/library_config/Cargo.toml index f5284ae..edb7dad 100644 --- a/crates/library-config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -19,4 +19,6 @@ wasm-bindgen-test = "0.3.34" [profile.release] # Tell `rustc` to optimize for small code size. -opt-level = "s" +opt-level = "z" +lto = true +strip = "debuginfo" diff --git a/crates/library-config/src/lib.rs b/crates/library_config/src/lib.rs similarity index 100% rename from crates/library-config/src/lib.rs rename to crates/library_config/src/lib.rs diff --git a/test.js b/test.js index f451472..822f194 100644 --- a/test.js +++ b/test.js @@ -6,5 +6,7 @@ const { execSync } = require('child_process') fs.readdirSync('test') .filter(file => file.endsWith('.js') || !file.includes('.')) .forEach(file => { - require('./test/' + file) + if (!file.includes('wasm')) { + require('./test/' + file) + } }) diff --git a/test/crashtracker/.yarn/install-state.gz b/test/crashtracker/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..66c3f876e139716f7a375fe075a97c06331dcd52 GIT binary patch literal 32714 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 literal 0 HcmV?d00001 diff --git a/test/crashtracker/.yarnrc.yml b/test/crashtracker/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/test/crashtracker/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock index 5a70c3a..df9dfac 100644 --- a/test/crashtracker/yarn.lock +++ b/test/crashtracker/yarn.lock @@ -1,480 +1,633 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! +__metadata: + version: 8 + cacheKey: 10c0 -"@datadog/segfaultify@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@datadog/segfaultify/-/segfaultify-0.1.1.tgz#bd12d31ad26c5d15dc1b8c32572ceb37dbb12651" - integrity sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw== +"@datadog/segfaultify@npm:^0.1.1": + version: 0.1.1 + resolution: "@datadog/segfaultify@npm:0.1.1" dependencies: - node-gyp-build "^3.9.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/146a466a1dcaf37e65fd3a234d1665c01891151539677f3ef1e58e8da221b02427daa7c7635dcb1d2860f3d3e515988a00ed62b136aba2583b3a4f34779d1fa8 + languageName: node + linkType: hard + +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -body-parser@1.20.3, body-parser@^1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 + languageName: node + linkType: hard + +"body-parser@npm:1.20.3, body-parser@npm:^1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" dependencies: - ms "2.0.0" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -express@^4.19.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"express@npm:^4.19.2": + version: 4.21.1 + resolution: "express@npm:4.21.1" dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.10" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.7.1" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.10" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/0c287867e5f6129d3def1edd9b63103a53c40d4dc8628839d4b6827e35eb8f0de5a4656f9d85f4457eba584f9871ebb2ad26c750b36bd75d9bbb8bcebdc4892c + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + 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" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: - function-bind "^1.1.2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + 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" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" dependencies: - safer-buffer ">= 2.1.2 < 3" - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"inherits@npm:2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -node-gyp-build@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" - integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== - -object-inspect@^1.13.1: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-gyp-build@npm:^3.9.0": + version: 3.9.0 + resolution: "node-gyp-build@npm:3.9.0" + bin: + node-gyp-build: ./bin.js + node-gyp-build-optional: ./optional.js + node-gyp-build-test: ./build-test.js + checksum: 10c0/0e7e39e5746728e6adf58803d9c3c732b6107f1af3df5128c4c2a6c9c0fb99a6c981ad0a7514d707adccbcfe303b4a92da7949408f1d3ec281f70d37bec29f60 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" dependencies: - ee-first "1.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 + 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" - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" dependencies: - side-channel "^1.0.6" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + "@datadog/segfaultify": "npm:^0.1.1" + body-parser: "npm:^1.20.3" + express: "npm:^4.19.2" + languageName: unknown + linkType: soft + +"safe-buffer@npm:5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + object-inspect: "npm:^1.13.1" + checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard diff --git a/test/library-config/README.md b/test/library-config/README.md deleted file mode 100644 index f6dc7e1..0000000 --- a/test/library-config/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Libconfig example - -## How to run -From repository root -```bash -wasm-pack build --target nodejs ./crates/library-config -mkdir -p ./prebuilds/library_config -mv ./crates/library-config/pkg ./prebuilds/library_config - -node --experimental-modules --experimental-wasm-modules test/library-config/index.js -``` diff --git a/test/library-config/.gitignore b/test/wasm/library_config/.gitignore similarity index 100% rename from test/library-config/.gitignore rename to test/wasm/library_config/.gitignore diff --git a/test/wasm/library_config/README.md b/test/wasm/library_config/README.md new file mode 100644 index 0000000..79bb2da --- /dev/null +++ b/test/wasm/library_config/README.md @@ -0,0 +1,11 @@ +# Libconfig example + +## How to run +From repository root +```bash +wasm-pack build --target nodejs ./crates/library_config +mkdir -p ./prebuilds/library_config +mv ./crates/library_config/pkg ./prebuilds/library_config + +node test/wasm/library_config/index.js +``` diff --git a/test/library-config/config.yaml b/test/wasm/library_config/config.yaml similarity index 65% rename from test/library-config/config.yaml rename to test/wasm/library_config/config.yaml index 6e0c9cd..0bdcd11 100644 --- a/test/library-config/config.yaml +++ b/test/wasm/library_config/config.yaml @@ -5,4 +5,4 @@ rules: - nodejs operator: equals configuration: - DD_SERVICE: my-service-{{ environment_variables[HOME] }} + DD_SERVICE: my-service diff --git a/test/library-config/index.js b/test/wasm/library_config/index.js similarity index 71% rename from test/library-config/index.js rename to test/wasm/library_config/index.js index b3fbd54..3221ad1 100644 --- a/test/library-config/index.js +++ b/test/wasm/library_config/index.js @@ -1,8 +1,10 @@ const path = require('path'); const fs = require('fs'); -const loader = require('../../load.js'); +const loader = require('../../../load.js'); +const assert = require('assert'); const libconfig = loader.maybeLoadWASM('library_config'); +assert(libconfig !== undefined); const rawConfig = fs.readFileSync(path.join(__dirname, 'config.yaml')); let configurator = new libconfig.JsConfigurator(); @@ -11,7 +13,9 @@ configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}= configurator.set_args(process.argv) // Apply each configuration as an environment variable -console.log("Configuration:") +let values = {} configurator.get_configuration(rawConfig.toString()).forEach((value, key, map) => { - console.log(` - ${key}: ${value}`) + values[key] = value }); + +assert.strictEqual(values['DD_SERVICE'], 'my-service') diff --git a/test/library-config/package.json b/test/wasm/library_config/package.json similarity index 100% rename from test/library-config/package.json rename to test/wasm/library_config/package.json diff --git a/test_wasm.js b/test_wasm.js new file mode 100644 index 0000000..762dd03 --- /dev/null +++ b/test_wasm.js @@ -0,0 +1,10 @@ +'use strict' + +const fs = require('fs') +const { execSync } = require('child_process') + +fs.readdirSync('test/wasm') + .filter(file => file.endsWith('.js') || !file.includes('.')) + .forEach(file => { + require('./test/wasm/' + file) + }) From 28d8a03bce7f27074077d73928eaa072547d6101 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 24 Jan 2025 14:56:28 +0100 Subject: [PATCH 06/17] bump libdatadog to 15.0.0 --- Cargo.lock | 20 ++++++++++---------- crates/crashtracker/Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad86da4..25049a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -361,14 +361,14 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 14.3.1", + "ddcommon 15.0.0", "ddtelemetry", "http 0.2.12", "hyper 0.14.31", @@ -387,8 +387,8 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "prost", ] @@ -468,8 +468,8 @@ dependencies = [ [[package]] name = "ddcommon" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "cc", @@ -497,13 +497,13 @@ dependencies = [ [[package]] name = "ddtelemetry" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 14.3.1", + "ddcommon 15.0.0", "futures", "hashbrown 0.14.5", "http 0.2.12", diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index b381f41..b63261f 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } +datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v15.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } From 8a7c0bbd6902854507945e9c566958f6b64a25a0 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 24 Jan 2025 15:00:56 +0100 Subject: [PATCH 07/17] optimize other crates for smaller size --- crates/collector/Cargo.toml | 6 ++++++ crates/crashtracker/Cargo.toml | 6 ++++++ crates/pipeline/Cargo.toml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/crates/collector/Cargo.toml b/crates/collector/Cargo.toml index 1c8f255..0ffbba4 100644 --- a/crates/collector/Cargo.toml +++ b/crates/collector/Cargo.toml @@ -15,3 +15,9 @@ collector = { git = "https://github.com/DataDog/libdatadog.git", branch = "rochd version = "1.0.0" default-features = false features = ["napi-6"] + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +strip = "debuginfo" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index b63261f..c7ceb90 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -18,3 +18,9 @@ datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +strip = "debuginfo" diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index e98036d..ca8ab23 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -15,3 +15,9 @@ data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", branch = "j version = "1.0.0" default-features = false features = ["napi-6"] + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "z" +lto = true +strip = "debuginfo" From 12e926c2c5525fe0297dd3ad6c3fcf724a7a4e88 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 31 Jan 2025 10:33:48 +0100 Subject: [PATCH 08/17] remove unexpected changed files --- test/crashtracker/.yarn/install-state.gz | Bin 32714 -> 0 bytes test/crashtracker/.yarnrc.yml | 1 - test/crashtracker/yarn.lock | 1057 +++++++++------------- 3 files changed, 452 insertions(+), 606 deletions(-) delete mode 100644 test/crashtracker/.yarn/install-state.gz delete mode 100644 test/crashtracker/.yarnrc.yml diff --git a/test/crashtracker/.yarn/install-state.gz b/test/crashtracker/.yarn/install-state.gz deleted file mode 100644 index 66c3f876e139716f7a375fe075a97c06331dcd52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32714 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 diff --git a/test/crashtracker/.yarnrc.yml b/test/crashtracker/.yarnrc.yml deleted file mode 100644 index 3186f3f..0000000 --- a/test/crashtracker/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock index df9dfac..5a70c3a 100644 --- a/test/crashtracker/yarn.lock +++ b/test/crashtracker/yarn.lock @@ -1,633 +1,480 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 -__metadata: - version: 8 - cacheKey: 10c0 -"@datadog/segfaultify@npm:^0.1.1": - version: 0.1.1 - resolution: "@datadog/segfaultify@npm:0.1.1" +"@datadog/segfaultify@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@datadog/segfaultify/-/segfaultify-0.1.1.tgz#bd12d31ad26c5d15dc1b8c32572ceb37dbb12651" + integrity sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw== dependencies: - node-gyp-build: "npm:^3.9.0" - checksum: 10c0/146a466a1dcaf37e65fd3a234d1665c01891151539677f3ef1e58e8da221b02427daa7c7635dcb1d2860f3d3e515988a00ed62b136aba2583b3a4f34779d1fa8 - languageName: node - linkType: hard - -"accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"body-parser@npm:1.20.3, body-parser@npm:^1.20.3": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" + node-gyp-build "^3.9.0" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" + mime-types "~2.1.34" + negotiator "0.6.3" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +body-parser@1.20.3, body-parser@^1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 - languageName: node - linkType: hard - -"cookie@npm:0.7.1": - version: 0.7.1 - resolution: "cookie@npm:0.7.1" - checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec - languageName: node - linkType: hard - -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" + ms "2.0.0" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 - languageName: node - linkType: hard - -"express@npm:^4.19.2": - version: 4.21.1 - resolution: "express@npm:4.21.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.3" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.7.1" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.3.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.3" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.10" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.13.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.19.0" - serve-static: "npm:1.16.2" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/0c287867e5f6129d3def1edd9b63103a53c40d4dc8628839d4b6827e35eb8f0de5a4656f9d85f4457eba584f9871ebb2ad26c750b36bd75d9bbb8bcebdc4892c - languageName: node - linkType: hard - -"finalhandler@npm:1.3.1": - version: 1.3.1 - resolution: "finalhandler@npm:1.3.1" + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.19.2: + version "4.21.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" + get-intrinsic "^1.1.3" + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" + function-bind "^1.1.2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"inherits@npm:2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.3": - version: 1.0.3 - resolution: "merge-descriptors@npm:1.0.3" - checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"node-gyp-build@npm:^3.9.0": - version: 3.9.0 - resolution: "node-gyp-build@npm:3.9.0" - bin: - node-gyp-build: ./bin.js - node-gyp-build-optional: ./optional.js - node-gyp-build-test: ./build-test.js - checksum: 10c0/0e7e39e5746728e6adf58803d9c3c732b6107f1af3df5128c4c2a6c9c0fb99a6c981ad0a7514d707adccbcfe303b4a92da7949408f1d3ec281f70d37bec29f60 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.10": - version: 0.1.10 - resolution: "path-to-regexp@npm:0.1.10" - checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-gyp-build@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" + integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== + +object-inspect@^1.13.1: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 - languageName: node - linkType: hard - -"qs@npm:6.13.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - side-channel: "npm:^1.0.6" - checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 - languageName: node - linkType: hard - -"range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"root-workspace-0b6124@workspace:.": - version: 0.0.0-use.local - resolution: "root-workspace-0b6124@workspace:." + side-channel "^1.0.6" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: - "@datadog/segfaultify": "npm:^0.1.1" - body-parser: "npm:^1.20.3" - express: "npm:^4.19.2" - languageName: unknown - linkType: soft - -"safe-buffer@npm:5.2.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"send@npm:0.19.0": - version: 0.19.0 - resolution: "send@npm:0.19.0" + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 - languageName: node - linkType: hard - -"serve-static@npm:1.16.2": - version: 1.16.2 - resolution: "serve-static@npm:1.16.2" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.19.0" - checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f - languageName: node - linkType: hard + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== From acabe52aa9fa074bf1ae36ecf746eea0bc9cd6a5 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Fri, 31 Jan 2025 10:37:58 +0100 Subject: [PATCH 09/17] fix readme --- test/wasm/library_config/README.md | 5 +---- test/wasm/library_config/index.js | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/test/wasm/library_config/README.md b/test/wasm/library_config/README.md index 79bb2da..b5a42bc 100644 --- a/test/wasm/library_config/README.md +++ b/test/wasm/library_config/README.md @@ -3,9 +3,6 @@ ## How to run From repository root ```bash -wasm-pack build --target nodejs ./crates/library_config -mkdir -p ./prebuilds/library_config -mv ./crates/library_config/pkg ./prebuilds/library_config - +wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config node test/wasm/library_config/index.js ``` diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index 3221ad1..8a27b47 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -16,6 +16,7 @@ configurator.set_args(process.argv) let values = {} configurator.get_configuration(rawConfig.toString()).forEach((value, key, map) => { values[key] = value + console.log(`Got ${key}=${value}`) }); assert.strictEqual(values['DD_SERVICE'], 'my-service') From e779538b6140bbf0ccf9f9196ce7d3047967df83 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 14:32:39 +0100 Subject: [PATCH 10/17] use composite github action --- .github/actions/build-test-wasm/action.yaml | 31 +++++++++++++++++++++ .github/workflows/build.yml | 19 ++----------- .github/workflows/release.yml | 19 ++----------- 3 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 .github/actions/build-test-wasm/action.yaml diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml new file mode 100644 index 0000000..0effdc1 --- /dev/null +++ b/.github/actions/build-test-wasm/action.yaml @@ -0,0 +1,31 @@ +name: 'Build/Test WASM' +description: 'A simple composite GitHub Action sets-up WASM; then test & build relevant crates' +inputs: + cate: + description: 'The crate name. Must be in ./crates' + required: true +runs: + using: 'composite' + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + - run: yarn install + shell: bash + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + shell: bash + - name: Build WASM + run: | + mkdir -p ./prebuilds/${{ inputs.crate }} + wasm-pack build --target nodejs ./crates/${{ inputs.crate }} --out-dir ../../prebuilds/${{ inputs.crate }} + shell: bash + - name: Test WASM + run: node test_wasm.js + shell: bash + - uses: actions/upload-artifact@v4 + with: + name: prebuilds-wasm + if-no-files-found: ignore + path: ./prebuilds/* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 090be50..e534dc5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,23 +15,10 @@ jobs: - library_config steps: - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - - run: yarn install - - name: Install wasm-pack - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - name: Build WASM - run: | - mkdir -p ./prebuilds/${{ matrix.crate }} - wasm-pack build --target nodejs ./crates/${{ matrix.crate }} --out-dir ../../prebuilds/${{ matrix.crate }} - - name: Test WASM - run: node test_wasm.js - - uses: actions/upload-artifact@v4 + - name: 'Use composite action' + uses: ./.github/actions/build-test-wasm with: - name: prebuilds-wasm - if-no-files-found: ignore - path: ./prebuilds/* + crate: '${{ matrix.crate }}' build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da8c5e9..d9b1a7a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,23 +14,10 @@ jobs: - library_config steps: - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - - run: yarn install - - name: Install wasm-pack - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - name: Build WASM - run: | - mkdir -p ./prebuilds/${{ matrix.crate }} - wasm-pack build --target nodejs ./crates/${{ matrix.crate }} --out-dir ../../prebuilds/${{ matrix.crate }} - - name: Test WASM - run: node test_wasm.js - - uses: actions/upload-artifact@v4 + - name: 'Use composite action' + uses: ./.github/actions/build-test-wasm with: - name: prebuilds-wasm - if-no-files-found: ignore - path: ./prebuilds/* + crate: '${{ matrix.crate }}' build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main From a3d409658c17ab0061a73b18df58ecda0d4d9b1b Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:11:01 +0100 Subject: [PATCH 11/17] no exclude wasm from test.js --- test.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test.js b/test.js index 822f194..f451472 100644 --- a/test.js +++ b/test.js @@ -6,7 +6,5 @@ const { execSync } = require('child_process') fs.readdirSync('test') .filter(file => file.endsWith('.js') || !file.includes('.')) .forEach(file => { - if (!file.includes('wasm')) { - require('./test/' + file) - } + require('./test/' + file) }) From adec840ac186a8b70291c38521697712c50cae17 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:13:23 +0100 Subject: [PATCH 12/17] no package.json --- test/wasm/library_config/package.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test/wasm/library_config/package.json diff --git a/test/wasm/library_config/package.json b/test/wasm/library_config/package.json deleted file mode 100644 index 2f81fde..0000000 --- a/test/wasm/library_config/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "private": true, - "main": "index.js", - "dependencies": { - "@datadog/segfaultify": "^0.1.1", - "body-parser": "^1.20.3", - "express": "^4.19.2" - } -} From 7a8bb9065afc0acffd3e182a3293590be909c946 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:15:37 +0100 Subject: [PATCH 13/17] remove superfluous optimisations --- crates/collector/Cargo.toml | 6 ------ crates/crashtracker/Cargo.toml | 6 ------ crates/library_config/Cargo.toml | 6 ------ crates/pipeline/Cargo.toml | 6 ------ 4 files changed, 24 deletions(-) diff --git a/crates/collector/Cargo.toml b/crates/collector/Cargo.toml index 0ffbba4..1c8f255 100644 --- a/crates/collector/Cargo.toml +++ b/crates/collector/Cargo.toml @@ -15,9 +15,3 @@ collector = { git = "https://github.com/DataDog/libdatadog.git", branch = "rochd version = "1.0.0" default-features = false features = ["napi-6"] - -[profile.release] -# Tell `rustc` to optimize for small code size. -opt-level = "z" -lto = true -strip = "debuginfo" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index c7ceb90..b63261f 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -18,9 +18,3 @@ datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } - -[profile.release] -# Tell `rustc` to optimize for small code size. -opt-level = "z" -lto = true -strip = "debuginfo" diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml index edb7dad..c5459ee 100644 --- a/crates/library_config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -16,9 +16,3 @@ serde-wasm-bindgen = "0.4" [dev-dependencies] wasm-bindgen-test = "0.3.34" - -[profile.release] -# Tell `rustc` to optimize for small code size. -opt-level = "z" -lto = true -strip = "debuginfo" diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index ca8ab23..e98036d 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -15,9 +15,3 @@ data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", branch = "j version = "1.0.0" default-features = false features = ["napi-6"] - -[profile.release] -# Tell `rustc` to optimize for small code size. -opt-level = "z" -lto = true -strip = "debuginfo" From 0ee74a1ae810716f4f546446adc1a1086394b76b Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:25:14 +0100 Subject: [PATCH 14/17] yarn commands --- package.json | 8 +++++--- test/wasm/library_config/README.md | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d5bf907..bcc8fb1 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,12 @@ "description": "Node.js binding for libdatadog", "main": "index.js", "scripts": { + "install-wasm-pack": "curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh", "build": "yarn -s build-debug", - "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", - "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", - "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts", + "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", + "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", + "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", + "build-wasm": "yarn -s install-wasm-pack && wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/test/wasm/library_config/README.md b/test/wasm/library_config/README.md index b5a42bc..4e58f07 100644 --- a/test/wasm/library_config/README.md +++ b/test/wasm/library_config/README.md @@ -3,6 +3,6 @@ ## How to run From repository root ```bash -wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config +yarn build-wasm node test/wasm/library_config/index.js ``` From 606b1fd8f64bd306065fde9bf05d1b3a7568f012 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:33:30 +0100 Subject: [PATCH 15/17] Revert "no exclude wasm from test.js" This reverts commit a3d409658c17ab0061a73b18df58ecda0d4d9b1b. --- test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test.js b/test.js index f451472..822f194 100644 --- a/test.js +++ b/test.js @@ -6,5 +6,7 @@ const { execSync } = require('child_process') fs.readdirSync('test') .filter(file => file.endsWith('.js') || !file.includes('.')) .forEach(file => { - require('./test/' + file) + if (!file.includes('wasm')) { + require('./test/' + file) + } }) From d9ee1fb8d545bf4d434a316a4994bdc91eee0f84 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:40:48 +0100 Subject: [PATCH 16/17] fix build --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index bcc8fb1..897c058 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "main": "index.js", "scripts": { "install-wasm-pack": "curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh", - "build": "yarn -s build-debug", - "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", - "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", + "build": "yarn -s build-debug && yarn -s build-wasm", + "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", + "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", "build-wasm": "yarn -s install-wasm-pack && wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config", "cargo-build-release": "yarn -s cargo-build -- --release", From 3a7339bf1e3c7629537d13dc9b7b53e9bc098301 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Mon, 3 Feb 2025 15:48:56 +0100 Subject: [PATCH 17/17] include wasm search in `load` --- load.js | 32 +++++++++++++++---------------- test/wasm/library_config/index.js | 2 +- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/load.js b/load.js index f834dc5..21970c3 100644 --- a/load.js +++ b/load.js @@ -14,19 +14,6 @@ const ABI = process.versions.modules const inWebpack = typeof __webpack_require__ === 'function' const runtimeRequire = inWebpack ? __non_webpack_require__ : require -function maybeLoadWASM(name) { - try { - const root = __dirname - const prebuilds = path.join(root, 'prebuilds') - const folders = readdirSync(prebuilds) - if (folders.find(f => f === name)) { - return runtimeRequire(path.join(prebuilds, name, `${name}.js`)) - } - } catch (e) { - // Not found, skip. - } -} - function maybeLoad (name) { try { return load(name) @@ -37,12 +24,23 @@ function maybeLoad (name) { function load (name) { const filename = find(name) + const filenameWASM = findWASM(name) - if (!filename) { - throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH}.`) + if (filename) { + return runtimeRequire(filename) + } else if (filenameWASM) { + return runtimeRequire(filenameWASM) } + throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH} nor a ${name} WASM module.`) +} - return runtimeRequire(filename) +function findWASM (name) { + const root = __dirname + const prebuilds = path.join(root, 'prebuilds') + const folders = readdirSync(prebuilds) + if (folders.find(f => f === name)) { + return path.join(prebuilds, name, `${name}.js`) + } } function find (name, binary = false) { @@ -86,4 +84,4 @@ function findFile (root, name, binary = false) { || files.find(f => f === `${name}.node`) } -module.exports = { find, load, maybeLoad, maybeLoadWASM } +module.exports = { find, load, maybeLoad } diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index 8a27b47..a5283e8 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -3,7 +3,7 @@ const fs = require('fs'); const loader = require('../../../load.js'); const assert = require('assert'); -const libconfig = loader.maybeLoadWASM('library_config'); +const libconfig = loader.load('library_config'); assert(libconfig !== undefined); const rawConfig = fs.readFileSync(path.join(__dirname, 'config.yaml'));