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:
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"