lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

commit 0df1e8e2d3c088417bffd91260d8fada70616b38
parent 7aaaa866ac19c9f05cea339ea2da40559a1623e4
Author: triesap <tyson@radroots.org>
Date:   Tue, 11 Nov 2025 23:15:27 +0000

workspace: add `radroots-sql-wasm` bridge crates and `radroots-types` crate

Diffstat:
MCargo.lock | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MCargo.toml | 15+++++++++++++--
Asql-wasm-bridge/Cargo.toml | 14++++++++++++++
Asql-wasm-bridge/src/lib.rs | 34++++++++++++++++++++++++++++++++++
Asql-wasm-core/Cargo.toml | 26++++++++++++++++++++++++++
Asql-wasm-core/src/error.rs | 36++++++++++++++++++++++++++++++++++++
Asql-wasm-core/src/lib.rs | 29+++++++++++++++++++++++++++++
Asql-wasm-core/src/utils.rs | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atypes/Cargo.toml | 14++++++++++++++
Atypes/bindings/ts/package.json | 40++++++++++++++++++++++++++++++++++++++++
Atypes/bindings/ts/src/index.ts | 1+
Atypes/bindings/ts/src/types.ts | 7+++++++
Atypes/bindings/ts/tsconfig.cjs.json | 15+++++++++++++++
Atypes/bindings/ts/tsconfig.esm.json | 13+++++++++++++
Atypes/bindings/ts/tsconfig.json | 3+++
Atypes/build.rs | 13+++++++++++++
Atypes/src/lib.rs | 1+
Atypes/src/types.rs | 20++++++++++++++++++++
Myarn.lock | 75++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
19 files changed, 558 insertions(+), 5 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -394,6 +394,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -1774,6 +1775,30 @@ dependencies = [ ] [[package]] +name = "radroots-sql-wasm-bridge" +version = "0.1.0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "radroots-sql-wasm-core" +version = "0.1.0" +dependencies = [ + "chrono", + "js-sys", + "radroots-sql-wasm-bridge", + "serde", + "serde-wasm-bindgen", + "serde_json", + "thiserror 1.0.69", + "ts-rs", + "uuid", + "wasm-bindgen", +] + +[[package]] name = "radroots-trade" version = "0.1.0" dependencies = [ @@ -1785,6 +1810,15 @@ dependencies = [ ] [[package]] +name = "radroots-types" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "ts-rs", +] + +[[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2126,6 +2160,17 @@ dependencies = [ ] [[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2319,6 +2364,15 @@ dependencies = [ ] [[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2654,6 +2708,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] +name = "ts-rs" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4994acea2522cd2b3b85c1d9529a55991e3ad5e25cdcd3de9d505972c4379424" +dependencies = [ + "thiserror 2.0.16", + "ts-rs-macros", +] + +[[package]] +name = "ts-rs-macros" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6ff59666c9cbaec3533964505d39154dc4e0a56151fdea30a09ed0301f62e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "termcolor", +] + +[[package]] name = "tungstenite" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2781,6 +2857,7 @@ checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", + "rand 0.9.2", "serde", "wasm-bindgen", ] @@ -2947,6 +3024,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml @@ -10,7 +10,10 @@ members = [ "net-core", "nostr", "runtime", + "sql-wasm-bridge", + "sql-wasm-core", "trade", + "types", ] resolver = "2" @@ -31,7 +34,10 @@ radroots-runtime = { path = "runtime", version = "0.1.0", default-features = fal radroots-log = { path = "log", version = "0.1.0", default-features = false } radroots-net = { path = "net", version = "0.1.0", default-features = false } radroots-net-core = { path = "net-core", version = "0.1.0", default-features = false } +radroots-sql-wasm-bridge = { path = "sql-wasm-bridge", version = "0.1.0" } +radroots-sql-wasm-core = { path = "sql-wasm-core", version = "0.1.0" } radroots-trade = { path = "trade", version = "0.1.0", default-features = false } +radroots-types = { path = "types", version = "0.1.0", default-features = false } anyhow = { version = "1" } cfg-if = { version = "1" } @@ -41,13 +47,15 @@ config = { version = "0.14" } directories = { version = "6" } futures = { version = "0.3" } hex = { version = "0.4" } +js-sys = { version = "0.3" } nostr = { version = "0.43.0" } nostr-relay-pool = { version = "0.43.0" } nostr-sdk = { version = "0.43.0" } num_cpus = { version = "1.17.0" } secrecy = { version = "0.10.3" } -serde = { version = "1", default-features = false } -serde_json = { version = "1", default-features = false } +serde = { version = "1", default-features = false, features = ["derive"] } +serde_json = { version = "1", default-features = false, features = ["alloc"] } +serde-wasm-bindgen = { version = "0.6" } reqwest = { version = "0.12", default-features = false } rust_decimal = { version = "1", default-features = false } rust_decimal_macros = { version = "1" } @@ -60,7 +68,10 @@ tracing = { version = "0.1", default-features = false } tracing-appender = { version = "0.2" } tracing-log = { version = "0.2" } tracing-subscriber = { version = "0.3" } +ts-rs = { version = "11.1" } typeshare = { version = "1" } url = { version = "2" } uuid = { version = "1.16.0" } uniffi = { version = "0.29.4" } +wasm-bindgen = { version = "0.2" } +wasm-bindgen-futures = { version = "0.4" } diff --git a/sql-wasm-bridge/Cargo.toml b/sql-wasm-bridge/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "radroots-sql-wasm-bridge" +version.workspace = true +edition.workspace = true +authors = ["Radroots Authors"] +rust-version.workspace = true +license.workspace = true + +[features] +default = [] + +[dependencies] +js-sys = { workspace = true } +wasm-bindgen = { workspace = true } diff --git a/sql-wasm-bridge/src/lib.rs b/sql-wasm-bridge/src/lib.rs @@ -0,0 +1,34 @@ +use wasm_bindgen::JsValue; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_name = __radroots_sql_wasm_exec)] + fn js_exec(sql: &str, params_json: &str) -> JsValue; + + #[wasm_bindgen(js_name = __radroots_sql_wasm_query)] + fn js_query(sql: &str, params_json: &str) -> JsValue; +} + +const SAVEPOINT: &str = "radroots_schema_tx"; + +pub fn exec(sql: &str, params_json: &str) -> JsValue { + js_exec(sql, params_json) +} + +pub fn query(sql: &str, params_json: &str) -> JsValue { + js_query(sql, params_json) +} + +pub fn begin_tx() { + let _ = js_exec(&format!("savepoint {}", SAVEPOINT), "[]"); +} + +pub fn commit_tx() { + let _ = js_exec(&format!("release savepoint {}", SAVEPOINT), "[]"); +} + +pub fn rollback_tx() { + let _ = js_exec(&format!("rollback to savepoint {}", SAVEPOINT), "[]"); + let _ = js_exec(&format!("release savepoint {}", SAVEPOINT), "[]"); +} diff --git a/sql-wasm-core/Cargo.toml b/sql-wasm-core/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "radroots-sql-wasm-core" +version.workspace = true +edition.workspace = true +authors = ["Radroots Authors"] +rust-version.workspace = true +license.workspace = true + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = [] + +[dependencies] +radroots-sql-wasm-bridge = { workspace = true } +chrono = { workspace = true, features = ["serde"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +serde-wasm-bindgen = { workspace = true } +thiserror = { workspace = true } +wasm-bindgen = { workspace = true } +js-sys = { workspace = true } +ts-rs = { workspace = true } +uuid = { workspace = true, features = ["v4", "fast-rng", "js"] } +\ No newline at end of file diff --git a/sql-wasm-core/src/error.rs b/sql-wasm-core/src/error.rs @@ -0,0 +1,36 @@ +use thiserror::Error; +use wasm_bindgen::JsValue; + +#[derive(Error, Debug, Clone)] +pub enum SqlWasmError { + #[error("invalid argument: {0}")] + InvalidArgument(String), + #[error("{0} not found")] + NotFound(String), + #[error("serialization error: {0}")] + SerializationError(String), + #[error("invalid query: {0}")] + InvalidQuery(String), + #[error("internal error")] + Internal, +} + +impl SqlWasmError { + pub fn code(&self) -> &'static str { + match self { + SqlWasmError::InvalidArgument(_) => "ERR_INVALID_ARGUMENT", + SqlWasmError::NotFound(_) => "ERR_NOT_FOUND", + SqlWasmError::SerializationError(_) => "ERR_SERIALIZATION", + SqlWasmError::InvalidQuery(_) => "ERR_INVALID_QUERY", + SqlWasmError::Internal => "ERR_INTERNAL", + } + } + + pub fn to_js_value(self) -> JsValue { + let o = serde_json::json!({ + "code": self.code(), + "message": self.to_string() + }); + JsValue::from_str(&o.to_string()) + } +} diff --git a/sql-wasm-core/src/lib.rs b/sql-wasm-core/src/lib.rs @@ -0,0 +1,29 @@ +use wasm_bindgen::prelude::*; + +pub mod error; +pub mod utils; + +#[wasm_bindgen(js_name = exec_sql)] +pub fn exec_sql(sql: &str, params_json: &str) -> JsValue { + radroots_sql_wasm_bridge::exec(sql, params_json) +} + +#[wasm_bindgen(js_name = query_sql)] +pub fn query_sql(sql: &str, params_json: &str) -> JsValue { + radroots_sql_wasm_bridge::query(sql, params_json) +} + +#[wasm_bindgen(js_name = begin_tx)] +pub fn begin_tx() { + radroots_sql_wasm_bridge::begin_tx() +} + +#[wasm_bindgen(js_name = commit_tx)] +pub fn commit_tx() { + radroots_sql_wasm_bridge::commit_tx() +} + +#[wasm_bindgen(js_name = rollback_tx)] +pub fn rollback_tx() { + radroots_sql_wasm_bridge::rollback_tx() +} diff --git a/sql-wasm-core/src/utils.rs b/sql-wasm-core/src/utils.rs @@ -0,0 +1,121 @@ +use chrono::{SecondsFormat, Utc}; +use serde::Deserialize; +use serde::Serialize; +use serde_json::{Map, Value}; +use uuid::Uuid; + +use crate::error::SqlWasmError; + +pub fn parse_json<T: for<'de> Deserialize<'de>>(s: &str) -> Result<T, SqlWasmError> { + serde_json::from_str::<T>(s).map_err(|e| SqlWasmError::SerializationError(e.to_string())) +} + +pub fn uuidv4() -> String { + Uuid::new_v4().to_string() +} + +pub fn time_created_on() -> String { + Utc::now().to_rfc3339_opts(SecondsFormat::Millis, true) +} + +pub fn to_object_map<T: Serialize>(opts: T) -> Result<Map<String, Value>, SqlWasmError> { + let v = + serde_json::to_value(opts).map_err(|e| SqlWasmError::SerializationError(e.to_string()))?; + let obj = v + .as_object() + .ok_or_else(|| SqlWasmError::SerializationError("Expected an object".to_string()))?; + Ok(obj.clone()) +} + +pub fn to_partial_object_map<T: Serialize>(opts: T) -> Result<Map<String, Value>, SqlWasmError> { + let v = + serde_json::to_value(opts).map_err(|e| SqlWasmError::SerializationError(e.to_string()))?; + let obj = v + .as_object() + .ok_or_else(|| SqlWasmError::SerializationError("Expected an object".to_string()))?; + let mut filtered = Map::new(); + for (k, v) in obj.iter() { + if !v.is_null() { + filtered.insert(k.clone(), v.clone()); + } + } + Ok(filtered) +} + +pub fn to_db_bind_value(value: &Value) -> Value { + match value { + Value::Bool(b) => Value::String(if *b { "1".to_string() } else { "0".to_string() }), + Value::Number(n) => { + if let Some(f) = n.as_f64() { + Value::from(f) + } else if let Some(i) = n.as_i64() { + Value::from(i) + } else if let Some(u) = n.as_u64() { + if u <= u32::MAX as u64 { + Value::from(u as u32) + } else { + Value::from(u) + } + } else { + Value::Null + } + } + Value::String(s) => Value::from(s.clone()), + _ => Value::Null, + } +} + +pub fn build_where_clause_eq<T: Serialize>( + filter: &T, +) -> Result<(String, Vec<Value>), SqlWasmError> { + let obj = to_partial_object_map(filter)?; + if obj.is_empty() { + return Ok((String::new(), Vec::new())); + } + let mut clauses = Vec::with_capacity(obj.len()); + let mut binds = Vec::with_capacity(obj.len()); + for (k, v) in obj { + clauses.push(format!("{k} = ?")); + binds.push(to_db_bind_value(&v)); + } + Ok((format!(" WHERE {}", clauses.join(" AND ")), binds)) +} + +pub fn build_insert_query_with_meta( + table: &str, + meta: &[(&str, Value)], + fields: &Map<String, Value>, +) -> (String, Vec<Value>) { + let mut cols: Vec<String> = meta.iter().map(|(k, _)| k.to_string()).collect(); + cols.extend(fields.keys().cloned()); + let meta_binds: Vec<Value> = meta.iter().map(|(_, v)| to_db_bind_value(v)).collect(); + let field_binds: Vec<Value> = fields.values().map(to_db_bind_value).collect(); + let placeholders = (0..cols.len()) + .map(|_| "?") + .collect::<Vec<&str>>() + .join(","); + let sql = format!( + "INSERT INTO {table} ({}) VALUES ({});", + cols.join(","), + placeholders + ); + let mut binds = Vec::with_capacity(cols.len()); + binds.extend(meta_binds); + binds.extend(field_binds); + (sql, binds) +} + +pub fn build_select_query_with_meta<T: Serialize>( + table: &str, + filter: Option<&T>, +) -> (String, Vec<Value>) { + let (where_clause, binds) = match filter { + Some(f) => match build_where_clause_eq(f) { + Ok(t) => t, + Err(_) => (String::new(), Vec::new()), + }, + None => (String::new(), Vec::new()), + }; + let sql = format!("SELECT * FROM {table}{where_clause};"); + (sql, binds) +} diff --git a/types/Cargo.toml b/types/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "radroots-types" +version.workspace = true +edition.workspace = true +authors = ["Radroots Authors"] +rust-version.workspace = true +license.workspace = true +build = "build.rs" + +[dependencies] +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +ts-rs = { workspace = true } +\ No newline at end of file diff --git a/types/bindings/ts/package.json b/types/bindings/ts/package.json @@ -0,0 +1,39 @@ +{ + "name": "@radroots/types-bindings", + "version": "1.0.0", + "private": true, + "license": "AGPLv3", + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + } + }, + "files": [ + "dist" + ], + "sideEffects": false, + "scripts": { + "build:esm": "tsc -p tsconfig.esm.json", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build": "npm run clean && npm run build:esm && npm run build:cjs", + "prebuild": "npm run clean && generate-package-exports", + "clean": "rimraf dist", + "dev": "npm run watch", + "watch": "tsc -w" + }, + "devDependencies": { + "@radroots/dev": "*", + "@radroots/tsconfig": "*", + "rimraf": "^6.0.1" + }, + "dependencies": {}, + "publishConfig": { + "access": "public" + } +} +\ No newline at end of file diff --git a/types/bindings/ts/src/index.ts b/types/bindings/ts/src/index.ts @@ -0,0 +1 @@ +export * from "./types.js" diff --git a/types/bindings/ts/src/types.ts b/types/bindings/ts/src/types.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type IResult<T> = { result: T, }; + +export type IResultList<T> = { results: Array<T>, }; + +export type IResultPass = { pass: boolean, }; diff --git a/types/bindings/ts/tsconfig.cjs.json b/types/bindings/ts/tsconfig.cjs.json @@ -0,0 +1,15 @@ +{ + "extends": "@radroots/tsconfig/tsconfig.esm.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "Node", + "rootDir": "./src", + "outDir": "dist/cjs", + "declaration": false, + "declarationMap": false, + "emitDeclarationOnly": false, + "tsBuildInfoFile": "node_modules/.cache/tsc.utils-nostr.cjs.tsbuildinfo" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/types/bindings/ts/tsconfig.esm.json b/types/bindings/ts/tsconfig.esm.json @@ -0,0 +1,13 @@ +{ + "extends": "@radroots/tsconfig/tsconfig.esm.json", + "compilerOptions": { + "moduleResolution": "nodenext", + "rootDir": "./src", + "outDir": "dist/esm", + "declaration": true, + "declarationMap": true, + "declarationDir": "dist/types" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/types/bindings/ts/tsconfig.json b/types/bindings/ts/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.esm.json" +} diff --git a/types/build.rs b/types/build.rs @@ -0,0 +1,13 @@ +use std::{fs, path::Path}; + +fn main() { + println!("cargo:rustc-env=TS_RS_EXPORT_DIR=./bindings/ts/src"); + + let out_dir = Path::new("bindings/ts/src"); + if !out_dir.exists() { + fs::create_dir_all(out_dir).expect("Failed to create TS export directory"); + } + + println!("cargo:rerun-if-changed=src"); + println!("cargo:rerun-if-changed=build.rs"); +} diff --git a/types/src/lib.rs b/types/src/lib.rs @@ -0,0 +1 @@ +pub mod types; diff --git a/types/src/types.rs b/types/src/types.rs @@ -0,0 +1,20 @@ +use serde::Serialize; +use ts_rs::TS; + +#[derive(Serialize, TS)] +#[ts(export, export_to = "types.ts")] +pub struct IResult<T> { + pub result: T, +} + +#[derive(Serialize, TS)] +#[ts(export, export_to = "types.ts")] +pub struct IResultList<T> { + pub results: Vec<T>, +} + +#[derive(Serialize, TS)] +#[ts(export, export_to = "types.ts")] +pub struct IResultPass { + pub pass: bool, +} diff --git a/yarn.lock b/yarn.lock @@ -59,6 +59,27 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@oclif/core@>=3.26.0": version "4.8.0" resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.8.0.tgz#bde8fad00019c8c0a8e27787b4b42c4670842785" @@ -224,7 +245,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -402,6 +423,24 @@ esm@^3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== +fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + fdir@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" @@ -460,7 +499,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -646,6 +685,19 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -742,7 +794,7 @@ picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -757,6 +809,11 @@ prettier@3.0.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -786,6 +843,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + rimraf@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.0.tgz#b9168360a26e10ffaca0c8b803f47069f99ca47e" @@ -799,6 +861,13 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^7.4.0, rxjs@^7.5.5: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b"