diff --git a/.gitignore b/.gitignore index 9ed45500..c9deace7 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ gitignore Thumbs.db tsconfig.tsbuildinfo +app.config.*.js diff --git a/Cargo.lock b/Cargo.lock index 7ab665e8..0cfa91e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1456,7 +1456,7 @@ dependencies = [ "bstr", "log", "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] @@ -2975,7 +2975,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] @@ -2995,7 +2995,7 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] @@ -3006,9 +3006,17 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "regex-syntax-wasm" +version = "0.0.0" +dependencies = [ + "regex-syntax 0.8.4", + "wasm-bindgen", +] [[package]] name = "reqwest" @@ -4640,19 +4648,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -4677,9 +4686,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4687,9 +4696,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -4700,9 +4709,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" diff --git a/biome.json b/biome.json index 2e54ce8f..1f6f22e2 100644 --- a/biome.json +++ b/biome.json @@ -15,6 +15,7 @@ "dist", "bindings.ts", "rspc/types.ts", + "crates/regex-syntax-wasm/pkg", "commands.ts" ] }, diff --git a/crates/regex-syntax-wasm/Cargo.toml b/crates/regex-syntax-wasm/Cargo.toml new file mode 100644 index 00000000..ec0e4a21 --- /dev/null +++ b/crates/regex-syntax-wasm/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "regex-syntax-wasm" +description = "A WebAssembly version of the regex-syntax crate" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +regex-syntax = "0.8.4" +wasm-bindgen = "0.2.93" diff --git a/crates/regex-syntax-wasm/package.json b/crates/regex-syntax-wasm/package.json new file mode 100644 index 00000000..49295ed5 --- /dev/null +++ b/crates/regex-syntax-wasm/package.json @@ -0,0 +1,27 @@ +{ + "name": "@macrograph/regex-syntax-wasm", + "description": "A WebAssembly version of the regex-syntax crate", + "version": "0.0.0", + "files": [ + "./pkg/regex_syntax_wasm_bg.wasm", + "./pkg/regex_syntax_wasm.js", + "./pkg/regex_syntax_wasm_bg.js", + "./pkg/regex_syntax_wasm.d.ts" + ], + "module": "./pkg/regex_syntax_wasm.js", + "types": "./pkg/regex_syntax_wasm.d.ts", + "sideEffects": ["./pkg/regex_syntax_wasm.js"], + "exports": { + ".": { + "import": "./pkg/regex_syntax_wasm.js", + "require": "./pkg/regex_syntax_wasm.js" + }, + "./regex_syntax_wasm_bg.wasm": { + "import": "./pkg/regex_syntax_wasm_bg.wasm", + "require": "./pkg/regex_syntax_wasm_bg.wasm" + } + }, + "scripts": { + "build": "wasm-pack build --release --target web && rm ./pkg/.gitignore" + } +} diff --git a/crates/regex-syntax-wasm/pkg/package.json b/crates/regex-syntax-wasm/pkg/package.json new file mode 100644 index 00000000..02db578c --- /dev/null +++ b/crates/regex-syntax-wasm/pkg/package.json @@ -0,0 +1,16 @@ +{ + "name": "regex-syntax-wasm", + "type": "module", + "description": "A WebAssembly version of the regex-syntax crate", + "version": "0.0.0", + "files": [ + "regex_syntax_wasm_bg.wasm", + "regex_syntax_wasm.js", + "regex_syntax_wasm.d.ts" + ], + "main": "regex_syntax_wasm.js", + "types": "regex_syntax_wasm.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.d.ts b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.d.ts new file mode 100644 index 00000000..0209a1a2 --- /dev/null +++ b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.d.ts @@ -0,0 +1,71 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {string} regex +* @returns {CaptureScope} +*/ +export function get_capture_groups(regex: string): CaptureScope; +/** +*/ +export class CaptureGroup { + free(): void; +/** +* @returns {string} +*/ + name(): string; +/** +* @returns {boolean} +*/ + optional(): boolean; +} +/** +*/ +export class CaptureScope { + free(): void; +/** +* @returns {(CaptureScope)[]} +*/ + scope(): (CaptureScope)[]; +/** +* @returns {CaptureGroup | undefined} +*/ + capture(): CaptureGroup | undefined; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly get_capture_groups: (a: number, b: number, c: number) => void; + readonly __wbg_capturescope_free: (a: number, b: number) => void; + readonly capturescope_scope: (a: number, b: number) => void; + readonly capturescope_capture: (a: number) => number; + readonly __wbg_capturegroup_free: (a: number, b: number) => void; + readonly capturegroup_name: (a: number, b: number) => void; + readonly capturegroup_optional: (a: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.js b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.js new file mode 100644 index 00000000..b58edaec --- /dev/null +++ b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm.js @@ -0,0 +1,363 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} +/** +* @param {string} regex +* @returns {CaptureScope} +*/ +export function get_capture_groups(regex) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(regex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.get_capture_groups(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return CaptureScope.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +function getArrayJsValueFromWasm0(ptr, len) { + ptr = ptr >>> 0; + const mem = getDataViewMemory0(); + const result = []; + for (let i = ptr; i < ptr + 4 * len; i += 4) { + result.push(takeObject(mem.getUint32(i, true))); + } + return result; +} + +const CaptureGroupFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_capturegroup_free(ptr >>> 0, 1)); +/** +*/ +export class CaptureGroup { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(CaptureGroup.prototype); + obj.__wbg_ptr = ptr; + CaptureGroupFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CaptureGroupFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_capturegroup_free(ptr, 0); + } + /** + * @returns {string} + */ + name() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.capturegroup_name(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @returns {boolean} + */ + optional() { + const ret = wasm.capturegroup_optional(this.__wbg_ptr); + return ret !== 0; + } +} + +const CaptureScopeFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_capturescope_free(ptr >>> 0, 1)); +/** +*/ +export class CaptureScope { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(CaptureScope.prototype); + obj.__wbg_ptr = ptr; + CaptureScopeFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CaptureScopeFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_capturescope_free(ptr, 0); + } + /** + * @returns {(CaptureScope)[]} + */ + scope() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.capturescope_scope(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayJsValueFromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @returns {CaptureGroup | undefined} + */ + capture() { + const ret = wasm.capturescope_capture(this.__wbg_ptr); + return ret === 0 ? undefined : CaptureGroup.__wrap(ret); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_capturescope_new = function(arg0) { + const ret = CaptureScope.__wrap(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('regex_syntax_wasm_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm new file mode 100644 index 00000000..83460e8a Binary files /dev/null and b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm differ diff --git a/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm.d.ts b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm.d.ts new file mode 100644 index 00000000..385c20d2 --- /dev/null +++ b/crates/regex-syntax-wasm/pkg/regex_syntax_wasm_bg.wasm.d.ts @@ -0,0 +1,14 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function get_capture_groups(a: number, b: number, c: number): void; +export function __wbg_capturescope_free(a: number, b: number): void; +export function capturescope_scope(a: number, b: number): void; +export function capturescope_capture(a: number): number; +export function __wbg_capturegroup_free(a: number, b: number): void; +export function capturegroup_name(a: number, b: number): void; +export function capturegroup_optional(a: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/crates/regex-syntax-wasm/src/lib.rs b/crates/regex-syntax-wasm/src/lib.rs new file mode 100644 index 00000000..ac0beeb2 --- /dev/null +++ b/crates/regex-syntax-wasm/src/lib.rs @@ -0,0 +1,171 @@ +use regex_syntax::{ + hir::{Hir, HirKind}, + parse, +}; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn get_capture_groups(regex: &str) -> Result { + Ok(collect_captures( + &parse(regex).map_err(|err| err.to_string())?, + false, + )) +} + +fn collect_captures(hir: &Hir, optional: bool) -> CaptureScope { + match hir.kind() { + HirKind::Empty | HirKind::Literal(_) | HirKind::Class(_) | HirKind::Look(_) => { + CaptureScopeInner::Scope(vec![]).into() + } + HirKind::Repetition(r) => collect_captures(&r.sub, r.min == 0), + HirKind::Capture(c) => { + let mut result = Vec::::new(); + if let Some(name) = c.name.clone() { + result.push(CaptureScopeInner::Capture(CaptureGroup { name, optional }).into()); + } + + match collect_captures(&c.sub, optional).0 { + CaptureScopeInner::Scope(sub_captures) if sub_captures.len() == 0 => {} + r => result.push(r.into()), + } + + match &result[..] { + [c] => c.clone().into(), + _ => CaptureScopeInner::Scope(result).into(), + } + } + HirKind::Concat(c) => { + let mut captures = vec![]; + for sub in c.iter() { + match collect_captures(sub, optional).0 { + CaptureScopeInner::Scope(sub_captures) => { + captures.extend(sub_captures); + } + CaptureScopeInner::Capture(capture) => { + captures.push(CaptureScopeInner::Capture(capture).into()); + } + } + } + + match captures.first() { + Some(capture) if captures.len() == 1 => capture.clone(), + _ => CaptureScopeInner::Scope(captures).into(), + } + } + HirKind::Alternation(c) => CaptureScopeInner::Scope( + c.iter() + .filter_map(|sub| match collect_captures(sub, true).0 { + CaptureScopeInner::Scope(sub_captures) if sub_captures.len() == 0 => None, + r => Some(CaptureScope(r)), + }) + .collect(), + ) + .into(), + } +} + +#[derive(Debug, Clone)] +pub enum CaptureScopeInner { + Scope(Vec), + Capture(CaptureGroup), +} + +impl Into for CaptureScopeInner { + fn into(self) -> CaptureScope { + CaptureScope(self) + } +} + +// Bindgen only supports C-style enums :( +#[wasm_bindgen] +#[derive(Debug, Clone)] +pub struct CaptureScope(CaptureScopeInner); + +#[wasm_bindgen] +impl CaptureScope { + pub fn scope(&self) -> Vec { + match &self.0 { + CaptureScopeInner::Scope(scope) => scope.clone(), + _ => vec![], + } + } + + pub fn capture(&self) -> Option { + match &self.0 { + CaptureScopeInner::Capture(capture) => Some(capture.clone()), + _ => None, + } + } +} + +#[wasm_bindgen] +#[derive(Debug, Clone)] +pub struct CaptureGroup { + name: Box, + optional: bool, +} + +#[wasm_bindgen] +impl CaptureGroup { + pub fn name(&self) -> String { + self.name.to_string() + } + + pub fn optional(&self) -> bool { + self.optional + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_regex_parsing() { + assert_eq!( + format!( + "{:?}", + collect_captures(&parse(r#"/abc(?\w+)/g"#).unwrap(), false) + ), + r#"CaptureScope(Capture(CaptureGroup { name: "bruh", optional: false }))"# + ); + + assert_eq!( + format!( + "{:?}", + collect_captures( + &parse(r#"/(?(?[^.-])+)/g"#).unwrap(), + false + ) + ), + r#"CaptureScope(Scope([CaptureScope(Capture(CaptureGroup { name: "capture", optional: false })), CaptureScope(Capture(CaptureGroup { name: "capture2", optional: false }))]))"# + ); + + assert_eq!( + format!( + "{:?}", + collect_captures(&parse(r#"/(?\w)|(?\w)/g"#).unwrap(), false) + ), + r#"CaptureScope(Scope([CaptureScope(Capture(CaptureGroup { name: "name", optional: true })), CaptureScope(Capture(CaptureGroup { name: "name2", optional: true }))]))"# + ); + + assert_eq!( + format!( + "{:?}", + collect_captures( + &parse(r#"/((?\w)|(?\w))|((?\w)|(?\w))/g"#).unwrap(), + false + ) + ), + r#"CaptureScope(Scope([CaptureScope(Scope([CaptureScope(Capture(CaptureGroup { name: "name", optional: true })), CaptureScope(Capture(CaptureGroup { name: "name2", optional: true }))])), CaptureScope(Scope([CaptureScope(Capture(CaptureGroup { name: "name3", optional: true })), CaptureScope(Capture(CaptureGroup { name: "name4", optional: true }))]))]))"# + ); + + assert_eq!( + format!( + "{:?}", + collect_captures(&parse(r#"/ABC(?\w)/g"#).unwrap(), false) + ), + r#"CaptureScope(Capture(CaptureGroup { name: "name2", optional: false }))"# + ); + } +} diff --git a/packages/packages/package.json b/packages/packages/package.json index 15d65730..afae423a 100644 --- a/packages/packages/package.json +++ b/packages/packages/package.json @@ -20,6 +20,7 @@ "@macrograph/typesystem": "workspace:*", "@macrograph/ui": "workspace:*", "@macrograph/utils": "workspace:^", + "@macrograph/regex-syntax-wasm": "workspace:^", "@octokit/auth-callback": "^4.0.0", "@rspc/client": "0.0.0-main-6ed8cc98", "@rspc/tauri": "0.0.0-main-6ed8cc98", diff --git a/packages/packages/src/utils.ts b/packages/packages/src/utils.ts index 8d59d0da..d39930da 100644 --- a/packages/packages/src/utils.ts +++ b/packages/packages/src/utils.ts @@ -1,5 +1,11 @@ import { JSONEnum, jsonToJS } from "@macrograph/json"; import { Maybe, None, type Option, Some } from "@macrograph/option"; +import init, { + type CaptureScope, + get_capture_groups, +} from "@macrograph/regex-syntax-wasm"; +// @ts-expect-error +import wasmUrl from "@macrograph/regex-syntax-wasm/regex_syntax_wasm_bg.wasm?url"; import { type Core, type DataInput, @@ -16,6 +22,7 @@ import { } from "@macrograph/typesystem"; import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; +import { createSignal } from "solid-js"; dayjs.extend(duration); @@ -2498,11 +2505,16 @@ export function pkg(core: Core) { }, }); + const [wasmLoaded, setWasmLoaded] = createSignal(false); + init(wasmUrl).then(() => setWasmLoaded(true)); + pkg.createSchema({ name: "Execute Regex", type: "exec", properties: { regex: { name: "Regex", type: t.string() } }, createIO({ io, ctx, properties }) { + wasmLoaded(); + const base = { input: io.dataInput({ id: "", @@ -2511,26 +2523,62 @@ export function pkg(core: Core) { }; try { - const groupOutputs: DataOutput[] = []; const regex = new RegExp(ctx.getProperty(properties.regex)); - const { groups } = new RegExp(`${regex}|`).exec("")!; + const result = get_capture_groups(ctx.getProperty(properties.regex)); + + function flattenCaptures( + scope: CaptureScope, + ): [string, t.String | t.Option][] { + const c = scope.capture(); + if (c) { + const name = c.name(); + return [[name, c.optional() ? t.option(t.string()) : t.string()]]; + } - for (const group of Object.keys(groups ?? {})) { - groupOutputs.push( - io.dataOutput({ - id: `group-${group}`, - name: group, - type: t.string(), - }), - ); + return scope.scope().flatMap(flattenCaptures); } + const collectCapture = (scope: CaptureScope) => { + const c = scope.capture(); + if (c) { + const name = c.name(); + return [ + io.dataOutput({ + id: `group-${name}`, + name: name, + type: c.optional() ? t.option(t.string()) : t.string(), + }), + ]; + } + + let i = 0; + return scope.scope().map((scope) => { + i++; + const name = i.toString(); + + return io.scopeOutput({ + id: i.toString(), + name: i.toString(), + scope(s) { + // TODO: We collapse all remaining nesting as we currently can't nest enums. + for (const [name, ty] of flattenCaptures(scope)) { + s.output({ + id: name, + name, + type: ty, + }); + } + }, + }); + }); + }; + return { ...base, regex, - groupOutputs, + groupOutputs: collectCapture(result), }; - } catch { + } catch (err) { if (io.previous) return io.previous; return base; @@ -2548,7 +2596,13 @@ export function pkg(core: Core) { if (value === undefined) throw new Error(`Group ${out.id} not found in regex result`); - ctx.setOutput(out, value); + if (out instanceof ScopeOutput) { + ctx.execScope(out, { + // TODO: We need to implement this! + }); + } else { + ctx.setOutput(out, value); + } } } else { throw new Error("Invalid regex!"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b7cb3b5..91132e83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: version: 2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.20)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) vitest: specifier: ^2.0.5 - version: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3) + version: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3) vitest-github-actions-reporter: specifier: ^0.11.1 version: 0.11.1(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4)(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3)) @@ -100,7 +100,7 @@ importers: version: 0.14.3(solid-js@1.8.20) '@solidjs/start': specifier: 1.0.6 - version: 1.0.6(@testing-library/jest-dom@6.4.8)(rollup@4.18.1)(solid-js@1.8.20)(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0))(ioredis@5.4.1)(terser@5.31.3))(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) + version: 1.0.6(@testing-library/jest-dom@6.4.8)(rollup@4.18.1)(solid-js@1.8.20)(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0)(@types/react@18.2.73)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0))(ioredis@5.4.1)(terser@5.31.3))(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) '@t3-oss/env-core': specifier: ^0.6.1 version: 0.6.1(typescript@5.5.3)(zod@3.22.4) @@ -183,7 +183,7 @@ importers: version: 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) '@storybook/addon-interactions': specifier: ^8.2.7 - version: 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3)) + version: 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3)) '@storybook/addon-links': specifier: ^8.2.7 version: 8.2.7(react@18.2.0)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) @@ -387,6 +387,8 @@ importers: specifier: ^1.1.1 version: 1.1.1(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) + crates/regex-syntax-wasm: {} + crates/tauri-plugin-kb-mouse: dependencies: '@tanstack/solid-query': @@ -681,6 +683,9 @@ importers: '@macrograph/option': specifier: workspace:^ version: link:../option + '@macrograph/regex-syntax-wasm': + specifier: workspace:^ + version: link:../../crates/regex-syntax-wasm '@macrograph/runtime': specifier: workspace:* version: link:../runtime @@ -3528,6 +3533,7 @@ packages: '@rspc/solid@0.0.0-main-6ed8cc98': resolution: {integrity: sha512-uh3iEmUDVZl3DzkSipr2XV8aWANuIGjAb5deg12bMPiGRpE8eyO4S8prxUkA+mqqX/zHYKbR4GVZQElN/gkTTA==} + deprecated: Please use @rspc/solid-query peerDependencies: '@rspc/client': 0.0.0-main-6ed8cc98 '@tanstack/solid-query': ^4.6.0 @@ -3792,11 +3798,11 @@ packages: react-dom: optional: true - '@storybook/builder-vite@8.3.0-alpha.6': - resolution: {integrity: sha512-r8O+6hRBNCql6f5NykbDUr5U/clNeDRJoBF+FpWkpQT9dXFoYor54u6JMEJmseHPdmiJemhiIZ0xo54ktWUJLg==} + '@storybook/builder-vite@8.3.0-alpha.9': + resolution: {integrity: sha512-EMgTo77Ie74WORKDVMY6HMxSQTdsD12M114d+H6cTfDY8FO2vQgu/v2DccgvKKiSFhpdoNj1GfO3FhM8wCO/PQ==} peerDependencies: '@preact/preset-vite': '*' - storybook: ^8.3.0-alpha.6 + storybook: ^8.3.0-alpha.9 typescript: '>= 4.3.x' vite: ^4.0.0 || ^5.0.0 vite-plugin-glimmerx: '*' @@ -3819,10 +3825,10 @@ packages: peerDependencies: storybook: ^8.2.7 - '@storybook/csf-plugin@8.3.0-alpha.6': - resolution: {integrity: sha512-zGJ3qaF/Zx1EQZr5blS611vBzR0U+EwFjs7qwl0gYYrV+TSTCCZpIP6v7jDtpJ8vF2QVeem7iXreERi0L5Y8sQ==} + '@storybook/csf-plugin@8.3.0-alpha.9': + resolution: {integrity: sha512-xSuLYTIRrPK2NkKxEIh7FUlEYZujVt350ybBZYvFYhKVsX8i1gBFX9saS5XXXLv3GN6jgeeGsS5UjswRbpE7yw==} peerDependencies: - storybook: ^8.3.0-alpha.6 + storybook: ^8.3.0-alpha.9 '@storybook/csf@0.1.11': resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} @@ -5827,6 +5833,7 @@ packages: fstream@1.0.12: resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} engines: {node: '>=0.6'} + deprecated: This package is no longer supported. function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -7798,6 +7805,7 @@ packages: shikiji-core@0.9.19: resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} + deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates shikiji@0.9.19: resolution: {integrity: sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==} @@ -11154,7 +11162,7 @@ snapshots: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.10 + magic-string: 0.30.11 optionalDependencies: rollup: 4.18.1 @@ -11162,7 +11170,7 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.18.1) estree-walker: 2.0.2 - magic-string: 0.30.10 + magic-string: 0.30.11 optionalDependencies: rollup: 4.18.1 @@ -11186,7 +11194,7 @@ snapshots: '@rollup/plugin-replace@5.0.7(rollup@4.18.1)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.18.1) - magic-string: 0.30.10 + magic-string: 0.30.11 optionalDependencies: rollup: 4.18.1 @@ -11499,7 +11507,7 @@ snapshots: dependencies: solid-js: 1.8.20 - '@solidjs/start@1.0.6(@testing-library/jest-dom@6.4.8)(rollup@4.18.1)(solid-js@1.8.20)(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0))(ioredis@5.4.1)(terser@5.31.3))(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3))': + '@solidjs/start@1.0.6(@testing-library/jest-dom@6.4.8)(rollup@4.18.1)(solid-js@1.8.20)(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0)(@types/react@18.2.73)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0))(ioredis@5.4.1)(terser@5.31.3))(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3))': dependencies: '@vinxi/plugin-directives': 0.4.1(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0)(@types/react@18.2.73)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0))(ioredis@5.4.1)(terser@5.31.3)) '@vinxi/server-components': 0.4.1(vinxi@0.4.1(@planetscale/database@1.16.0)(@types/node@20.14.11)(drizzle-orm@0.29.5(@planetscale/database@1.16.0)(@types/react@18.2.73)(pg@8.11.5)(postgres@3.4.4)(react@18.2.0))(ioredis@5.4.1)(terser@5.31.3)) @@ -11614,11 +11622,11 @@ snapshots: '@storybook/global': 5.0.0 storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)) - '@storybook/addon-interactions@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3))': + '@storybook/addon-interactions@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3))': dependencies: '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) - '@storybook/test': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3)) + '@storybook/test': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3)) polished: 4.3.1 storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)) ts-dedent: 2.2.0 @@ -11680,9 +11688,9 @@ snapshots: react: 18.2.0 react-dom: 18.3.1(react@18.2.0) - '@storybook/builder-vite@8.3.0-alpha.6(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3))': + '@storybook/builder-vite@8.3.0-alpha.9(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3))': dependencies: - '@storybook/csf-plugin': 8.3.0-alpha.6(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) + '@storybook/csf-plugin': 8.3.0-alpha.9(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 es-module-lexer: 1.5.4 @@ -11741,7 +11749,7 @@ snapshots: storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)) unplugin: 1.12.0 - '@storybook/csf-plugin@8.3.0-alpha.6(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))': + '@storybook/csf-plugin@8.3.0-alpha.9(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))': dependencies: storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)) unplugin: 1.12.2 @@ -11774,12 +11782,12 @@ snapshots: react-dom: 18.3.1(react@18.2.0) storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)) - '@storybook/test@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3))': + '@storybook/test@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3))': dependencies: '@storybook/csf': 0.1.11 '@storybook/instrumenter': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9))) '@testing-library/dom': 10.1.0 - '@testing-library/jest-dom': 6.4.5(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3)) + '@testing-library/jest-dom': 6.4.5(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3)) '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) '@vitest/expect': 1.6.0 '@vitest/spy': 1.6.0 @@ -11929,7 +11937,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3))': + '@testing-library/jest-dom@6.4.5(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.1 @@ -11940,7 +11948,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 optionalDependencies: - vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3) + vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3) '@testing-library/jest-dom@6.4.8': dependencies: @@ -12333,7 +12341,7 @@ snapshots: dependencies: modern-node-polyfills: 0.1.3(rollup@4.20.0) sirv: 2.0.4 - vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3) + vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3) transitivePeerDependencies: - rollup @@ -12382,7 +12390,7 @@ snapshots: pathe: 1.1.2 sirv: 2.0.4 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3) + vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3) '@vitest/utils@1.4.0': dependencies: @@ -14325,7 +14333,7 @@ snapshots: https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -16546,7 +16554,7 @@ snapshots: storybook-solidjs-vite@1.0.0-beta.2(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)): dependencies: - '@storybook/builder-vite': 8.3.0-alpha.6(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) + '@storybook/builder-vite': 8.3.0-alpha.9(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.24.9)))(typescript@5.5.3)(vite@5.4.0(@types/node@20.14.11)(terser@5.31.3)) transitivePeerDependencies: - '@preact/preset-vite' - storybook @@ -17047,7 +17055,7 @@ snapshots: estree-walker: 3.0.3 fast-glob: 3.3.2 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 @@ -17228,7 +17236,7 @@ snapshots: unwasm@0.3.9: dependencies: knitwork: 1.1.0 - magic-string: 0.30.10 + magic-string: 0.30.11 mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 @@ -17473,9 +17481,9 @@ snapshots: vitest-github-actions-reporter@0.11.1(vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4)(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3)): dependencies: '@actions/core': 1.10.1 - vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3) + vitest: 2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3) - vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5(vitest@2.0.5))(jsdom@24.1.1)(terser@5.31.3): + vitest@2.0.5(@types/node@20.14.11)(@vitest/browser@0.32.4(rollup@4.20.0)(vitest@2.0.5))(@vitest/ui@2.0.5)(jsdom@24.1.1)(terser@5.31.3): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5