From 8603f73c1758736dbb2434910ef31c5282c697a9 Mon Sep 17 00:00:00 2001 From: "shockwave-bot[bot]" <274219579+shockwave-bot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 02:46:48 +0000 Subject: [PATCH 01/65] fix(lsp): keep completion scoped once a prefix is typed A partial identifier under the caret ends at the offset, so the `<= offset` trigger scan selected it instead of the `.`/`::`/`:`/`#[` before it, falling through to general items. Skip the boundary identifier; its predecessor governs context. Adds with-prefix tests per context. refs #10 Co-Authored-By: Claude Opus 4.8 --- crates/pseudoscript-lsp/src/complete.rs | 86 +++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/crates/pseudoscript-lsp/src/complete.rs b/crates/pseudoscript-lsp/src/complete.rs index dbe7683..70f4768 100644 --- a/crates/pseudoscript-lsp/src/complete.rs +++ b/crates/pseudoscript-lsp/src/complete.rs @@ -29,10 +29,7 @@ pub fn completion( ) -> Vec { let offset = position_to_offset(src, position); let tokens = tokenize(src); - // The token whose context governs completion is the last one ending at or - // before the caret (an identifier under the caret ends after it, so its - // predecessor — the trigger — is selected instead). - let trigger = tokens.iter().rposition(|t| t.span.end <= offset); + let trigger = governing_trigger(&tokens, offset); match trigger.map(|i| (i, tokens[i].kind)) { Some((i, TokenKind::Dot)) => member_items(ws, from_fqn, src, &tokens, i), @@ -43,6 +40,23 @@ pub fn completion( } } +/// Index of the token whose kind governs completion at `offset`. +/// +/// The trigger is the rightmost token ending at or before the caret — except +/// for a partial identifier typed *under* the caret, which ends exactly at +/// `offset` (`span.end == offset`). That identifier is the prefix the client +/// filters on, not the context, so its predecessor is the real trigger. A caret +/// strictly inside an identifier (`span.end > offset`) is already excluded by +/// the `<= offset` bound, so only the boundary case needs skipping. +fn governing_trigger(tokens: &[Token], offset: u32) -> Option { + let last = tokens.iter().rposition(|t| t.span.end <= offset)?; + if tokens[last].kind == TokenKind::Ident && tokens[last].span.end == offset { + last.checked_sub(1) + } else { + Some(last) + } +} + /// Callables and fields of the node named by the base before `tokens[dot]`. fn member_items( ws: &Workspace, @@ -264,4 +278,68 @@ mod tests { assert!(labels.contains(&"system".to_owned()), "{labels:?}"); assert!(labels.contains(&"public".to_owned()), "{labels:?}"); } + + // With a prefix typed, the caret sits at the end of a partial identifier. + // Each narrowing context must stay scoped — the trigger before the prefix + // governs — and must not leak the general keyword set. + + #[test] + fn members_after_self_dot_with_prefix() { + let src = + "//! m\n\nsystem S {\n run() {\n self.he\n }\n helper(x: number): uuid;\n}\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("self.he").unwrap() + "self.he".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"helper".to_owned()), "{labels:?}"); + assert!(labels.contains(&"run".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn types_after_colon_with_prefix() { + let src = "//! m\n\ndata D { x: numb }\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("numb").unwrap() + "numb".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"number".to_owned()), "{labels:?}"); + assert!(labels.contains(&"D".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn macros_after_hash_bracket_with_prefix() { + let src = "//! m\n\n#[ht\nsystem S;\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("#[ht").unwrap() + "#[ht".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"http".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn public_symbols_after_module_path_with_prefix() { + let mods = [ + ("a", "//! a\n\npublic system Svc;\n\nsystem Hidden;\n"), + ("b", "//! b\n\ncontainer C for a::Sv\n"), + ]; + let ws = workspace(&mods); + let src = mods[1].1; + let offset = (src.find("a::Sv").unwrap() + "a::Sv".len()) as u32; + let labels = labels_at(&ws, "b", src, offset); + assert!(labels.contains(&"Svc".to_owned()), "{labels:?}"); + assert!(!labels.contains(&"Hidden".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } } From f2bdd97291b9daa5f56cf97eb0f2db1b380b7e1c Mon Sep 17 00:00:00 2001 From: "shockwave-bot[bot]" <274219579+shockwave-bot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 02:57:08 +0000 Subject: [PATCH 02/65] docs: record the two independent completion engines Native LSP (complete.rs) and the web IDE's context-free JS provider are unsynchronised; wasm exports no completion. Notes the surface to edit per request and the unify-via-wasm direction. refs #10 Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 8f6c6a1..03df8dd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,3 +37,14 @@ A `PreToolUse` hook in `.claude/settings.json` **denies any `git commit`** until ## Rust crate A Cargo workspace (`resolver = "3"`, edition 2024) with one member, `crates/pseudoscript`, whose binary is named `pds`. Standard commands: `cargo build`, `cargo test`, `cargo run -p pseudoscript`, `cargo test ` for a single test. The implementation is not started; when writing Rust, the `idiomatic-rust` skill is required. + +## Completion has two independent engines — do not conflate them + +Autocomplete is served by two separate, unsynchronised implementations. A fix to one does **not** reach the other: + +- **Native LSP** — `crates/pseudoscript-lsp/src/complete.rs` (context-aware: `.`/`::`/`:`/`<`/`#[`), consumed at `server.rs` `completion()`. This is what real editors (e.g. `pseudoscript-jetbrains`) get over LSP. +- **Web IDE** — `web-ide/src/lib/pseudoscript-language.js` `pseudoscriptCompletion()`, a CodeMirror provider. It is **context-free**: always offers all keywords + all workspace symbols (name and fqn), relying solely on CodeMirror's prefix filter. No `.`/`::`/type-position narrowing. + +The wasm bundle (`crates/pseudoscript-wasm`, prebuilt into `web-ide/src/lib/pds-wasm/`) exports `hover`/`definition`/`references` but **no `completion`** — so the web IDE never calls Rust for completion, and rebuilding wasm changes nothing about IDE autocomplete. Rebuild only when a *wasm-exported* surface changes: `wasm-pack build` via `web-ide` `npm run build:wasm`, then commit the regenerated `pds-wasm/` artifacts. + +When asked to fix "autocomplete", first establish which surface: web IDE → edit the JS provider; LSP editor → edit `complete.rs`. The long-term fix is to give `complete.rs` a wasm `completion` export and have the IDE call it, collapsing the two into one. From 200e54ad03281cd499a1f51817c18692b6711e74 Mon Sep 17 00:00:00 2001 From: "shockwave-bot[bot]" <274219579+shockwave-bot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 03:23:22 +0000 Subject: [PATCH 03/65] feat(ide): source completion from the shared LSP engine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The web IDE completed from a context-free JS provider (every keyword + every symbol, always), while the LSP's context-aware engine was unreachable from wasm (tower-lsp/tokio won't build to wasm32). Extract the completion engine into pseudoscript-model::complete with a neutral CompletionItem/CompletionKind over byte offsets, carrying the governing_trigger scope fix. pseudoscript-lsp and pseudoscript-wasm become thin adapters: the LSP maps to lsp_types, wasm serialises to JSON via a new completion(modules, fqn, offset) export. The web IDE calls it and replaces only the trailing identifier segment, so members complete after '.', a module's symbols after '::', macros after '#[', types in type position — identical to native editors. Regenerated pds-wasm bundle. refs #10 Co-Authored-By: Claude Opus 4.8 --- crates/pseudoscript-lsp/src/complete.rs | 317 ++------------- crates/pseudoscript-model/src/complete.rs | 368 ++++++++++++++++++ crates/pseudoscript-model/src/lib.rs | 2 + crates/pseudoscript-wasm/src/lib.rs | 57 ++- web-ide/src/lib/components/Editor.svelte | 22 +- .../src/lib/pds-wasm/pseudoscript_wasm.d.ts | 17 + web-ide/src/lib/pds-wasm/pseudoscript_wasm.js | 41 ++ .../lib/pds-wasm/pseudoscript_wasm_bg.wasm | Bin 1539550 -> 1547324 bytes .../pds-wasm/pseudoscript_wasm_bg.wasm.d.ts | 1 + web-ide/src/lib/pds.js | 13 + web-ide/src/lib/pseudoscript-language.js | 64 +-- 11 files changed, 582 insertions(+), 320 deletions(-) create mode 100644 crates/pseudoscript-model/src/complete.rs diff --git a/crates/pseudoscript-lsp/src/complete.rs b/crates/pseudoscript-lsp/src/complete.rs index 70f4768..afd1f47 100644 --- a/crates/pseudoscript-lsp/src/complete.rs +++ b/crates/pseudoscript-lsp/src/complete.rs @@ -1,23 +1,13 @@ -//! Context-aware completion. +//! LSP adapter over the shared completion engine. //! -//! The completion context is read from the token immediately left of the caret: -//! -//! - after `.` → the base node's callables and fields; -//! - after `::` → the named module's (public) symbols; -//! - after `#[` → the built-in macros; -//! - after `:` or `<` (type position) → primitive types, `Result`, and every -//! declared type; -//! - otherwise → keywords, this module's symbols, and its aliases. -//! -//! The client filters the returned set against the prefix being typed, so the -//! full candidate list is offered. +//! The context-aware logic lives in `pseudoscript_model::complete`; this module +//! only maps a `Position` to a byte offset and the engine's neutral +//! [`CompletionKind`] to `lsp_types::CompletionItemKind`. -use pseudoscript_model::{BUILTIN_MACROS, MemberKind, SymbolKind, Workspace}; -use pseudoscript_syntax::{Token, TokenKind, tokenize}; +use pseudoscript_model::{CompletionKind, Workspace, completion as model_completion}; use tower_lsp::lsp_types::{CompletionItem, CompletionItemKind, Position}; use crate::convert::position_to_offset; -use crate::resolve::{enclosing_node, module_of}; /// Computes completion items for `position` in module `from_fqn`'s `src`. #[must_use] @@ -28,176 +18,28 @@ pub fn completion( position: Position, ) -> Vec { let offset = position_to_offset(src, position); - let tokens = tokenize(src); - let trigger = governing_trigger(&tokens, offset); - - match trigger.map(|i| (i, tokens[i].kind)) { - Some((i, TokenKind::Dot)) => member_items(ws, from_fqn, src, &tokens, i), - Some((i, TokenKind::ColonColon)) => path_items(ws, from_fqn, &tokens, i), - Some((_, TokenKind::HashLBracket)) => macro_items(), - Some((_, TokenKind::Colon | TokenKind::LAngle)) => type_items(ws), - _ => general_items(ws, from_fqn), - } -} - -/// Index of the token whose kind governs completion at `offset`. -/// -/// The trigger is the rightmost token ending at or before the caret — except -/// for a partial identifier typed *under* the caret, which ends exactly at -/// `offset` (`span.end == offset`). That identifier is the prefix the client -/// filters on, not the context, so its predecessor is the real trigger. A caret -/// strictly inside an identifier (`span.end > offset`) is already excluded by -/// the `<= offset` bound, so only the boundary case needs skipping. -fn governing_trigger(tokens: &[Token], offset: u32) -> Option { - let last = tokens.iter().rposition(|t| t.span.end <= offset)?; - if tokens[last].kind == TokenKind::Ident && tokens[last].span.end == offset { - last.checked_sub(1) - } else { - Some(last) - } -} - -/// Callables and fields of the node named by the base before `tokens[dot]`. -fn member_items( - ws: &Workspace, - from_fqn: &str, - _src: &str, - tokens: &[Token], - dot: usize, -) -> Vec { - let Some((owner_module, owner_name)) = owner_before(ws, from_fqn, tokens, dot) else { - return Vec::new(); - }; - let Some(entry) = ws.module(&owner_module) else { - return Vec::new(); - }; - entry - .model - .members(&owner_name) - .iter() - .map(|m| { - let kind = match m.kind { - MemberKind::Callable => CompletionItemKind::METHOD, - MemberKind::Field => CompletionItemKind::FIELD, - }; - item(&m.name, kind, &m.detail) + model_completion(ws, from_fqn, src, offset) + .into_iter() + .map(|c| CompletionItem { + label: c.label, + kind: Some(item_kind(c.kind)), + detail: Some(c.detail), + ..CompletionItem::default() }) .collect() } -/// The `(module, node-name)` the base token before `tokens[dot]` denotes: -/// `self`'s enclosing node, or an in-scope node name. -fn owner_before( - ws: &Workspace, - from_fqn: &str, - tokens: &[Token], - dot: usize, -) -> Option<(String, String)> { - let base = tokens.get(dot.checked_sub(1)?)?; - match base.kind { - TokenKind::KwSelf => { - let node = enclosing_node(&ws.module(from_fqn)?.ast, base.span.start)?; - Some((from_fqn.to_owned(), node)) - } - TokenKind::Ident => { - let symbol = ws.module(from_fqn)?.model.symbol(&base.text)?; - Some((module_of(&symbol.fqn).to_owned(), symbol.name.clone())) - } - _ => None, - } -} - -/// Symbols of the module named by the `::` path ending at `tokens[ccolon]`. -/// A cross-module suggestion is offered only when `public` (§8.2). -fn path_items( - ws: &Workspace, - from_fqn: &str, - tokens: &[Token], - ccolon: usize, -) -> Vec { - let prefix = module_prefix(tokens, ccolon); - ws.symbols() - .filter(|s| module_of(&s.fqn) == prefix && (prefix == from_fqn || s.is_public)) - .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)) - .collect() -} - -/// The `::`-joined module path written immediately before `tokens[ccolon]`. -fn module_prefix(tokens: &[Token], ccolon: usize) -> String { - let mut segments = Vec::new(); - let mut cursor = ccolon.checked_sub(1); - while let Some(i) = cursor { - if tokens[i].kind != TokenKind::Ident { - break; - } - segments.push(tokens[i].text.as_str()); - cursor = match i.checked_sub(1) { - Some(j) if tokens[j].kind == TokenKind::ColonColon => i.checked_sub(2), - _ => None, - }; - } - segments.reverse(); - segments.join("::") -} - -/// The built-in macros (`#[...]`). -fn macro_items() -> Vec { - BUILTIN_MACROS - .iter() - .map(|m| item(m, CompletionItemKind::FUNCTION, "built-in macro")) - .collect() -} - -/// Primitive types, `Result`, and every declared node/data type. -fn type_items(ws: &Workspace) -> Vec { - let primitives = TokenKind::PRIMITIVE_TYPES - .iter() - .map(|t| item(t, CompletionItemKind::STRUCT, "primitive type")) - .chain(std::iter::once(item( - "Result", - CompletionItemKind::STRUCT, - "built-in generic", - ))); - let declared = ws - .symbols() - .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)); - primitives.chain(declared).collect() -} - -/// Keywords plus this module's own symbols and aliases. -fn general_items(ws: &Workspace, from_fqn: &str) -> Vec { - let keywords = TokenKind::KEYWORDS - .iter() - .map(|k| item(k, CompletionItemKind::KEYWORD, "keyword")); - let Some(entry) = ws.module(from_fqn) else { - return keywords.collect(); - }; - let symbols = entry - .model - .symbols() - .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)); - let aliases = entry - .model - .aliases() - .map(|(name, a)| item(name, CompletionItemKind::REFERENCE, &a.target)); - keywords.chain(symbols).chain(aliases).collect() -} - -/// The completion kind for a declared symbol. -fn symbol_kind(kind: SymbolKind) -> CompletionItemKind { +/// Maps the engine's neutral kind to the LSP completion-item kind. +fn item_kind(kind: CompletionKind) -> CompletionItemKind { match kind { - SymbolKind::Data => CompletionItemKind::CLASS, - _ => CompletionItemKind::MODULE, - } -} - -/// Builds a labelled completion item with a detail string. -fn item(label: &str, kind: CompletionItemKind, detail: &str) -> CompletionItem { - CompletionItem { - label: label.to_owned(), - kind: Some(kind), - detail: Some(detail.to_owned()), - ..CompletionItem::default() + CompletionKind::Method => CompletionItemKind::METHOD, + CompletionKind::Field => CompletionItemKind::FIELD, + CompletionKind::Keyword => CompletionItemKind::KEYWORD, + CompletionKind::Macro => CompletionItemKind::FUNCTION, + CompletionKind::Type => CompletionItemKind::STRUCT, + CompletionKind::Class => CompletionItemKind::CLASS, + CompletionKind::Module => CompletionItemKind::MODULE, + CompletionKind::Reference => CompletionItemKind::REFERENCE, } } @@ -215,7 +57,8 @@ mod tests { ) } - /// Completion labels at the byte `offset` in module `from`. + /// Completion labels at the byte `offset` in module `from`, through the + /// LSP adapter (`Position` in, `lsp_types` out). fn labels_at(ws: &Workspace, from: &str, src: &str, offset: u32) -> Vec { let pos = offset_to_position(src, &LineIndex::new(src), offset); completion(ws, from, src, pos) @@ -225,73 +68,13 @@ mod tests { } #[test] - fn members_after_self_dot() { - let src = "//! m\n\nsystem S {\n run() {\n self.\n }\n helper(x: number): uuid;\n}\n"; - let ws = workspace(&[("m", src)]); - let offset = (src.find("self.").unwrap() + "self.".len()) as u32; - let labels = labels_at(&ws, "m", src, offset); - assert!(labels.contains(&"helper".to_owned()), "{labels:?}"); - assert!(labels.contains(&"run".to_owned()), "{labels:?}"); - } - - #[test] - fn types_after_colon() { - let src = "//! m\n\ndata D { x: }\n"; - let ws = workspace(&[("m", src)]); - let offset = (src.find("x:").unwrap() + 2) as u32; - let labels = labels_at(&ws, "m", src, offset); - assert!(labels.contains(&"number".to_owned()), "{labels:?}"); - assert!(labels.contains(&"Result".to_owned()), "{labels:?}"); - assert!(labels.contains(&"D".to_owned()), "{labels:?}"); - } - - #[test] - fn macros_after_hash_bracket() { - let src = "//! m\n\n#[\nsystem S;\n"; - let ws = workspace(&[("m", src)]); - let offset = (src.find("#[").unwrap() + 2) as u32; - let labels = labels_at(&ws, "m", src, offset); - assert!(labels.contains(&"http".to_owned()), "{labels:?}"); - assert!(labels.contains(&"onevent".to_owned()), "{labels:?}"); - } - - #[test] - fn public_symbols_after_module_path() { - let mods = [ - ("a", "//! a\n\npublic system Svc;\n\nsystem Hidden;\n"), - ("b", "//! b\n\ncontainer C for a::\n"), - ]; - let ws = workspace(&mods); - let src = mods[1].1; - let offset = (src.find("a::").unwrap() + 3) as u32; - let labels = labels_at(&ws, "b", src, offset); - assert!(labels.contains(&"Svc".to_owned()), "{labels:?}"); - // a private node in another module is not offered (§8.2) - assert!(!labels.contains(&"Hidden".to_owned()), "{labels:?}"); - } - - #[test] - fn keywords_in_general_position() { - let src = "//! m\n\n"; - let ws = workspace(&[("m", src)]); - let labels = labels_at(&ws, "m", src, src.len() as u32); - assert!(labels.contains(&"system".to_owned()), "{labels:?}"); - assert!(labels.contains(&"public".to_owned()), "{labels:?}"); - } - - // With a prefix typed, the caret sits at the end of a partial identifier. - // Each narrowing context must stay scoped — the trigger before the prefix - // governs — and must not leak the general keyword set. - - #[test] - fn members_after_self_dot_with_prefix() { + fn adapter_scopes_members_with_prefix() { let src = "//! m\n\nsystem S {\n run() {\n self.he\n }\n helper(x: number): uuid;\n}\n"; let ws = workspace(&[("m", src)]); let offset = (src.find("self.he").unwrap() + "self.he".len()) as u32; let labels = labels_at(&ws, "m", src, offset); assert!(labels.contains(&"helper".to_owned()), "{labels:?}"); - assert!(labels.contains(&"run".to_owned()), "{labels:?}"); assert!( !labels.contains(&"system".to_owned()), "general scope leaked: {labels:?}" @@ -299,47 +82,15 @@ mod tests { } #[test] - fn types_after_colon_with_prefix() { - let src = "//! m\n\ndata D { x: numb }\n"; - let ws = workspace(&[("m", src)]); - let offset = (src.find("numb").unwrap() + "numb".len()) as u32; - let labels = labels_at(&ws, "m", src, offset); - assert!(labels.contains(&"number".to_owned()), "{labels:?}"); - assert!(labels.contains(&"D".to_owned()), "{labels:?}"); - assert!( - !labels.contains(&"system".to_owned()), - "general scope leaked: {labels:?}" - ); - } - - #[test] - fn macros_after_hash_bracket_with_prefix() { - let src = "//! m\n\n#[ht\nsystem S;\n"; + fn adapter_maps_kinds() { + let src = "//! m\n\n"; let ws = workspace(&[("m", src)]); - let offset = (src.find("#[ht").unwrap() + "#[ht".len()) as u32; - let labels = labels_at(&ws, "m", src, offset); - assert!(labels.contains(&"http".to_owned()), "{labels:?}"); - assert!( - !labels.contains(&"system".to_owned()), - "general scope leaked: {labels:?}" - ); - } - - #[test] - fn public_symbols_after_module_path_with_prefix() { - let mods = [ - ("a", "//! a\n\npublic system Svc;\n\nsystem Hidden;\n"), - ("b", "//! b\n\ncontainer C for a::Sv\n"), - ]; - let ws = workspace(&mods); - let src = mods[1].1; - let offset = (src.find("a::Sv").unwrap() + "a::Sv".len()) as u32; - let labels = labels_at(&ws, "b", src, offset); - assert!(labels.contains(&"Svc".to_owned()), "{labels:?}"); - assert!(!labels.contains(&"Hidden".to_owned()), "{labels:?}"); - assert!( - !labels.contains(&"system".to_owned()), - "general scope leaked: {labels:?}" - ); + let pos = offset_to_position(src, &LineIndex::new(src), src.len() as u32); + let items = completion(&ws, "m", src, pos); + let kw = items + .iter() + .find(|c| c.label == "system") + .expect("keyword present"); + assert_eq!(kw.kind, Some(CompletionItemKind::KEYWORD)); } } diff --git a/crates/pseudoscript-model/src/complete.rs b/crates/pseudoscript-model/src/complete.rs new file mode 100644 index 0000000..061e8ce --- /dev/null +++ b/crates/pseudoscript-model/src/complete.rs @@ -0,0 +1,368 @@ +//! Context-aware completion — the shared engine behind both the LSP +//! (`pseudoscript-lsp`) and the web IDE (`pseudoscript-wasm`). +//! +//! The completion context is read from the token immediately left of the caret: +//! +//! - after `.` → the base node's callables and fields; +//! - after `::` → the named module's (public) symbols; +//! - after `#[` → the built-in macros; +//! - after `:` or `<` (type position) → primitive types, `Result`, and every +//! declared type; +//! - otherwise → keywords, this module's symbols, and its aliases. +//! +//! The caller filters the returned set against the prefix being typed, so the +//! full candidate list is offered. Positions are byte offsets, so the engine is +//! adapter-neutral: the LSP maps to `lsp_types`, the IDE serialises to JSON. + +use pseudoscript_syntax::{Token, TokenKind, tokenize}; +use serde::Serialize; + +use crate::resolve::{enclosing_node, module_of}; +use crate::{BUILTIN_MACROS, MemberKind, SymbolKind, Workspace}; + +/// What a completion candidate denotes — drives the icon each surface renders. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum CompletionKind { + /// A callable member reached through `.`. + Method, + /// A record field reached through `.`. + Field, + /// A language keyword. + Keyword, + /// A built-in macro (`#[...]`). + Macro, + /// A primitive type or `Result`. + Type, + /// A `data` declaration. + Class, + /// A node declaration (system / container / component / person). + Module, + /// An alias. + Reference, +} + +/// One completion candidate: its insert text, what it is, and a one-line detail. +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct CompletionItem { + /// The text offered (and inserted). + pub label: String, + /// What the candidate denotes. + pub kind: CompletionKind, + /// A one-line detail (signature, fqn, or category). + pub detail: String, +} + +/// Completion candidates for byte `offset` in module `from_fqn`'s `src`. +#[must_use] +pub fn completion(ws: &Workspace, from_fqn: &str, src: &str, offset: u32) -> Vec { + let tokens = tokenize(src); + let trigger = governing_trigger(&tokens, offset); + + match trigger.map(|i| (i, tokens[i].kind)) { + Some((i, TokenKind::Dot)) => member_items(ws, from_fqn, &tokens, i), + Some((i, TokenKind::ColonColon)) => path_items(ws, from_fqn, &tokens, i), + Some((_, TokenKind::HashLBracket)) => macro_items(), + Some((_, TokenKind::Colon | TokenKind::LAngle)) => type_items(ws), + _ => general_items(ws, from_fqn), + } +} + +/// Index of the token whose kind governs completion at `offset`. +/// +/// The trigger is the rightmost token ending at or before the caret — except +/// for a partial identifier typed *under* the caret, which ends exactly at +/// `offset` (`span.end == offset`). That identifier is the prefix the caller +/// filters on, not the context, so its predecessor is the real trigger. A caret +/// strictly inside an identifier (`span.end > offset`) is already excluded by +/// the `<= offset` bound, so only the boundary case needs skipping. +fn governing_trigger(tokens: &[Token], offset: u32) -> Option { + let last = tokens.iter().rposition(|t| t.span.end <= offset)?; + if tokens[last].kind == TokenKind::Ident && tokens[last].span.end == offset { + last.checked_sub(1) + } else { + Some(last) + } +} + +/// Callables and fields of the node named by the base before `tokens[dot]`. +fn member_items( + ws: &Workspace, + from_fqn: &str, + tokens: &[Token], + dot: usize, +) -> Vec { + let Some((owner_module, owner_name)) = owner_before(ws, from_fqn, tokens, dot) else { + return Vec::new(); + }; + let Some(entry) = ws.module(&owner_module) else { + return Vec::new(); + }; + entry + .model + .members(&owner_name) + .iter() + .map(|m| { + let kind = match m.kind { + MemberKind::Callable => CompletionKind::Method, + MemberKind::Field => CompletionKind::Field, + }; + item(&m.name, kind, &m.detail) + }) + .collect() +} + +/// The `(module, node-name)` the base token before `tokens[dot]` denotes: +/// `self`'s enclosing node, or an in-scope node name. +fn owner_before( + ws: &Workspace, + from_fqn: &str, + tokens: &[Token], + dot: usize, +) -> Option<(String, String)> { + let base = tokens.get(dot.checked_sub(1)?)?; + match base.kind { + TokenKind::KwSelf => { + let node = enclosing_node(&ws.module(from_fqn)?.ast, base.span.start)?; + Some((from_fqn.to_owned(), node)) + } + TokenKind::Ident => { + let symbol = ws.module(from_fqn)?.model.symbol(&base.text)?; + Some((module_of(&symbol.fqn).to_owned(), symbol.name.clone())) + } + _ => None, + } +} + +/// Symbols of the module named by the `::` path ending at `tokens[ccolon]`. +/// A cross-module suggestion is offered only when `public` (§8.2). +fn path_items( + ws: &Workspace, + from_fqn: &str, + tokens: &[Token], + ccolon: usize, +) -> Vec { + let prefix = module_prefix(tokens, ccolon); + ws.symbols() + .filter(|s| module_of(&s.fqn) == prefix && (prefix == from_fqn || s.is_public)) + .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)) + .collect() +} + +/// The `::`-joined module path written immediately before `tokens[ccolon]`. +fn module_prefix(tokens: &[Token], ccolon: usize) -> String { + let mut segments = Vec::new(); + let mut cursor = ccolon.checked_sub(1); + while let Some(i) = cursor { + if tokens[i].kind != TokenKind::Ident { + break; + } + segments.push(tokens[i].text.as_str()); + cursor = match i.checked_sub(1) { + Some(j) if tokens[j].kind == TokenKind::ColonColon => i.checked_sub(2), + _ => None, + }; + } + segments.reverse(); + segments.join("::") +} + +/// The built-in macros (`#[...]`). +fn macro_items() -> Vec { + BUILTIN_MACROS + .iter() + .map(|m| item(m, CompletionKind::Macro, "built-in macro")) + .collect() +} + +/// Primitive types, `Result`, and every declared node/data type. +fn type_items(ws: &Workspace) -> Vec { + let primitives = TokenKind::PRIMITIVE_TYPES + .iter() + .map(|t| item(t, CompletionKind::Type, "primitive type")) + .chain(std::iter::once(item( + "Result", + CompletionKind::Type, + "built-in generic", + ))); + let declared = ws + .symbols() + .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)); + primitives.chain(declared).collect() +} + +/// Keywords plus this module's own symbols and aliases. +fn general_items(ws: &Workspace, from_fqn: &str) -> Vec { + let keywords = TokenKind::KEYWORDS + .iter() + .map(|k| item(k, CompletionKind::Keyword, "keyword")); + let Some(entry) = ws.module(from_fqn) else { + return keywords.collect(); + }; + let symbols = entry + .model + .symbols() + .map(|s| item(&s.name, symbol_kind(s.kind), &s.fqn)); + let aliases = entry + .model + .aliases() + .map(|(name, a)| item(name, CompletionKind::Reference, &a.target)); + keywords.chain(symbols).chain(aliases).collect() +} + +/// The completion kind for a declared symbol. +fn symbol_kind(kind: SymbolKind) -> CompletionKind { + match kind { + SymbolKind::Data => CompletionKind::Class, + _ => CompletionKind::Module, + } +} + +/// Builds a labelled completion item with a detail string. +fn item(label: &str, kind: CompletionKind, detail: &str) -> CompletionItem { + CompletionItem { + label: label.to_owned(), + kind, + detail: detail.to_owned(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use pseudoscript_syntax::parse; + + fn workspace(modules: &[(&str, &str)]) -> Workspace { + Workspace::build( + modules + .iter() + .map(|(fqn, src)| ((*fqn).to_owned(), parse(src).ast)), + ) + } + + /// Completion labels at byte `offset` in module `from`. + fn labels_at(ws: &Workspace, from: &str, src: &str, offset: u32) -> Vec { + completion(ws, from, src, offset) + .into_iter() + .map(|c| c.label) + .collect() + } + + #[test] + fn members_after_self_dot() { + let src = "//! m\n\nsystem S {\n run() {\n self.\n }\n helper(x: number): uuid;\n}\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("self.").unwrap() + "self.".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"helper".to_owned()), "{labels:?}"); + assert!(labels.contains(&"run".to_owned()), "{labels:?}"); + } + + #[test] + fn types_after_colon() { + let src = "//! m\n\ndata D { x: }\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("x:").unwrap() + 2) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"number".to_owned()), "{labels:?}"); + assert!(labels.contains(&"Result".to_owned()), "{labels:?}"); + assert!(labels.contains(&"D".to_owned()), "{labels:?}"); + } + + #[test] + fn macros_after_hash_bracket() { + let src = "//! m\n\n#[\nsystem S;\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("#[").unwrap() + 2) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"http".to_owned()), "{labels:?}"); + assert!(labels.contains(&"onevent".to_owned()), "{labels:?}"); + } + + #[test] + fn public_symbols_after_module_path() { + let mods = [ + ("a", "//! a\n\npublic system Svc;\n\nsystem Hidden;\n"), + ("b", "//! b\n\ncontainer C for a::\n"), + ]; + let ws = workspace(&mods); + let src = mods[1].1; + let offset = (src.find("a::").unwrap() + 3) as u32; + let labels = labels_at(&ws, "b", src, offset); + assert!(labels.contains(&"Svc".to_owned()), "{labels:?}"); + assert!(!labels.contains(&"Hidden".to_owned()), "{labels:?}"); + } + + #[test] + fn keywords_in_general_position() { + let src = "//! m\n\n"; + let ws = workspace(&[("m", src)]); + let labels = labels_at(&ws, "m", src, src.len() as u32); + assert!(labels.contains(&"system".to_owned()), "{labels:?}"); + assert!(labels.contains(&"public".to_owned()), "{labels:?}"); + } + + // With a prefix typed, the caret sits at the end of a partial identifier. + // Each narrowing context must stay scoped — the trigger before the prefix + // governs — and must not leak the general keyword set. + + #[test] + fn members_after_self_dot_with_prefix() { + let src = + "//! m\n\nsystem S {\n run() {\n self.he\n }\n helper(x: number): uuid;\n}\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("self.he").unwrap() + "self.he".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"helper".to_owned()), "{labels:?}"); + assert!(labels.contains(&"run".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn types_after_colon_with_prefix() { + let src = "//! m\n\ndata D { x: numb }\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("numb").unwrap() + "numb".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"number".to_owned()), "{labels:?}"); + assert!(labels.contains(&"D".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn macros_after_hash_bracket_with_prefix() { + let src = "//! m\n\n#[ht\nsystem S;\n"; + let ws = workspace(&[("m", src)]); + let offset = (src.find("#[ht").unwrap() + "#[ht".len()) as u32; + let labels = labels_at(&ws, "m", src, offset); + assert!(labels.contains(&"http".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } + + #[test] + fn public_symbols_after_module_path_with_prefix() { + let mods = [ + ("a", "//! a\n\npublic system Svc;\n\nsystem Hidden;\n"), + ("b", "//! b\n\ncontainer C for a::Sv\n"), + ]; + let ws = workspace(&mods); + let src = mods[1].1; + let offset = (src.find("a::Sv").unwrap() + "a::Sv".len()) as u32; + let labels = labels_at(&ws, "b", src, offset); + assert!(labels.contains(&"Svc".to_owned()), "{labels:?}"); + assert!(!labels.contains(&"Hidden".to_owned()), "{labels:?}"); + assert!( + !labels.contains(&"system".to_owned()), + "general scope leaked: {labels:?}" + ); + } +} diff --git a/crates/pseudoscript-model/src/lib.rs b/crates/pseudoscript-model/src/lib.rs index f8ab904..d97f9c7 100644 --- a/crates/pseudoscript-model/src/lib.rs +++ b/crates/pseudoscript-model/src/lib.rs @@ -30,10 +30,12 @@ //! ``` mod check; +pub mod complete; mod graph; mod model; pub mod resolve; +pub use complete::{CompletionItem, CompletionKind, completion}; pub use graph::{ Edge, EdgeKind, Graph, GraphNode, NodeDoc, NodeKind, SigParam, Signature, Step, Trigger, Visibility, diff --git a/crates/pseudoscript-wasm/src/lib.rs b/crates/pseudoscript-wasm/src/lib.rs index 4a93a12..5810096 100644 --- a/crates/pseudoscript-wasm/src/lib.rs +++ b/crates/pseudoscript-wasm/src/lib.rs @@ -40,7 +40,7 @@ use pseudoscript_emit::{ use pseudoscript_format::format as format_source; use pseudoscript_model::{ Graph, NodeKind, Workspace, WorkspaceModule, check as check_source, check_workspace_modules, - graph as build_graph, resolve::resolve_at, + completion as model_completion, graph as build_graph, resolve::resolve_at, }; use pseudoscript_syntax::{ Diagnostic, LineIndex, Severity, TokenKind, parse as parse_source, tokenize, @@ -233,6 +233,23 @@ pub fn references(modules_json: &str, module_fqn: &str, offset: u32) -> Result Result { + completion_impl(modules_json, module_fqn, offset).map_err(|e| JsError::new(&e)) +} + /// Projects the fitting diagram for the symbol `fqn` over the whole workspace /// and returns its laid-out [`Scene`] as JSON (the interactive counterpart of /// [`hover`]'s `svg`, for a side panel or full-screen view). See @@ -570,6 +587,22 @@ fn references_impl(modules_json: &str, module_fqn: &str, offset: u32) -> Result< })) } +fn completion_impl(modules_json: &str, module_fqn: &str, offset: u32) -> Result { + let modules = modules_from_json(modules_json)?; + let src = modules + .iter() + .find(|m| m.fqn == module_fqn) + .map_or("", |m| m.source.as_str()); + let workspace = Workspace::build( + modules + .iter() + .map(|m| (m.fqn.clone(), parse_source(&m.source).ast)), + ); + Ok(to_json(&model_completion( + &workspace, module_fqn, src, offset, + ))) +} + fn symbol_scene_impl(modules_json: &str, fqn: &str) -> Result { let graph = build_graph(&modules_from_json(modules_json)?); let scene = project_symbol(&graph, fqn).map_err(|e| e.to_string())?; @@ -836,9 +869,9 @@ fn to_json(value: &T) -> String { #[cfg(test)] mod tests { use super::{ - check, check_modules_impl, doc_config, doc_manifest_impl, emit_scene_modules_impl, - format_impl, hover_impl, outline, parse, project_view, references_impl, symbol_scene_impl, - symbol_svg_impl, to_json, + check, check_modules_impl, completion_impl, doc_config, doc_manifest_impl, + emit_scene_modules_impl, format_impl, hover_impl, outline, parse, project_view, + references_impl, symbol_scene_impl, symbol_svg_impl, to_json, }; #[test] @@ -1001,6 +1034,22 @@ mod tests { assert_eq!(json, "null"); } + #[test] + fn completion_after_module_path_is_scoped() { + // Caret right after `sys::` (before `Web`) — offers only module sys's + // public symbols, tagged, with no general-scope keyword leak. + let offset = (CTX_SRC.find("sys::").expect("sys:: present") + "sys::".len()) as u32; + let json = completion_impl(&workspace_json(), "ctx", offset).expect("completes"); + assert!(json.contains(r#""label":"Web""#), "{json}"); + assert!(json.contains(r#""label":"Shop""#), "{json}"); + assert!(json.contains(r#""kind":"module""#), "{json}"); + // general scope must not leak into a `::` context + assert!( + !json.contains(r#""label":"person""#), + "general scope leaked: {json}" + ); + } + #[test] fn symbol_scene_projects_a_container() { let json = symbol_scene_impl(&workspace_json(), "sys::Web").expect("projects"); diff --git a/web-ide/src/lib/components/Editor.svelte b/web-ide/src/lib/components/Editor.svelte index 6b3c9fb..c6c3038 100644 --- a/web-ide/src/lib/components/Editor.svelte +++ b/web-ide/src/lib/components/Editor.svelte @@ -19,7 +19,7 @@ import { pseudoscript, pseudoscriptCompletion, pseudoscriptLinter } from "$lib/pseudoscript-language.js"; import { markdownLivePreview } from "$lib/markdown-live.js"; import { keybindings } from "$lib/keybindings.svelte.js"; - import { definition as symbolDefinition, hover as symbolHover, references as symbolReferences } from "$lib/pds.js"; + import { completion as symbolCompletion, definition as symbolDefinition, hover as symbolHover, references as symbolReferences } from "$lib/pds.js"; import { byteToChar, charToByte } from "$lib/offsets.js"; import { blockRanges } from "$lib/blocks.js"; @@ -542,6 +542,24 @@ keymap.of(Object.entries(shortcutRun).map(([id, run]) => ({ key: keybindings.keyFor(id), run }))); const keysCompartment = new Compartment(); + // Completion candidates from the shared LSP engine (via wasm), scoped to the + // trigger before the caret. The active module uses the live document text so a + // just-typed `.`/`::` is reflected; other modules come from `ctx.modules`. + // Returns `[{ label, kind, detail }]`; an empty list on any wasm error so a + // transient parse failure never breaks typing. + function completionsAt(cmContext) { + const src = cmContext.state.doc.toString(); + const offset = charToByte(src, cmContext.pos); + const modules = ctx.modules.map((m) => + m.fqn === ctx.moduleFqn ? { ...m, source: src } : m, + ); + try { + return symbolCompletion(modules, ctx.moduleFqn, offset); + } catch { + return []; + } + } + // The language bundle, swapped per file type: PseudoScript (default), Markdown // live-preview (an authored doc), or nothing (plain text). Keeps Markdown free // of PseudoScript highlighting/lint while rendering it in place. @@ -551,7 +569,7 @@ if (plain) return []; return [ pseudoscript(), - pseudoscriptCompletion(() => ctx.symbols), + pseudoscriptCompletion(completionsAt), pdsFoldService, lintGutter(), pseudoscriptLinter(), diff --git a/web-ide/src/lib/pds-wasm/pseudoscript_wasm.d.ts b/web-ide/src/lib/pds-wasm/pseudoscript_wasm.d.ts index dcd7492..21c448d 100644 --- a/web-ide/src/lib/pds-wasm/pseudoscript_wasm.d.ts +++ b/web-ide/src/lib/pds-wasm/pseudoscript_wasm.d.ts @@ -21,6 +21,22 @@ export function check(source: string): string; */ export function check_modules(modules_json: string): string; +/** + * Context-aware completion candidates at `offset` (a byte offset) in module + * `module_fqn`. Returns a JSON array `[{label, kind, detail}]`, where `kind` is + * a lowercase tag (`method`/`field`/`keyword`/`macro`/`type`/`class`/`module`/ + * `reference`) the editor maps to an icon. The set is scoped to the trigger + * before the caret (`.`/`::`/`#[`/type-position/general); the client filters it + * against the prefix being typed. `modules_json` is the `[{fqn, source}]` + * workspace shape. This is the same engine the LSP serves, so the web IDE and + * native editors complete identically. + * + * # Errors + * + * Returns an error when `modules_json` is not valid JSON of the expected shape. + */ +export function completion(modules_json: string, module_fqn: string, offset: number): string; + /** * Resolves the symbol under `offset` (a byte offset) in module `module_fqn` to * the FQN of its declaration, for go-to-definition. Returns the FQN as a JSON @@ -230,6 +246,7 @@ export interface InitOutput { readonly memory: WebAssembly.Memory; readonly check: (a: number, b: number) => [number, number]; readonly check_modules: (a: number, b: number) => [number, number, number, number]; + readonly completion: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; readonly definition: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; readonly doc_manifest: (a: number, b: number) => [number, number, number, number]; readonly doc_ssr_bundle: () => [number, number]; diff --git a/web-ide/src/lib/pds-wasm/pseudoscript_wasm.js b/web-ide/src/lib/pds-wasm/pseudoscript_wasm.js index 8ad79c9..3430070 100644 --- a/web-ide/src/lib/pds-wasm/pseudoscript_wasm.js +++ b/web-ide/src/lib/pds-wasm/pseudoscript_wasm.js @@ -56,6 +56,47 @@ export function check_modules(modules_json) { } } +/** + * Context-aware completion candidates at `offset` (a byte offset) in module + * `module_fqn`. Returns a JSON array `[{label, kind, detail}]`, where `kind` is + * a lowercase tag (`method`/`field`/`keyword`/`macro`/`type`/`class`/`module`/ + * `reference`) the editor maps to an icon. The set is scoped to the trigger + * before the caret (`.`/`::`/`#[`/type-position/general); the client filters it + * against the prefix being typed. `modules_json` is the `[{fqn, source}]` + * workspace shape. This is the same engine the LSP serves, so the web IDE and + * native editors complete identically. + * + * # Errors + * + * Returns an error when `modules_json` is not valid JSON of the expected shape. + * @param {string} modules_json + * @param {string} module_fqn + * @param {number} offset + * @returns {string} + */ +export function completion(modules_json, module_fqn, offset) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(modules_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(module_fqn, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.completion(ptr0, len0, ptr1, len1, offset); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } +} + /** * Resolves the symbol under `offset` (a byte offset) in module `module_fqn` to * the FQN of its declaration, for go-to-definition. Returns the FQN as a JSON diff --git a/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm b/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm index c4978aa0e9b66eff0e4b7d7aae8eee55bad20ccb..0052f07485560e93b6c71a019e2deb4dc4292510 100644 GIT binary patch delta 272864 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

    jZ9sBAK>4ri$7R84FKkdi6n)q;Fo*PC{ zZSzG`bCtCt%-ndxH9Q|PQn@-w7Zlc=@v|cwuT7`+;I-+42CAj15 zMQo4(F99}JMMlX~dX-wsE#eiI{~NY{bn3C-2sFC4$?0Z#xA5}er)qkJW30pJ$g)Q` zC#Bm{?31#`WhBF{^4&mG+-qizxD{_g7m%RNpk3V}I$Bzs)EXCvCqoh=F|qF*#Kc}7 z(6c9o@1)kFKy(|V%KE=9P*5jdsBl%CP;LyQGo)*zR#+gyn}tT9u1$wgSCn47_HBV^ z@%jL^RoXDeonWcd366N?Otfk zPpyn}fzZqwL0h03Lvy~S(*L;BR>SY2Fll%inhTCJ9MnqM+ev#gbOZRGmHavB|D)74 zXs+lbsgskOcBf;kJu}mhoHfpoyk7=dD0Q*k0IchX*2ZzE9W=MJlhi!S{G*<2V_>(r zk7EEX1!>XS#ZcG74g>cw_doYN_dE9+3y%Yfzn{m#ltwG`h^P9D$aJJSqaA4xW0OW^ zjFYpTJCfVN!kxmB&?c0UAa;lYk_s^y0P%{E%T zM_2>-vQwM3L&U%Sur>Vmo5fcD>t=CqJB;70Qy4#Q8!c>yNOX0_1Ef8g+6&Sel9oAk zggs+|GsBTKdc?SKss2;wJWAmHzasV5(A>kfp!vXEEBPI%hu9}%raJ2eXtX`ep5Yid zF3p~0PjgNf*?EjTIWyHh#_3ESo0OKBluEtY8*{ubG#B_PG*|FCG*_&RpNrGW(yb!d zHBp+TLGxUhEp?8xFN5Z+E1`MxKZ532@rks54$VbwkbINm+o5^g?ttceyQP1x)CUZ| ziw;S{QD`psgyEo5(tcLjFF^CUt&;qP^nWAu571mut<-8z7Q@E#ke6W^J}LbfcqJm^ zpwlWx8iq+QgzE-_PXm9_#NFV$Q>y~zfwwjBnc#dor~FII`L%O9MVDd9)gG=Prlf)3 zywxdxeQFZe*{e3ZlIw{$ypvE&F$ z!z2njrmf#4CR?D}?iL$aSL_y%tncp@PqMZa;v-tvF=JEoAwPdIN}Q6&dA}$WF?yat zF`xD5J)&obN~<9quLIZ%_K26+@7p6jcPak~OeFTpct$0qPOvLq`R{$k;?c`8;wbvP z-&kTM|B>JO6JruN4n42dYOi>vm#V0PU&3||5>jXQ_<$q>Om#Tz8CXu-p!fEQMd7N9 zAWSqq7s+%(lSb=lx)g~%-018g;blExpP0q^{yzL`6-Avx=`dtZCuj)IKNeneEVpqc z;wi<4I6kH-ehru}R}|+v>L?Sh2IhfR{_la!{vF`0@YS_0L9t(kU=;Y2sesPlaV92SqPv&;5fUuAb$mlb+aOQ9r;n zr&}m3hvY(bLyki(L24k>9hVo77LY$cUV!w6BtXVP+>rT@HIO3^A0)I#D8)jahr9$C z1bG*d33(5)5V8ug1+uG0Xj>`=xDNRl((t)Z3Wv0Z#6t!`-hzyHPP=qegj-ftX!nnb z$jCcr+F&%5yN91mYD-v!E{NB;7Jp2%v3&oFHu{*bTRuIYoj4{UqTl}&yTcz~q4*qNel94!2{=OMT3ERl)JN@#qcO?&g;4ROetel9ccP)Z21b{7a?3@x01oWh zIS~`G2v3za;NS_xoxuTDh@ARcmRzIYE{kohaIL&TSi@?WpYOB3*yy{}NXqkjf3YX% zyx1QUauVO>`Ne`SUHI+fWSMs1vgi<^8gd6V4mh~P)BK9q7*yxr4?*1GlGC2@>tbSa zS49PC3Rq3Hn>r{a+b=rsl5N&`xGcRtB-=6_4L(4&&vn%54%xObs^?y|oNR}57*Y5o z*~)d;E~SQSH+1-`WhvS2FbwSNd2tunW?W$0?6b4C$hPEyi%Ex@GZvCX^?qQ~k-w8| z`bGAQ*l_5(iFssO$gF{Tvenb3;yl^b=rm_TXjP`y7q;R__&yb@3J1Z$qflD|)@%(TXh$lqsd8kfJUHvp zXM@L@_zZB~ZB==Eb%fp4Rc9CoL!>D|Q*d(y{Kqh6o`tk#p6$mc`td1#d_QE#6;kSZ09a& z&dJuDmQ$6U*eTY>0zwW|G{Ywryvqk01s$r;hD^1#Y1D2&D0P5z8lX*|YK;sTToX!J Ykj0RlkgGM?_NmrxmYgcBW~#OJKlK8BYXATM delta 264515 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 diff --git a/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm.d.ts b/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm.d.ts index fe45ca2..8aee209 100644 --- a/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm.d.ts +++ b/web-ide/src/lib/pds-wasm/pseudoscript_wasm_bg.wasm.d.ts @@ -3,6 +3,7 @@ export const memory: WebAssembly.Memory; export const check: (a: number, b: number) => [number, number]; export const check_modules: (a: number, b: number) => [number, number, number, number]; +export const completion: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; export const definition: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; export const doc_manifest: (a: number, b: number) => [number, number, number, number]; export const doc_ssr_bundle: () => [number, number]; diff --git a/web-ide/src/lib/pds.js b/web-ide/src/lib/pds.js index fea76b1..11b8629 100644 --- a/web-ide/src/lib/pds.js +++ b/web-ide/src/lib/pds.js @@ -15,6 +15,7 @@ import init, { hover as wasmHover, definition as wasmDefinition, references as wasmReferences, + completion as wasmCompletion, doc_ssr_bundle as wasmDocSsrBundle, doc_manifest as wasmDocManifest, outline as wasmOutline, @@ -128,6 +129,18 @@ export function references(modules, moduleFqn, offset) { return JSON.parse(wasmReferences(JSON.stringify(modules), moduleFqn, offset)); } +/** + * Context-aware completion candidates at a byte `offset` in module `moduleFqn`. + * Returns `[{ label, kind, detail }]`, where `kind` is a lowercase tag + * (`method`/`field`/`keyword`/`macro`/`type`/`class`/`module`/`reference`). The + * set is scoped to the trigger before the caret (`.`/`::`/`#[`/type-position/ + * general); the editor filters it against the prefix being typed. This is the + * same engine the LSP serves. `modules` is `[{ fqn, source }]`. + */ +export function completion(modules, moduleFqn, offset) { + return JSON.parse(wasmCompletion(JSON.stringify(modules), moduleFqn, offset)); +} + /** * Project the fitting diagram for a symbol to its laid-out scene object (the * interactive counterpart of {@link hover}'s `svg`, for a side panel or diff --git a/web-ide/src/lib/pseudoscript-language.js b/web-ide/src/lib/pseudoscript-language.js index 4849514..2819aec 100644 --- a/web-ide/src/lib/pseudoscript-language.js +++ b/web-ide/src/lib/pseudoscript-language.js @@ -98,50 +98,52 @@ export function pseudoscript() { return new LanguageSupport(streamLang, [syntaxHighlighting(highlightStyle)]); } -// The completion type CodeMirror tags each option with (drives its icon). +// Maps the LSP engine's neutral completion kind to the CodeMirror option type +// that drives each candidate's icon. const KIND_TYPE = { - person: "variable", - system: "class", - container: "class", - component: "class", - data: "type", - callable: "function", + method: "method", + field: "property", + keyword: "keyword", + macro: "function", + type: "type", + class: "class", + module: "namespace", + reference: "variable", }; -// Every reserved word, offered as a keyword completion. -const KEYWORD_OPTIONS = [...KEYWORDS, ...STEP_KEYWORDS, ...PRIMITIVES, ...ATOMS].map((label) => ({ - label, - type: "keyword", -})); - /** - * Autocomplete from the language's keywords plus the workspace's declared - * symbols. `getSymbols()` returns `[{ name, fqn, kind }]` (the live outline), so - * both a node's simple name and its full `::` path complete. Matches a word that - * may include `::`, so `orders::OrderService` completes mid-path. + * Autocomplete sourced from the shared LSP completion engine (the same one the + * native language server serves), so the web IDE narrows by context — members + * after `.`, a module's symbols after `::`, macros after `#[`, types in type + * position — instead of always offering every keyword and symbol. + * + * `getCompletions(context)` returns `[{ label, kind, detail }]` for the caret; + * the labels are bare segment names, so completion replaces only the identifier + * segment under the caret (after the last `.`/`::`), and CodeMirror filters the + * returned set against the typed prefix. */ -export function pseudoscriptCompletion(getSymbols) { +export function pseudoscriptCompletion(getCompletions) { return autocompletion({ activateOnTyping: true, icons: true, override: [ (context) => { - const word = context.matchBefore(/[A-Za-z_][\w:]*/); - if (!word || (word.from === word.to && !context.explicit)) return null; + // Auto-open only once a prefix is typed; an explicit invoke (Ctrl-Space) + // still completes at the bare caret. Only the trailing identifier + // segment is replaced — the `.`/`::` before it is context the engine + // already accounted for. + const word = context.matchBefore(/[A-Za-z_]\w*/); + if (!word && !context.explicit) return null; + const from = word ? word.from : context.pos; const seen = new Set(); const options = []; - const add = (label, type, detail) => { - if (seen.has(label)) return; - seen.add(label); - options.push(detail ? { label, type, detail } : { label, type }); - }; - for (const o of KEYWORD_OPTIONS) add(o.label, o.type); - for (const s of getSymbols?.() ?? []) { - const type = KIND_TYPE[s.kind] ?? "variable"; - add(s.name, type, s.kind); - add(s.fqn, type, s.kind); + for (const c of getCompletions?.(context) ?? []) { + if (seen.has(c.label)) continue; + seen.add(c.label); + options.push({ label: c.label, type: KIND_TYPE[c.kind] ?? "variable", detail: c.detail }); } - return { from: word.from, options, validFor: /^[\w:]*$/ }; + if (options.length === 0) return null; + return { from, options, validFor: /^\w*$/ }; }, ], }); From 558072370f3f896093013edd4e292bb4262a3157 Mon Sep 17 00:00:00 2001 From: "shockwave-bot[bot]" <274219579+shockwave-bot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 04:46:02 +0000 Subject: [PATCH 04/65] feat(ide): align highlighting + folding to the LSP; add test suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Broader LSP alignment (the web IDE should source language intelligence from the compiler, not reimplement it in JS): - Semantic highlighting: extract the AST-aware token engine into pseudoscript-model::semantic (neutral SemKind/SemToken over byte offsets); pseudoscript-lsp delta-encodes to lsp_types, pseudoscript-wasm exports semantic_tokens(). The IDE now decorates these tokens (data-sem marks) and the hand-written StreamLanguage tokenizer + JS keyword lists are gone — no more drift from the lexer. - Folding: extract fold ranges into pseudoscript-model::fold; wasm folding_ranges(); the IDE folds AST-accurate ranges and blocks.js (brace-scan) is removed. Testing suite (data-testid throughout, no brittle selectors): - Vitest + Testing Library: unit tests for offset conversion, component test for FileTree's data-testid contract. - Playwright e2e: headless tests for highlighting roles, completion scoping + the prefix-narrowing scope fix, and compiler-driven folding. - Storybook (@storybook/sveltekit) with FileTree stories. - data-testid added to file rows, editor host, and sample cards. refs #10 Co-Authored-By: Claude Opus 4.8 --- crates/pseudoscript-lsp/src/semantic.rs | 444 +- crates/pseudoscript-lsp/src/symbols.rs | 75 +- crates/pseudoscript-model/src/fold.rs | 119 + crates/pseudoscript-model/src/lib.rs | 4 + crates/pseudoscript-model/src/semantic.rs | 429 ++ crates/pseudoscript-wasm/src/lib.rs | 26 +- web-ide/.gitignore | 5 + web-ide/.storybook/main.js | 9 + web-ide/.storybook/preview.js | 8 + web-ide/e2e/ide.spec.js | 58 + web-ide/package-lock.json | 3739 +++++++++++++++-- web-ide/package.json | 17 +- web-ide/playwright.config.js | 26 + web-ide/src/lib/blocks.js | 37 - web-ide/src/lib/components/Editor.svelte | 20 +- .../src/lib/components/FileTree.stories.js | 33 + web-ide/src/lib/components/FileTree.svelte | 1 + web-ide/src/lib/components/FileTree.test.js | 39 + .../src/lib/components/ProjectPanel.svelte | 2 +- web-ide/src/lib/offsets.test.js | 46 + .../src/lib/pds-wasm/pseudoscript_wasm.d.ts | 21 + web-ide/src/lib/pds-wasm/pseudoscript_wasm.js | 49 + .../lib/pds-wasm/pseudoscript_wasm_bg.wasm | Bin 1547324 -> 1562069 bytes .../pds-wasm/pseudoscript_wasm_bg.wasm.d.ts | 2 + web-ide/src/lib/pds.js | 21 + web-ide/src/lib/pseudoscript-language.js | 171 +- web-ide/vitest-setup.js | 7 + web-ide/vitest.config.js | 16 + 28 files changed, 4570 insertions(+), 854 deletions(-) create mode 100644 crates/pseudoscript-model/src/fold.rs create mode 100644 crates/pseudoscript-model/src/semantic.rs create mode 100644 web-ide/.storybook/main.js create mode 100644 web-ide/.storybook/preview.js create mode 100644 web-ide/e2e/ide.spec.js create mode 100644 web-ide/playwright.config.js delete mode 100644 web-ide/src/lib/blocks.js create mode 100644 web-ide/src/lib/components/FileTree.stories.js create mode 100644 web-ide/src/lib/components/FileTree.test.js create mode 100644 web-ide/src/lib/offsets.test.js create mode 100644 web-ide/vitest-setup.js create mode 100644 web-ide/vitest.config.js diff --git a/crates/pseudoscript-lsp/src/semantic.rs b/crates/pseudoscript-lsp/src/semantic.rs index c70bafd..48f9aa6 100644 --- a/crates/pseudoscript-lsp/src/semantic.rs +++ b/crates/pseudoscript-lsp/src/semantic.rs @@ -1,55 +1,22 @@ -//! AST-aware semantic tokens (LSP `textDocument/semanticTokens`). +//! LSP adapter over the shared semantic-token engine. //! -//! Two passes feed one sorted, non-overlapping, delta-encoded token list: -//! -//! - **Token pass** ([`tokenize`]) colours the leaves the tree does not expose -//! as convenient spans: keywords, doc comments, string/number literals, and -//! the `#[` macro opener. These kinds are never identifiers. -//! - **AST pass** ([`parse`]) colours identifiers by their *role* — a `system` -//! name is a namespace, a `data` name a class, a callable a method, a -//! parameter a parameter, a `.f()` step a method call. Identifiers are never -//! touched by the token pass, so the two sets cannot overlap. -//! -//! The shared [`legend`] keeps the server capability and the encoding in step: -//! [`Sem`] discriminants index it directly. +//! The AST-aware colouring lives in `pseudoscript_model::semantic`; this module +//! advertises the legend and delta-encodes the engine's byte-offset tokens into +//! the `lsp_types` wire format (single-line, non-overlapping, delta-encoded). -use pseudoscript_syntax::{LineIndex, Span, TokenKind, ast, parse, tokenize}; +use pseudoscript_model::{SemKind, semantic_tokens as model_semantic_tokens}; +use pseudoscript_syntax::LineIndex; use tower_lsp::lsp_types::{ SemanticToken, SemanticTokenModifier, SemanticTokenType, SemanticTokens, SemanticTokensLegend, }; use crate::convert::offset_to_position; -/// A semantic token type. The discriminant is its index into [`legend`]'s -/// `token_types`, so the two MUST stay in the same order. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum Sem { - Namespace = 0, - Type, - Class, - Parameter, - Variable, - Property, - EnumMember, - Method, - Keyword, - Comment, - Str, - Number, - Decorator, -} - -impl Sem { - /// The token type's index into the legend. - fn index(self) -> u32 { - self as u32 - } -} - /// The `declaration` modifier bit (bit 0 of the legend's modifier list). const MOD_DECLARATION: u32 = 1 << 0; -/// The token types this server emits, in legend order (see [`Sem`]). +/// The token types this server emits, in legend order. The index MUST match +/// [`sem_index`]. fn token_types() -> Vec { vec![ SemanticTokenType::NAMESPACE, @@ -77,323 +44,40 @@ pub fn legend() -> SemanticTokensLegend { } } -/// A coloured span before delta-encoding. -struct Raw { - span: Span, - ty: Sem, - mods: u32, -} - -/// Computes the semantic tokens for `src` as a full-document set. -#[must_use] -pub fn semantic_tokens(src: &str) -> SemanticTokens { - let mut raws = Vec::new(); - token_pass(src, &mut raws); - ast_pass(&parse(src).ast, &mut raws); - encode(src, &raws) -} - -/// Colours keywords, doc comments, literals, and the `#[` macro opener. -fn token_pass(src: &str, out: &mut Vec) { - for token in tokenize(src) { - let ty = match token.kind { - k if is_keyword(k) => Sem::Keyword, - TokenKind::Doc | TokenKind::InnerDoc | TokenKind::Tag => Sem::Comment, - TokenKind::String => Sem::Str, - TokenKind::Number => Sem::Number, - TokenKind::HashLBracket => Sem::Decorator, - _ => continue, - }; - out.push(Raw { - span: token.span, - ty, - mods: 0, - }); - } -} - -/// Whether `kind` is one of the reserved keywords (§2.3). `self`, `Ok`, `Err`, -/// `true`, and `false` count, so the AST pass need not re-colour them. -fn is_keyword(kind: TokenKind) -> bool { - matches!( - kind, - TokenKind::KwSystem - | TokenKind::KwContainer - | TokenKind::KwComponent - | TokenKind::KwPerson - | TokenKind::KwData - | TokenKind::KwFor - | TokenKind::KwAlias - | TokenKind::KwFrom - | TokenKind::KwPublic - | TokenKind::KwSelf - | TokenKind::KwReturn - | TokenKind::KwOk - | TokenKind::KwErr - | TokenKind::KwIf - | TokenKind::KwElse - | TokenKind::KwWhile - | TokenKind::KwIn - | TokenKind::KwTrue - | TokenKind::KwFalse - ) -} - -/// Colours identifiers by their declared role across the whole module. -fn ast_pass(module: &ast::Module, out: &mut Vec) { - for item in &module.items { - match item { - ast::Item::Alias(alias) => { - push(out, alias.name.span, Sem::Namespace, MOD_DECLARATION); - namespace_path(&alias.target, out); - } - ast::Item::Decl(decl) => decl_tokens(decl, out), - ast::Item::Feature(feature) => { - push(out, feature.name.span, Sem::Namespace, MOD_DECLARATION); - namespace_path(&feature.target, out); - } - } - } -} - -/// Colours a declaration: its macros, then its structural payload. -fn decl_tokens(decl: &ast::Decl, out: &mut Vec) { - for mac in &decl.macros { - macro_tokens(mac, out); - } - match &decl.kind { - ast::DeclKind::Person(node) - | ast::DeclKind::System(node) - | ast::DeclKind::Container(node) - | ast::DeclKind::Component(node) => node_tokens(node, out), - ast::DeclKind::Data(data) => data_tokens(data, out), - } -} - -/// Colours a node: its name (namespace, declared), its `for` parent path, and -/// its disclosed body members. -fn node_tokens(node: &ast::Node, out: &mut Vec) { - push(out, node.name.span, Sem::Namespace, MOD_DECLARATION); - if let Some(parent) = &node.parent { - namespace_path(parent, out); - } - for member in node.body.iter().flatten() { - match member { - ast::BodyMember::Callable(callable) => callable_tokens(callable, out), - ast::BodyMember::Decl(decl) => decl_tokens(decl, out), - } - } -} - -/// Colours a `data` declaration: its name (class, declared) and its fields or -/// variants. -fn data_tokens(data: &ast::Data, out: &mut Vec) { - push(out, data.name.span, Sem::Class, MOD_DECLARATION); - match &data.body { - ast::DataBody::Record(fields) => fields_tokens(fields, out), - ast::DataBody::Union(variants) => { - for variant in variants { - push(out, variant.name.span, Sem::EnumMember, MOD_DECLARATION); - if let Some(fields) = &variant.record { - fields_tokens(fields, out); - } - } - } - ast::DataBody::BlackBox => {} - } -} - -/// Colours record fields: each name (property, declared) and its type. -fn fields_tokens(fields: &[ast::Field], out: &mut Vec) { - for field in fields { - push(out, field.name.span, Sem::Property, MOD_DECLARATION); - type_tokens(&field.ty, out); - } -} - -/// Colours a callable: macros, name (method, declared), parameters, return -/// type, and body. -fn callable_tokens(callable: &ast::Callable, out: &mut Vec) { - for mac in &callable.macros { - macro_tokens(mac, out); - } - push(out, callable.name.span, Sem::Method, MOD_DECLARATION); - for param in &callable.params { - push(out, param.name.span, Sem::Parameter, MOD_DECLARATION); - type_tokens(¶m.ty, out); - } - if let Some(ret) = &callable.return_ty { - type_tokens(ret, out); - } - if let Some(block) = &callable.body { - block_tokens(block, out); - } -} - -/// Colours every statement in a block. -fn block_tokens(block: &ast::Block, out: &mut Vec) { - for stmt in &block.stmts { - stmt_tokens(stmt, out); - } -} - -/// Colours one statement and its sub-expressions. -fn stmt_tokens(stmt: &ast::Stmt, out: &mut Vec) { - match &stmt.kind { - ast::StmtKind::Assign { name, value } => { - push(out, name.span, Sem::Variable, MOD_DECLARATION); - expr_tokens(value, out); - } - ast::StmtKind::Return(value) => { - if let Some(value) = value { - expr_tokens(value, out); - } - } - ast::StmtKind::If { - cond, - then_block, - else_block, - } => { - expr_tokens(cond, out); - block_tokens(then_block, out); - if let Some(block) = else_block { - block_tokens(block, out); - } - } - ast::StmtKind::For { - binding, - iter, - body, - } => { - push(out, binding.span, Sem::Variable, MOD_DECLARATION); - expr_tokens(iter, out); - block_tokens(body, out); - } - ast::StmtKind::While { cond, body } => { - expr_tokens(cond, out); - block_tokens(body, out); - } - ast::StmtKind::Expr(expr) => expr_tokens(expr, out), - } -} - -/// Colours an expression: references, calls, field access, and `from` types. -fn expr_tokens(expr: &ast::Expr, out: &mut Vec) { - match &expr.kind { - ast::ExprKind::Marker { payload, .. } => { - if let Some(payload) = payload { - expr_tokens(payload, out); - } - } - ast::ExprKind::From { ty, sources, .. } => { - type_path(ty, out); - for source in sources { - expr_tokens(source, out); - } - } - ast::ExprKind::Postfix { base, segments } => { - expr_tokens(base, out); - for seg in segments { - let ty = if seg.call_args.is_some() { - Sem::Method - } else { - Sem::Property - }; - push(out, seg.name.span, ty, 0); - for arg in seg.call_args.iter().flatten() { - expr_tokens(arg, out); - } - } - } - ast::ExprKind::Ref(ast::Ref::Path(path)) => ref_path(path, out), - // `self` is a keyword and literals are coloured by the token pass. - ast::ExprKind::Ref(ast::Ref::SelfNode(_)) | ast::ExprKind::Literal(_) => {} - ast::ExprKind::Unary { expr, .. } => expr_tokens(expr, out), - ast::ExprKind::Paren(inner) => expr_tokens(inner, out), - } -} - -/// Colours a type: the base path (qualifiers as namespaces, the name as a type) -/// and any generic arguments. -fn type_tokens(ty: &ast::Type, out: &mut Vec) { - type_path(&ty.name, out); - for generic in &ty.generics { - type_tokens(generic, out); - } -} - -/// Colours a macro's name path as a decorator; its path/literal arguments take -/// type colours (literals are already coloured by the token pass). -fn macro_tokens(mac: &ast::Macro, out: &mut Vec) { - for segment in &mac.name.segments { - push(out, segment.span, Sem::Decorator, 0); - } - if let ast::MacroArgs::List(args) = &mac.args { - for arg in args { - match arg { - ast::MacroArg::Path(path) => type_path(path, out), - ast::MacroArg::Nested(nested) => macro_tokens(nested, out), - ast::MacroArg::Literal(_) => {} - } - } - } -} - -/// Colours a value-reference path: trailing name as a variable, qualifiers as -/// namespaces. -fn ref_path(path: &ast::Path, out: &mut Vec) { - split_path(path, Sem::Variable, out); -} - -/// Colours a type path: trailing name as a type, qualifiers as namespaces. -fn type_path(path: &ast::Path, out: &mut Vec) { - split_path(path, Sem::Type, out); -} - -/// Colours every segment of a path as a namespace (parent / alias target). -fn namespace_path(path: &ast::Path, out: &mut Vec) { - for segment in &path.segments { - push(out, segment.span, Sem::Namespace, 0); - } -} - -/// Colours a path's last segment as `last`, every qualifier as a namespace. -fn split_path(path: &ast::Path, last: Sem, out: &mut Vec) { - let Some((name, qualifiers)) = path.segments.split_last() else { - return; - }; - for segment in qualifiers { - push(out, segment.span, Sem::Namespace, 0); +/// The legend index for a model token kind (must match [`token_types`] order). +fn sem_index(kind: SemKind) -> u32 { + match kind { + SemKind::Namespace => 0, + SemKind::Type => 1, + SemKind::Class => 2, + SemKind::Parameter => 3, + SemKind::Variable => 4, + SemKind::Property => 5, + SemKind::EnumMember => 6, + SemKind::Method => 7, + SemKind::Keyword => 8, + SemKind::Comment => 9, + SemKind::String => 10, + SemKind::Number => 11, + SemKind::Decorator => 12, } - push(out, name.span, last, 0); } -/// Records one coloured span. -fn push(out: &mut Vec, span: Span, ty: Sem, mods: u32) { - out.push(Raw { span, ty, mods }); -} - -/// Sorts the raw spans and delta-encodes them into LSP semantic tokens. +/// Computes the semantic tokens for `src` as a full-document, delta-encoded set. /// -/// Tokens are ordered by start offset; any token overlapping its predecessor, -/// spanning more than one line, or of zero width is dropped (the protocol -/// requires single-line, non-overlapping tokens). -fn encode(src: &str, raws: &[Raw]) -> SemanticTokens { +/// The engine already returns sorted, non-overlapping byte-offset tokens; this +/// drops any spanning more than one line (the protocol requires single-line +/// tokens) and delta-encodes the rest. +#[must_use] +pub fn semantic_tokens(src: &str) -> SemanticTokens { let index = LineIndex::new(src); - let mut ordered: Vec<&Raw> = raws.iter().collect(); - ordered.sort_by_key(|raw| raw.span.start); - let mut data = Vec::new(); let mut prev_line = 0; let mut prev_start = 0; - let mut last_end = 0; - for raw in ordered { - if raw.span.start < last_end { - continue; - } - let start = offset_to_position(src, &index, raw.span.start); - let end = offset_to_position(src, &index, raw.span.end); + for token in model_semantic_tokens(src) { + let start = offset_to_position(src, &index, token.start); + let end = offset_to_position(src, &index, token.end); if end.line != start.line || end.character <= start.character { continue; } @@ -407,12 +91,15 @@ fn encode(src: &str, raws: &[Raw]) -> SemanticTokens { delta_line, delta_start, length: end.character - start.character, - token_type: raw.ty.index(), - token_modifiers_bitset: raw.mods, + token_type: sem_index(token.kind), + token_modifiers_bitset: if token.declaration { + MOD_DECLARATION + } else { + 0 + }, }); prev_line = start.line; prev_start = start.character; - last_end = raw.span.end; } SemanticTokens { @@ -461,7 +148,6 @@ mod tests { .collect() } - /// Finds the decoded token starting at the first occurrence of `needle`. fn at<'a>(decoded: &'a [Decoded], src: &str, needle: &str) -> &'a Decoded { let offset = src.find(needle).expect("substring present") as u32; let line = src[..offset as usize].matches('\n').count() as u32; @@ -473,14 +159,6 @@ mod tests { .unwrap_or_else(|| panic!("no token at {needle:?}")) } - #[test] - fn legend_indices_match_discriminants() { - let types = token_types(); - assert_eq!(types[Sem::Namespace as usize], SemanticTokenType::NAMESPACE); - assert_eq!(types[Sem::Decorator as usize], SemanticTokenType::DECORATOR); - assert_eq!(types.len(), Sem::Decorator as usize + 1); - } - #[test] fn node_name_is_a_declared_namespace() { let src = "//! m\n\npublic system Banking;\n"; @@ -492,52 +170,12 @@ mod tests { } #[test] - fn keyword_and_data_name_colours() { + fn data_name_and_members() { let src = "//! m\n\ndata Account { id: uuid }\n"; let decoded = decode(src); assert_eq!(at(&decoded, src, "data").ty, SemanticTokenType::KEYWORD); - let account = at(&decoded, src, "Account"); - assert_eq!(account.ty, SemanticTokenType::CLASS); - assert!(account.declared); + assert_eq!(at(&decoded, src, "Account").ty, SemanticTokenType::CLASS); assert_eq!(at(&decoded, src, "id").ty, SemanticTokenType::PROPERTY); assert_eq!(at(&decoded, src, "uuid").ty, SemanticTokenType::TYPE); } - - #[test] - fn callable_param_type_and_calls() { - let src = "//! m\n\nsystem S {\n run(name: string): uuid {\n return self.alloc(name)\n }\n}\n"; - let decoded = decode(src); - assert_eq!(at(&decoded, src, "run").ty, SemanticTokenType::METHOD); - assert_eq!(at(&decoded, src, "name").ty, SemanticTokenType::PARAMETER); - assert_eq!(at(&decoded, src, "string").ty, SemanticTokenType::TYPE); - assert_eq!(at(&decoded, src, "self").ty, SemanticTokenType::KEYWORD); - // the `.alloc(...)` call segment - assert_eq!(at(&decoded, src, "alloc").ty, SemanticTokenType::METHOD); - } - - #[test] - fn member_call_is_a_method_token() { - // `run` in `Repo.run(x)` is a call segment → coloured as a method. - let src = "//! m\n\nsystem S {\n go() {\n Repo.run(x)\n }\n}\n"; - let decoded = decode(src); - assert_eq!(at(&decoded, src, "run").ty, SemanticTokenType::METHOD); - } - - #[test] - fn macro_name_is_a_decorator() { - let src = "//! m\n\n#[diagram]\nsystem S;\n"; - let decoded = decode(src); - assert_eq!( - at(&decoded, src, "diagram").ty, - SemanticTokenType::DECORATOR - ); - } - - #[test] - fn string_literal_is_a_string() { - let src = "//! m\n\nsystem S {\n f() {\n return Err(\"boom\")\n }\n}\n"; - let decoded = decode(src); - assert_eq!(at(&decoded, src, "\"boom\"").ty, SemanticTokenType::STRING); - assert_eq!(at(&decoded, src, "Err").ty, SemanticTokenType::KEYWORD); - } } diff --git a/crates/pseudoscript-lsp/src/symbols.rs b/crates/pseudoscript-lsp/src/symbols.rs index 112b6f7..9058f90 100644 --- a/crates/pseudoscript-lsp/src/symbols.rs +++ b/crates/pseudoscript-lsp/src/symbols.rs @@ -158,80 +158,21 @@ fn symbol( } /// The foldable regions of `src`: every multi-line declaration and statement -/// block. +/// block. Spans come from the shared engine; this only maps them to line-based +/// `FoldingRange`s and drops single-line spans. #[must_use] pub fn folding_ranges(src: &str) -> Vec { - let module = parse(src).ast; let index = LineIndex::new(src); - let mut spans = Vec::new(); - for item in &module.items { - if let ast::Item::Decl(decl) = item { - collect_decl_spans(decl, &mut spans); - } - } - spans + pseudoscript_model::folding_ranges(src) .into_iter() - .filter_map(|span| fold(span, &index)) + .filter_map(|range| fold(range, &index)) .collect() } -/// Collects the foldable span of a *disclosed* declaration (one with a `{ }` -/// body) and any blocks nested in it. A black-box `;` declaration has nothing -/// to fold. -fn collect_decl_spans(decl: &ast::Decl, out: &mut Vec) { - match &decl.kind { - ast::DeclKind::Person(node) - | ast::DeclKind::System(node) - | ast::DeclKind::Container(node) - | ast::DeclKind::Component(node) => { - let Some(body) = &node.body else { return }; - out.push(decl.span); - for member in body { - match member { - ast::BodyMember::Decl(inner) => collect_decl_spans(inner, out), - ast::BodyMember::Callable(callable) => { - if let Some(block) = &callable.body { - collect_block_spans(block, out); - } - } - } - } - } - ast::DeclKind::Data(data) => { - if !matches!(data.body, ast::DataBody::BlackBox) { - out.push(decl.span); - } - } - } -} - -/// Collects a block's span and the spans of any nested control-flow blocks. -fn collect_block_spans(block: &ast::Block, out: &mut Vec) { - out.push(block.span); - for stmt in &block.stmts { - match &stmt.kind { - ast::StmtKind::If { - then_block, - else_block, - .. - } => { - collect_block_spans(then_block, out); - if let Some(block) = else_block { - collect_block_spans(block, out); - } - } - ast::StmtKind::For { body, .. } | ast::StmtKind::While { body, .. } => { - collect_block_spans(body, out); - } - _ => {} - } - } -} - -/// A folding range for `span`, or `None` when it does not cross a line. -fn fold(span: Span, index: &LineIndex) -> Option { - let (start_line, _) = index.line_col(span.start); - let (end_line, _) = index.line_col(span.end); +/// A folding range for a byte span, or `None` when it does not cross a line. +fn fold(range: pseudoscript_model::FoldRange, index: &LineIndex) -> Option { + let (start_line, _) = index.line_col(range.start); + let (end_line, _) = index.line_col(range.end); (end_line > start_line).then_some(FoldingRange { start_line: start_line - 1, start_character: None, diff --git a/crates/pseudoscript-model/src/fold.rs b/crates/pseudoscript-model/src/fold.rs new file mode 100644 index 0000000..150ebf0 --- /dev/null +++ b/crates/pseudoscript-model/src/fold.rs @@ -0,0 +1,119 @@ +//! Foldable source regions — the shared engine behind the LSP +//! (`pseudoscript-lsp`) and the web IDE (`pseudoscript-wasm`). +//! +//! Every *disclosed* declaration (one with a `{ }` body) and every statement +//! block is foldable. Ranges are absolute byte offsets of the whole construct; +//! the LSP maps them to line-based `FoldingRange`s, the IDE to editor offsets. + +use pseudoscript_syntax::{Span, ast, parse}; +use serde::Serialize; + +/// A foldable region in absolute byte offsets (the construct from its opening +/// keyword/brace through its closing brace). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +pub struct FoldRange { + /// Start byte offset of the construct. + pub start: u32, + /// End byte offset of the construct. + pub end: u32, +} + +/// The foldable regions of `src`: every multi-line declaration and statement +/// block. Order follows source position of the collected spans. +#[must_use] +pub fn folding_ranges(src: &str) -> Vec { + let module = parse(src).ast; + let mut spans = Vec::new(); + for item in &module.items { + if let ast::Item::Decl(decl) = item { + collect_decl_spans(decl, &mut spans); + } + } + spans + .into_iter() + .map(|s| FoldRange { + start: s.start, + end: s.end, + }) + .collect() +} + +/// Collects the foldable span of a *disclosed* declaration (one with a `{ }` +/// body) and any blocks nested in it. A black-box `;` declaration has nothing +/// to fold. +fn collect_decl_spans(decl: &ast::Decl, out: &mut Vec) { + match &decl.kind { + ast::DeclKind::Person(node) + | ast::DeclKind::System(node) + | ast::DeclKind::Container(node) + | ast::DeclKind::Component(node) => { + let Some(body) = &node.body else { return }; + out.push(decl.span); + for member in body { + match member { + ast::BodyMember::Decl(inner) => collect_decl_spans(inner, out), + ast::BodyMember::Callable(callable) => { + if let Some(block) = &callable.body { + collect_block_spans(block, out); + } + } + } + } + } + ast::DeclKind::Data(data) => { + if !matches!(data.body, ast::DataBody::BlackBox) { + out.push(decl.span); + } + } + } +} + +/// Collects a block's span and the spans of any nested control-flow blocks. +fn collect_block_spans(block: &ast::Block, out: &mut Vec) { + out.push(block.span); + for stmt in &block.stmts { + match &stmt.kind { + ast::StmtKind::If { + then_block, + else_block, + .. + } => { + collect_block_spans(then_block, out); + if let Some(block) = else_block { + collect_block_spans(block, out); + } + } + ast::StmtKind::For { body, .. } | ast::StmtKind::While { body, .. } => { + collect_block_spans(body, out); + } + _ => {} + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn folds_disclosed_node_and_nested_block() { + let src = "//! m\n\nsystem S {\n run() {\n return self\n }\n}\n"; + let ranges = folding_ranges(src); + // the system declaration and the callable's block + assert!(ranges.len() >= 2, "{ranges:?}"); + let outer_close = (src.rfind('}').unwrap() + 1) as u32; + // the widest range covers the whole disclosed system, brace to brace + assert!( + ranges + .iter() + .any(|r| r.start <= src.find('{').unwrap() as u32 && r.end >= outer_close), + "{ranges:?}" + ); + } + + #[test] + fn black_box_decl_has_no_fold() { + let src = "//! m\n\nsystem S;\n"; + assert!(folding_ranges(src).is_empty()); + } +} diff --git a/crates/pseudoscript-model/src/lib.rs b/crates/pseudoscript-model/src/lib.rs index d97f9c7..d711f60 100644 --- a/crates/pseudoscript-model/src/lib.rs +++ b/crates/pseudoscript-model/src/lib.rs @@ -31,11 +31,14 @@ mod check; pub mod complete; +pub mod fold; mod graph; mod model; pub mod resolve; +pub mod semantic; pub use complete::{CompletionItem, CompletionKind, completion}; +pub use fold::{FoldRange, folding_ranges}; pub use graph::{ Edge, EdgeKind, Graph, GraphNode, NodeDoc, NodeKind, SigParam, Signature, Step, Trigger, Visibility, @@ -45,6 +48,7 @@ pub use model::{ }; pub use pseudoscript_syntax::ast; pub use pseudoscript_syntax::{Diagnostic, Severity}; +pub use semantic::{SemKind, SemToken, semantic_tokens}; use pseudoscript_syntax::ast::Module; diff --git a/crates/pseudoscript-model/src/semantic.rs b/crates/pseudoscript-model/src/semantic.rs new file mode 100644 index 0000000..b02345d --- /dev/null +++ b/crates/pseudoscript-model/src/semantic.rs @@ -0,0 +1,429 @@ +//! AST-aware semantic tokens — the shared engine behind the LSP +//! (`pseudoscript-lsp`) and the web IDE (`pseudoscript-wasm`). +//! +//! Two passes feed one sorted, non-overlapping token list in absolute byte +//! offsets: +//! +//! - **Token pass** ([`tokenize`]) colours the leaves the tree does not expose +//! as convenient spans: keywords, doc comments, string/number literals, and +//! the `#[` macro opener. These kinds are never identifiers. +//! - **AST pass** ([`parse`]) colours identifiers by their *role* — a `system` +//! name is a namespace, a `data` name a class, a callable a method, a +//! parameter a parameter, a `.f()` step a method call. Identifiers are never +//! touched by the token pass, so the two sets cannot overlap. +//! +//! Offsets are bytes, so the engine is adapter-neutral: the LSP delta-encodes to +//! `lsp_types`, the IDE serialises to JSON and decorates ranges. + +use pseudoscript_syntax::{Span, TokenKind, ast, parse, tokenize}; +use serde::Serialize; + +/// A semantic token's role. Names follow the LSP standard token types so the +/// LSP adapter is a one-to-one mapping. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum SemKind { + Namespace, + Type, + Class, + Parameter, + Variable, + Property, + EnumMember, + Method, + Keyword, + Comment, + String, + Number, + Decorator, +} + +/// One coloured span in absolute byte offsets, with the `declaration` modifier. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +pub struct SemToken { + /// Start byte offset (inclusive). + pub start: u32, + /// End byte offset (exclusive). + pub end: u32, + /// What the token denotes. + pub kind: SemKind, + /// Whether this is the declaration site of the symbol. + pub declaration: bool, +} + +/// Computes the semantic tokens for `src`, sorted by start offset and free of +/// overlaps and zero-width spans (a later token overlapping an earlier one is +/// dropped, matching the token-then-AST precedence). +#[must_use] +pub fn semantic_tokens(src: &str) -> Vec { + let mut raws = Vec::new(); + token_pass(src, &mut raws); + ast_pass(&parse(src).ast, &mut raws); + raws.sort_by_key(|t| t.start); + + let mut out: Vec = Vec::with_capacity(raws.len()); + let mut last_end = 0; + for raw in raws { + if raw.start < last_end || raw.end <= raw.start { + continue; + } + last_end = raw.end; + out.push(raw); + } + out +} + +/// Colours keywords, doc comments, literals, and the `#[` macro opener. +fn token_pass(src: &str, out: &mut Vec) { + for token in tokenize(src) { + let kind = match token.kind { + k if is_keyword(k) => SemKind::Keyword, + TokenKind::Doc | TokenKind::InnerDoc | TokenKind::Tag => SemKind::Comment, + TokenKind::String => SemKind::String, + TokenKind::Number => SemKind::Number, + TokenKind::HashLBracket => SemKind::Decorator, + _ => continue, + }; + push(out, token.span, kind, false); + } +} + +/// Whether `kind` is one of the reserved keywords (§2.3). `self`, `Ok`, `Err`, +/// `true`, and `false` count, so the AST pass need not re-colour them. +fn is_keyword(kind: TokenKind) -> bool { + matches!( + kind, + TokenKind::KwSystem + | TokenKind::KwContainer + | TokenKind::KwComponent + | TokenKind::KwPerson + | TokenKind::KwData + | TokenKind::KwFor + | TokenKind::KwAlias + | TokenKind::KwFrom + | TokenKind::KwPublic + | TokenKind::KwSelf + | TokenKind::KwReturn + | TokenKind::KwOk + | TokenKind::KwErr + | TokenKind::KwIf + | TokenKind::KwElse + | TokenKind::KwWhile + | TokenKind::KwIn + | TokenKind::KwTrue + | TokenKind::KwFalse + ) +} + +/// Colours identifiers by their declared role across the whole module. +fn ast_pass(module: &ast::Module, out: &mut Vec) { + for item in &module.items { + match item { + ast::Item::Alias(alias) => { + push(out, alias.name.span, SemKind::Namespace, true); + namespace_path(&alias.target, out); + } + ast::Item::Decl(decl) => decl_tokens(decl, out), + ast::Item::Feature(feature) => { + push(out, feature.name.span, SemKind::Namespace, true); + namespace_path(&feature.target, out); + } + } + } +} + +/// Colours a declaration: its macros, then its structural payload. +fn decl_tokens(decl: &ast::Decl, out: &mut Vec) { + for mac in &decl.macros { + macro_tokens(mac, out); + } + match &decl.kind { + ast::DeclKind::Person(node) + | ast::DeclKind::System(node) + | ast::DeclKind::Container(node) + | ast::DeclKind::Component(node) => node_tokens(node, out), + ast::DeclKind::Data(data) => data_tokens(data, out), + } +} + +/// Colours a node: its name (namespace, declared), its `for` parent path, and +/// its disclosed body members. +fn node_tokens(node: &ast::Node, out: &mut Vec) { + push(out, node.name.span, SemKind::Namespace, true); + if let Some(parent) = &node.parent { + namespace_path(parent, out); + } + for member in node.body.iter().flatten() { + match member { + ast::BodyMember::Callable(callable) => callable_tokens(callable, out), + ast::BodyMember::Decl(decl) => decl_tokens(decl, out), + } + } +} + +/// Colours a `data` declaration: its name (class, declared) and its fields or +/// variants. +fn data_tokens(data: &ast::Data, out: &mut Vec) { + push(out, data.name.span, SemKind::Class, true); + match &data.body { + ast::DataBody::Record(fields) => fields_tokens(fields, out), + ast::DataBody::Union(variants) => { + for variant in variants { + push(out, variant.name.span, SemKind::EnumMember, true); + if let Some(fields) = &variant.record { + fields_tokens(fields, out); + } + } + } + ast::DataBody::BlackBox => {} + } +} + +/// Colours record fields: each name (property, declared) and its type. +fn fields_tokens(fields: &[ast::Field], out: &mut Vec) { + for field in fields { + push(out, field.name.span, SemKind::Property, true); + type_tokens(&field.ty, out); + } +} + +/// Colours a callable: macros, name (method, declared), parameters, return +/// type, and body. +fn callable_tokens(callable: &ast::Callable, out: &mut Vec) { + for mac in &callable.macros { + macro_tokens(mac, out); + } + push(out, callable.name.span, SemKind::Method, true); + for param in &callable.params { + push(out, param.name.span, SemKind::Parameter, true); + type_tokens(¶m.ty, out); + } + if let Some(ret) = &callable.return_ty { + type_tokens(ret, out); + } + if let Some(block) = &callable.body { + block_tokens(block, out); + } +} + +/// Colours every statement in a block. +fn block_tokens(block: &ast::Block, out: &mut Vec) { + for stmt in &block.stmts { + stmt_tokens(stmt, out); + } +} + +/// Colours one statement and its sub-expressions. +fn stmt_tokens(stmt: &ast::Stmt, out: &mut Vec) { + match &stmt.kind { + ast::StmtKind::Assign { name, value } => { + push(out, name.span, SemKind::Variable, true); + expr_tokens(value, out); + } + ast::StmtKind::Return(value) => { + if let Some(value) = value { + expr_tokens(value, out); + } + } + ast::StmtKind::If { + cond, + then_block, + else_block, + } => { + expr_tokens(cond, out); + block_tokens(then_block, out); + if let Some(block) = else_block { + block_tokens(block, out); + } + } + ast::StmtKind::For { + binding, + iter, + body, + } => { + push(out, binding.span, SemKind::Variable, true); + expr_tokens(iter, out); + block_tokens(body, out); + } + ast::StmtKind::While { cond, body } => { + expr_tokens(cond, out); + block_tokens(body, out); + } + ast::StmtKind::Expr(expr) => expr_tokens(expr, out), + } +} + +/// Colours an expression: references, calls, field access, and `from` types. +fn expr_tokens(expr: &ast::Expr, out: &mut Vec) { + match &expr.kind { + ast::ExprKind::Marker { payload, .. } => { + if let Some(payload) = payload { + expr_tokens(payload, out); + } + } + ast::ExprKind::From { ty, sources, .. } => { + type_path(ty, out); + for source in sources { + expr_tokens(source, out); + } + } + ast::ExprKind::Postfix { base, segments } => { + expr_tokens(base, out); + for seg in segments { + let kind = if seg.call_args.is_some() { + SemKind::Method + } else { + SemKind::Property + }; + push(out, seg.name.span, kind, false); + for arg in seg.call_args.iter().flatten() { + expr_tokens(arg, out); + } + } + } + ast::ExprKind::Ref(ast::Ref::Path(path)) => ref_path(path, out), + // `self` is a keyword and literals are coloured by the token pass. + ast::ExprKind::Ref(ast::Ref::SelfNode(_)) | ast::ExprKind::Literal(_) => {} + ast::ExprKind::Unary { expr, .. } => expr_tokens(expr, out), + ast::ExprKind::Paren(inner) => expr_tokens(inner, out), + } +} + +/// Colours a type: the base path (qualifiers as namespaces, the name as a type) +/// and any generic arguments. +fn type_tokens(ty: &ast::Type, out: &mut Vec) { + type_path(&ty.name, out); + for generic in &ty.generics { + type_tokens(generic, out); + } +} + +/// Colours a macro's name path as a decorator; its path arguments take type +/// colours (literals are already coloured by the token pass). +fn macro_tokens(mac: &ast::Macro, out: &mut Vec) { + for segment in &mac.name.segments { + push(out, segment.span, SemKind::Decorator, false); + } + if let ast::MacroArgs::List(args) = &mac.args { + for arg in args { + match arg { + ast::MacroArg::Path(path) => type_path(path, out), + ast::MacroArg::Nested(nested) => macro_tokens(nested, out), + ast::MacroArg::Literal(_) => {} + } + } + } +} + +/// Colours a value-reference path: trailing name as a variable, qualifiers as +/// namespaces. +fn ref_path(path: &ast::Path, out: &mut Vec) { + split_path(path, SemKind::Variable, out); +} + +/// Colours a type path: trailing name as a type, qualifiers as namespaces. +fn type_path(path: &ast::Path, out: &mut Vec) { + split_path(path, SemKind::Type, out); +} + +/// Colours every segment of a path as a namespace (parent / alias target). +fn namespace_path(path: &ast::Path, out: &mut Vec) { + for segment in &path.segments { + push(out, segment.span, SemKind::Namespace, false); + } +} + +/// Colours a path's last segment as `last`, every qualifier as a namespace. +fn split_path(path: &ast::Path, last: SemKind, out: &mut Vec) { + let Some((name, qualifiers)) = path.segments.split_last() else { + return; + }; + for segment in qualifiers { + push(out, segment.span, SemKind::Namespace, false); + } + push(out, name.span, last, false); +} + +/// Records one coloured span. +fn push(out: &mut Vec, span: Span, kind: SemKind, declaration: bool) { + out.push(SemToken { + start: span.start, + end: span.end, + kind, + declaration, + }); +} + +#[cfg(test)] +mod tests { + use super::*; + + /// The token starting at the first occurrence of `needle`. + fn at<'a>(tokens: &'a [SemToken], src: &str, needle: &str) -> &'a SemToken { + let start = src.find(needle).expect("substring present") as u32; + tokens + .iter() + .find(|t| t.start == start) + .unwrap_or_else(|| panic!("no token at {needle:?}")) + } + + #[test] + fn node_name_is_a_declared_namespace() { + let src = "//! m\n\npublic system Banking;\n"; + let tokens = semantic_tokens(src); + let token = at(&tokens, src, "Banking"); + assert_eq!(token.kind, SemKind::Namespace); + assert!(token.declaration); + assert_eq!(token.end - token.start, 7); + } + + #[test] + fn keyword_and_data_name_colours() { + let src = "//! m\n\ndata Account { id: uuid }\n"; + let tokens = semantic_tokens(src); + assert_eq!(at(&tokens, src, "data").kind, SemKind::Keyword); + let account = at(&tokens, src, "Account"); + assert_eq!(account.kind, SemKind::Class); + assert!(account.declaration); + assert_eq!(at(&tokens, src, "id").kind, SemKind::Property); + assert_eq!(at(&tokens, src, "uuid").kind, SemKind::Type); + } + + #[test] + fn callable_param_type_and_calls() { + let src = "//! m\n\nsystem S {\n run(name: string): uuid {\n return self.alloc(name)\n }\n}\n"; + let tokens = semantic_tokens(src); + assert_eq!(at(&tokens, src, "run").kind, SemKind::Method); + assert_eq!(at(&tokens, src, "name").kind, SemKind::Parameter); + assert_eq!(at(&tokens, src, "string").kind, SemKind::Type); + assert_eq!(at(&tokens, src, "self").kind, SemKind::Keyword); + assert_eq!(at(&tokens, src, "alloc").kind, SemKind::Method); + } + + #[test] + fn member_access_vs_call() { + let src = "//! m\n\nsystem S {\n go() {\n Repo.run(x)\n }\n}\n"; + let tokens = semantic_tokens(src); + assert_eq!(at(&tokens, src, "run").kind, SemKind::Method); + } + + #[test] + fn string_literal_and_keyword() { + let src = "//! m\n\nsystem S {\n f() {\n return Err(\"boom\")\n }\n}\n"; + let tokens = semantic_tokens(src); + assert_eq!(at(&tokens, src, "\"boom\"").kind, SemKind::String); + assert_eq!(at(&tokens, src, "Err").kind, SemKind::Keyword); + } + + #[test] + fn tokens_are_sorted_and_non_overlapping() { + let src = "//! m\n\ndata Account { id: uuid }\n"; + let tokens = semantic_tokens(src); + let mut last_end = 0; + for t in &tokens { + assert!(t.start >= last_end, "overlap at {t:?}"); + assert!(t.end > t.start, "zero-width at {t:?}"); + last_end = t.end; + } + } +} diff --git a/crates/pseudoscript-wasm/src/lib.rs b/crates/pseudoscript-wasm/src/lib.rs index 5810096..29db802 100644 --- a/crates/pseudoscript-wasm/src/lib.rs +++ b/crates/pseudoscript-wasm/src/lib.rs @@ -40,7 +40,8 @@ use pseudoscript_emit::{ use pseudoscript_format::format as format_source; use pseudoscript_model::{ Graph, NodeKind, Workspace, WorkspaceModule, check as check_source, check_workspace_modules, - completion as model_completion, graph as build_graph, resolve::resolve_at, + completion as model_completion, folding_ranges as model_folding_ranges, graph as build_graph, + resolve::resolve_at, semantic_tokens as model_semantic_tokens, }; use pseudoscript_syntax::{ Diagnostic, LineIndex, Severity, TokenKind, parse as parse_source, tokenize, @@ -136,6 +137,29 @@ pub fn emit_svg(source: &str, view: &str, target: &str) -> Result String { + to_json(&model_semantic_tokens(source)) +} + +/// Foldable regions of `source` as a JSON array of `{ start, end }` in absolute +/// byte offsets — every multi-line declaration and statement block. The editor +/// folds these ranges instead of brace-matching in JS, sharing the LSP's +/// AST-accurate fold logic. +#[wasm_bindgen] +#[must_use] +pub fn folding_ranges(source: &str) -> String { + to_json(&model_folding_ranges(source)) +} + /// Lists the nodes declared in `source` as a JSON array of /// `{ fqn, name, kind, triggered }`. A host uses this to populate a diagram's /// target picker: `container` views target a `system`, `component` views a diff --git a/web-ide/.gitignore b/web-ide/.gitignore index 5b0e108..4d3a8d9 100644 --- a/web-ide/.gitignore +++ b/web-ide/.gitignore @@ -5,3 +5,8 @@ node_modules/ .DS_Store # The vendored wasm package (src/lib/pds-wasm/) is committed on purpose so the # Cloudflare build needs no Rust toolchain — do NOT ignore it. +/storybook-static/ +/test-results/ +/playwright-report/ +/blob-report/ +/.playwright/ diff --git a/web-ide/.storybook/main.js b/web-ide/.storybook/main.js new file mode 100644 index 0000000..9348560 --- /dev/null +++ b/web-ide/.storybook/main.js @@ -0,0 +1,9 @@ +/** @type {import('@storybook/sveltekit').StorybookConfig} */ +const config = { + stories: ["../src/**/*.stories.@(js|ts|svelte)"], + addons: [], + framework: { name: "@storybook/sveltekit", options: {} }, + core: { disableTelemetry: true }, +}; + +export default config; diff --git a/web-ide/.storybook/preview.js b/web-ide/.storybook/preview.js new file mode 100644 index 0000000..1159ecd --- /dev/null +++ b/web-ide/.storybook/preview.js @@ -0,0 +1,8 @@ +/** @type {import('@storybook/sveltekit').Preview} */ +const preview = { + parameters: { + controls: { matchers: { color: /(background|color)$/i, date: /Date$/i } }, + }, +}; + +export default preview; diff --git a/web-ide/e2e/ide.spec.js b/web-ide/e2e/ide.spec.js new file mode 100644 index 0000000..c4b1b32 --- /dev/null +++ b/web-ide/e2e/ide.spec.js @@ -0,0 +1,58 @@ +import { expect, test } from "@playwright/test"; + +// Opens the ACME Tickets sample and its `orders` module before each test. All +// navigation is via data-testid; editor internals use CodeMirror's documented +// classes and our data-sem highlight attributes. +test.beforeEach(async ({ page }) => { + await page.goto("/"); + await page.getByTestId("sample-acme-tickets").click(); + await page.getByTestId("file-orders").click(); + const content = page.getByTestId("editor").locator(".cm-content"); + await expect(content).toBeVisible(); + // wait until the compiler has produced highlight marks (wasm is ready) + await expect(page.locator('[data-sem="keyword"]').first()).toBeVisible(); +}); + +test("highlighting is AST-aware: tokens carry their LSP role", async ({ page }) => { + // The token pass colours keywords; the AST pass colours node names as + // namespaces — a declaration-context role a regex tokenizer could not assign. + // (Param/field type tokens live inside folded bodies, so they are asserted in + // the Rust unit tests rather than here.) + await expect(page.locator('[data-sem="keyword"]').first()).toBeVisible(); + await expect(page.locator('[data-sem="namespace"]').first()).toBeVisible(); +}); + +test("completion is scoped to a module path, not the full symbol set", async ({ page }) => { + const content = page.getByTestId("editor").locator(".cm-content"); + await content.click(); + await page.keyboard.press("Control+End"); + await page.keyboard.type("\nshared::User"); + + const options = page.locator(".cm-tooltip-autocomplete li"); + // module `shared` has exactly one symbol matching the `User` prefix + await expect(options).toHaveCount(1); + await expect(options.first()).toContainText("UserId"); + // the general keyword set must not leak into a `::` context + await expect(page.locator(".cm-tooltip-autocomplete li", { hasText: /^system$/ })).toHaveCount(0); +}); + +test("completion narrows as the prefix is typed (scope fix)", async ({ page }) => { + const content = page.getByTestId("editor").locator(".cm-content"); + await content.click(); + await page.keyboard.press("Control+End"); + await page.keyboard.type("\nshared::"); + // explicit trigger at the bare caret shows the whole module + await page.keyboard.press("Control+Space"); + await expect(page.locator(".cm-tooltip-autocomplete li").first()).toBeVisible(); + const all = await page.locator(".cm-tooltip-autocomplete li").count(); + expect(all).toBeGreaterThan(1); + // typing a prefix narrows the same scoped set without leaking keywords + await page.keyboard.type("User"); + await expect(page.locator(".cm-tooltip-autocomplete li")).toHaveCount(1); +}); + +test("folding ranges come from the compiler (blocks fold)", async ({ page }) => { + // The IDE folds blocks by default using the compiler's AST fold ranges; a + // folded region renders CodeMirror's placeholder. + await expect(page.locator(".cm-foldPlaceholder").first()).toBeVisible(); +}); diff --git a/web-ide/package-lock.json b/web-ide/package-lock.json index ed8f142..14a559a 100644 --- a/web-ide/package-lock.json +++ b/web-ide/package-lock.json @@ -26,11 +26,125 @@ "prettier": "^3.8.3" }, "devDependencies": { + "@playwright/test": "^1.60.0", + "@storybook/sveltekit": "^10.4.1", "@sveltejs/adapter-cloudflare": "^7.2.8", "@sveltejs/kit": "^2.61.1", "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/svelte": "^5.3.1", + "@testing-library/user-event": "^14.6.1", + "jsdom": "^29.1.1", + "storybook": "^10.4.1", "svelte": "^5.56.0", - "vite": "^8" + "vite": "^8", + "vitest": "^3.2.4" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" } }, "node_modules/@cloudflare/kv-asset-handler": { @@ -585,6 +699,146 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/@dagrejs/dagre": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-3.0.0.tgz", @@ -647,7 +901,6 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } @@ -665,7 +918,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -683,7 +935,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -701,7 +952,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -719,7 +969,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -737,7 +986,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -755,7 +1003,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -773,7 +1020,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -791,7 +1037,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -809,7 +1054,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -827,7 +1071,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -845,7 +1088,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -863,7 +1105,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -881,7 +1122,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -899,7 +1139,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -917,7 +1156,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -935,7 +1173,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -953,7 +1190,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -971,7 +1207,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -989,7 +1224,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -1007,7 +1241,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -1025,7 +1258,6 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } @@ -1043,7 +1275,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -1061,7 +1292,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -1079,7 +1309,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -1097,11 +1326,28 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1921,59 +2167,27 @@ "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@oxc-project/types": { - "version": "0.132.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", - "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@poppinss/colors": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", - "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/@poppinss/dumper": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", - "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.127.0.tgz", + "integrity": "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@poppinss/exception": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", - "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", - "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.127.0.tgz", + "integrity": "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==", "cpu": [ "arm64" ], @@ -1987,10 +2201,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.127.0.tgz", + "integrity": "sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==", "cpu": [ "arm64" ], @@ -2004,10 +2218,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", - "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.127.0.tgz", + "integrity": "sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==", "cpu": [ "x64" ], @@ -2021,10 +2235,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", - "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.127.0.tgz", + "integrity": "sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==", "cpu": [ "x64" ], @@ -2038,10 +2252,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", - "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.127.0.tgz", + "integrity": "sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==", "cpu": [ "arm" ], @@ -2055,12 +2269,1127 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", - "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.127.0.tgz", + "integrity": "sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==", "cpu": [ - "arm64" + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.127.0.tgz", + "integrity": "sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.127.0.tgz", + "integrity": "sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.127.0.tgz", + "integrity": "sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.127.0.tgz", + "integrity": "sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.127.0.tgz", + "integrity": "sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.127.0.tgz", + "integrity": "sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.127.0.tgz", + "integrity": "sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.127.0.tgz", + "integrity": "sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.127.0.tgz", + "integrity": "sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.127.0.tgz", + "integrity": "sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", + "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.127.0.tgz", + "integrity": "sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.127.0.tgz", + "integrity": "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.132.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", + "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxc-resolver/binding-android-arm-eabi": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.20.0.tgz", + "integrity": "sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-android-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.20.0.tgz", + "integrity": "sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.20.0.tgz", + "integrity": "sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.20.0.tgz", + "integrity": "sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.20.0.tgz", + "integrity": "sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.20.0.tgz", + "integrity": "sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.20.0.tgz", + "integrity": "sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.20.0.tgz", + "integrity": "sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.20.0.tgz", + "integrity": "sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.20.0.tgz", + "integrity": "sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.20.0.tgz", + "integrity": "sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.20.0.tgz", + "integrity": "sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.20.0.tgz", + "integrity": "sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.20.0.tgz", + "integrity": "sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.20.0.tgz", + "integrity": "sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.20.0.tgz", + "integrity": "sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.20.0.tgz", + "integrity": "sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.20.0.tgz", + "integrity": "sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.20.0.tgz", + "integrity": "sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", + "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", + "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", + "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", + "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", + "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", + "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", + "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", + "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", + "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", + "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", + "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", + "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" ], "dev": true, "libc": [ @@ -2070,17 +3399,14 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", - "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, "libc": [ @@ -2090,17 +3416,14 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", - "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", "cpu": [ - "ppc64" + "riscv64" ], "dev": true, "libc": [ @@ -2110,15 +3433,29 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", - "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", "cpu": [ "s390x" ], @@ -2130,15 +3467,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", - "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", "cpu": [ "x64" ], @@ -2150,15 +3484,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", - "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", "cpu": [ "x64" ], @@ -2170,15 +3501,26 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", - "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", "cpu": [ "arm64" ], @@ -2187,51 +3529,40 @@ "optional": true, "os": [ "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", - "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", "cpu": [ - "wasm32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "os": [ + "win32" + ] }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", - "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", "cpu": [ - "arm64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", - "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", "cpu": [ "x64" ], @@ -2240,17 +3571,21 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@sindresorhus/is": { "version": "7.2.0", @@ -2281,6 +3616,142 @@ "dev": true, "license": "MIT" }, + "node_modules/@storybook/builder-vite": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.4.1.tgz", + "integrity": "sha512-/oyQrXoNOqN8SW5hNnYP+I1uvgFxKxWXj/EP6NXYzc5SQwImofgru+D2+6gDhL0+Q//+Hx05DJoQO2omvUJ8bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "10.4.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.4.1", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.4.1.tgz", + "integrity": "sha512-WdPepGBxDGOUDjYd8KxMtcf+us/2PAcnBczl77XtrnxxHNs0jWesxKkiJ9yiuGrge4BPhDeAj6rxjbBoaHxLBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^2.3.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.4.1", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.2.tgz", + "integrity": "sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@storybook/svelte": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@storybook/svelte/-/svelte-10.4.1.tgz", + "integrity": "sha512-DzgCB5UngFZdeOy2wlTIgH2qJQPXFWhtLiv56YGp8KZXZMvj6Ta8dvVESp0aHhABex70jLNMvggN282prxXCuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-dedent": "^2.0.0", + "type-fest": "~2.19" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.4.1", + "svelte": "^5.0.0" + } + }, + "node_modules/@storybook/svelte-vite": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@storybook/svelte-vite/-/svelte-vite-10.4.1.tgz", + "integrity": "sha512-jbVIlrPOrfU66LBRhGTOyDyhIGtbsJDtesBATHsbUWGcEW97ocdFsjD98qEkl+oAY1Vf2tBAK1vqZgM0u/pb0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/builder-vite": "10.4.1", + "@storybook/svelte": "10.4.1", + "magic-string": "^0.30.0", + "svelte2tsx": "^0.7.44", + "typescript": "^4.9.4 || ^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "storybook": "^10.4.1", + "svelte": "^5.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/sveltekit": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@storybook/sveltekit/-/sveltekit-10.4.1.tgz", + "integrity": "sha512-54jDgjhUNGNPPl5yWDMOVG53wd6KF5UFS1gmL9nwyJWNP7JsQjOLnjrVCtDgrv0K9O/cX7SrgTtgPFoM18BeHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/builder-vite": "10.4.1", + "@storybook/svelte": "10.4.1", + "@storybook/svelte-vite": "10.4.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.4.1", + "svelte": "^5.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@svelte-put/shortcut": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-4.1.0.tgz", @@ -2338,42 +3809,153 @@ "svelte-kit": "svelte-kit.js" }, "engines": { - "node": ">=18.13" + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3 || ^6.0.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.1.2.tgz", + "integrity": "sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.2" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.46.4", + "vite": "^8.0.0-beta.7 || ^8.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/svelte": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-5.3.1.tgz", + "integrity": "sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@testing-library/dom": "9.x.x || 10.x.x", + "@testing-library/svelte-core": "1.0.0" + }, + "engines": { + "node": ">= 10" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": "^5.3.3 || ^6.0.0", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0", + "vite": "*", + "vitest": "*" }, "peerDependenciesMeta": { - "@opentelemetry/api": { + "vite": { "optional": true }, - "typescript": { + "vitest": { "optional": true } } }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.1.2.tgz", - "integrity": "sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA==", + "node_modules/@testing-library/svelte-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/svelte-core/-/svelte-core-1.0.0.tgz", + "integrity": "sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==", "dev": true, "license": "MIT", - "dependencies": { - "deepmerge": "^4.3.1", - "magic-string": "^0.30.21", - "obug": "^2.1.0", - "vitefu": "^1.1.2" + "engines": { + "node": ">=16" }, + "peerDependencies": { + "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^20.19 || ^22.12 || >=24" + "node": ">=12", + "npm": ">=6" }, "peerDependencies": { - "svelte": "^5.46.4", - "vite": "^8.0.0-beta.7 || ^8.0.0" + "@testing-library/dom": ">=7.21.4" } }, "node_modules/@tybys/wasm-util": { @@ -2387,6 +3969,24 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -2443,6 +4043,13 @@ "@types/d3-selection": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -2455,6 +4062,101 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", + "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", + "dev": true, + "license": "MIT" + }, "node_modules/@xyflow/svelte": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-1.5.2.tgz", @@ -2497,6 +4199,29 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/aria-query": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", @@ -2506,6 +4231,29 @@ "node": ">= 0.4" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2515,6 +4263,16 @@ "node": ">= 0.4" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/blake3-wasm": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", @@ -2523,6 +4281,59 @@ "license": "MIT", "peer": true }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2563,6 +4374,27 @@ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -2621,61 +4453,170 @@ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { - "node": ">=12" + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, - "peerDependencies": { - "d3-selection": "2 - 3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-zoom": { + "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/detect-libc": { @@ -2694,6 +4635,26 @@ "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", "license": "MIT" }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-stack-parser-es": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", @@ -2705,6 +4666,13 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -2712,7 +4680,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -2754,6 +4721,20 @@ "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", "license": "MIT" }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esrap": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.9.tgz", @@ -2771,6 +4752,26 @@ } } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2804,6 +4805,71 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-reference": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", @@ -2813,6 +4879,80 @@ "@types/estree": "^1.0.6" } }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -3102,6 +5242,33 @@ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "license": "MIT" }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -3111,6 +5278,23 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/miniflare": { "version": "4.20260526.0", "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260526.0.tgz", @@ -3143,6 +5327,13 @@ "node": ">=10" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -3173,6 +5364,117 @@ ], "license": "MIT" }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oxc-parser": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.127.0.tgz", + "integrity": "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.127.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.127.0", + "@oxc-parser/binding-android-arm64": "0.127.0", + "@oxc-parser/binding-darwin-arm64": "0.127.0", + "@oxc-parser/binding-darwin-x64": "0.127.0", + "@oxc-parser/binding-freebsd-x64": "0.127.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.127.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.127.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.127.0", + "@oxc-parser/binding-linux-arm64-musl": "0.127.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.127.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-musl": "0.127.0", + "@oxc-parser/binding-openharmony-arm64": "0.127.0", + "@oxc-parser/binding-wasm32-wasi": "0.127.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.127.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.127.0", + "@oxc-parser/binding-win32-x64-msvc": "0.127.0" + } + }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/oxc-resolver": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.20.0.tgz", + "integrity": "sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-android-arm-eabi": "11.20.0", + "@oxc-resolver/binding-android-arm64": "11.20.0", + "@oxc-resolver/binding-darwin-arm64": "11.20.0", + "@oxc-resolver/binding-darwin-x64": "11.20.0", + "@oxc-resolver/binding-freebsd-x64": "11.20.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.20.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.20.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.20.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.20.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.20.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-x64-musl": "11.20.0", + "@oxc-resolver/binding-openharmony-arm64": "11.20.0", + "@oxc-resolver/binding-wasm32-wasi": "11.20.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.20.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.20.0" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -3186,27 +5488,83 @@ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", "dev": true, - "license": "ISC" + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/postcss": { @@ -3253,6 +5611,94 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regexparam": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", @@ -3263,6 +5709,16 @@ "node": ">=8" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rolldown": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", @@ -3297,6 +5753,58 @@ "@rolldown/binding-win32-x64-msvc": "1.0.2" } }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/rosie-skills": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/rosie-skills/-/rosie-skills-0.6.4.tgz", @@ -3361,13 +5869,53 @@ ], "peer": true }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -3428,6 +5976,13 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/sirv": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", @@ -3443,6 +5998,16 @@ "node": ">=18" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3453,6 +6018,100 @@ "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/storybook": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.4.1.tgz", + "integrity": "sha512-V1Zd2e+gBFufqAQVZ1JR8KLqALsEZ3JYSBnWwQbKa6zCfWWanR6AFMyuOkLt2gZOgGp3h2Riuz88pGNVTQSG0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.2", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/spy": "3.2.4", + "@webcontainer/env": "^1.1.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", + "open": "^10.2.0", + "oxc-parser": "^0.127.0", + "oxc-resolver": "^11.19.1", + "recast": "^0.23.5", + "semver": "^7.7.3", + "use-sync-external-store": "^1.5.0", + "ws": "^8.18.0" + }, + "bin": { + "storybook": "dist/bin/dispatcher.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "prettier": "^2 || ^3", + "vite-plus": "^0.1.15" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/style-mod": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", @@ -3500,6 +6159,49 @@ "node": ">=18" } }, + "node_modules/svelte2tsx": { + "version": "0.7.55", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.55.tgz", + "integrity": "sha512-JWzgeM3lqySRNfqcsesvVEh8LhTWBxQJ9RMjzJ+VepdmXtVnNd0SbtGctG6+/fbHq0N6mhwSd823gszw9JHeGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dedent-js": "^1.0.1", + "scule": "^1.3.0" + }, + "peerDependencies": { + "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", + "typescript": "^4.9.4 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -3517,6 +6219,56 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "dev": true, + "license": "MIT" + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -3527,13 +6279,75 @@ "node": ">=6" } }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "optional": true + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, "node_modules/undici": { "version": "7.24.8", @@ -3557,6 +6371,32 @@ "pathe": "^2.0.3" } }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/vite": { "version": "8.0.14", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", @@ -3635,6 +6475,104 @@ } } }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/vitefu": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", @@ -3655,12 +6593,259 @@ } } }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/workerd": { "version": "1.20260526.1", "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260526.1.tgz", @@ -3740,7 +6925,6 @@ "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3757,6 +6941,39 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/youch": { "version": "4.1.0-beta.10", "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", diff --git a/web-ide/package.json b/web-ide/package.json index 04cb0dc..37e9044 100644 --- a/web-ide/package.json +++ b/web-ide/package.json @@ -8,14 +8,27 @@ "build": "vite build", "postbuild": "printf '_worker.js\\n_routes.json\\n' > .svelte-kit/cloudflare/.assetsignore", "preview": "vite preview", - "build:wasm": "wasm-pack build ../crates/pseudoscript-wasm --release --target web --out-dir ../../web-ide/src/lib/pds-wasm && rm -f src/lib/pds-wasm/.gitignore src/lib/pds-wasm/package.json src/lib/pds-wasm/README.md" + "build:wasm": "wasm-pack build ../crates/pseudoscript-wasm --release --target web --out-dir ../../web-ide/src/lib/pds-wasm && rm -f src/lib/pds-wasm/.gitignore src/lib/pds-wasm/package.json src/lib/pds-wasm/README.md", + "test": "vitest run", + "test:watch": "vitest", + "test:e2e": "playwright test", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "devDependencies": { + "@playwright/test": "^1.60.0", + "@storybook/sveltekit": "^10.4.1", "@sveltejs/adapter-cloudflare": "^7.2.8", "@sveltejs/kit": "^2.61.1", "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/svelte": "^5.3.1", + "@testing-library/user-event": "^14.6.1", + "jsdom": "^29.1.1", + "storybook": "^10.4.1", "svelte": "^5.56.0", - "vite": "^8" + "vite": "^8", + "vitest": "^3.2.4" }, "dependencies": { "@codemirror/autocomplete": "^6.20.2", diff --git a/web-ide/playwright.config.js b/web-ide/playwright.config.js new file mode 100644 index 0000000..826040c --- /dev/null +++ b/web-ide/playwright.config.js @@ -0,0 +1,26 @@ +import { defineConfig, devices } from "@playwright/test"; + +// End-to-end tests drive the real IDE (real wasm compiler) headlessly. The dev +// server is started for the run and reused locally. Selectors are data-testid on +// our components and data-sem on highlight marks — never label text or styling +// classes — so the tests survive copy and CSS changes. +const PORT = 4173; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + reporter: process.env.CI ? "github" : "list", + use: { + baseURL: `http://localhost:${PORT}`, + trace: "on-first-retry", + }, + projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }], + webServer: { + command: `npm run dev -- --port ${PORT} --strictPort`, + url: `http://localhost:${PORT}`, + reuseExistingServer: !process.env.CI, + timeout: 120_000, + }, +}); diff --git a/web-ide/src/lib/blocks.js b/web-ide/src/lib/blocks.js deleted file mode 100644 index 83165c4..0000000 --- a/web-ide/src/lib/blocks.js +++ /dev/null @@ -1,37 +0,0 @@ -// Brace-matched `{ … }` block extents for a PseudoScript source, used by the -// editor for folding and the navigation flash. A char-level scan that skips -// string literals and `//`/`///`/`//!` line comments, so braces inside them -// don't open or close a block. PseudoScript has no block comments and no -// multi-line strings, which keeps this exact. - -/** - * The matched brace pairs in `text`, innermost-last (a pair is pushed when its - * `}` is seen). Each entry is `{ open, close }` — the code-unit offsets of the - * `{` and its matching `}`. - * @param {string} text - * @returns {{ open: number, close: number }[]} - */ -export function blockRanges(text) { - const ranges = []; - const stack = []; - let inString = false; - for (let i = 0; i < text.length; i++) { - const c = text[i]; - if (inString) { - if (c === "\\") i++; // skip the escaped char - else if (c === '"') inString = false; - continue; - } - if (c === '"') inString = true; - else if (c === "/" && text[i + 1] === "/") { - const nl = text.indexOf("\n", i); - if (nl === -1) break; - i = nl; // resume at the newline - } else if (c === "{") stack.push(i); - else if (c === "}") { - const open = stack.pop(); - if (open !== undefined) ranges.push({ open, close: i }); - } - } - return ranges; -} diff --git a/web-ide/src/lib/components/Editor.svelte b/web-ide/src/lib/components/Editor.svelte index c6c3038..5306e93 100644 --- a/web-ide/src/lib/components/Editor.svelte +++ b/web-ide/src/lib/components/Editor.svelte @@ -19,9 +19,8 @@ import { pseudoscript, pseudoscriptCompletion, pseudoscriptLinter } from "$lib/pseudoscript-language.js"; import { markdownLivePreview } from "$lib/markdown-live.js"; import { keybindings } from "$lib/keybindings.svelte.js"; - import { completion as symbolCompletion, definition as symbolDefinition, hover as symbolHover, references as symbolReferences } from "$lib/pds.js"; + import { completion as symbolCompletion, definition as symbolDefinition, foldRanges, hover as symbolHover, references as symbolReferences } from "$lib/pds.js"; import { byteToChar, charToByte } from "$lib/offsets.js"; - import { blockRanges } from "$lib/blocks.js"; let { value = "", @@ -368,11 +367,23 @@ // ── Folding ──────────────────────────────────────────────────────────────── // Blocks fold by default; the navigated-to block (and its ancestors) stays - // open. Fold extents come from `blockRanges`, memoised per document. + // open. Fold extents come from the compiler's AST-accurate fold ranges (the + // same the LSP serves), memoised per document. The byte spans map to + // `{ open, close }` editor offsets: `open` at the construct start, `close` at + // its closing brace (kept visible). const rangeCache = new WeakMap(); function rangesOf(doc) { let r = rangeCache.get(doc); - if (!r) rangeCache.set(doc, (r = blockRanges(doc.toString()))); + if (!r) { + const src = doc.toString(); + r = foldRanges(src) + .map((range) => ({ + open: byteToChar(src, range.start), + close: byteToChar(src, range.end - 1), + })) + .filter((range) => range.close > range.open); + rangeCache.set(doc, r); + } return r; } // The fold span for a `{ … }` pair: from the end of the opening line to the @@ -682,6 +693,7 @@

    diff --git a/web-ide/src/lib/components/FileTree.stories.js b/web-ide/src/lib/components/FileTree.stories.js new file mode 100644 index 0000000..aade453 --- /dev/null +++ b/web-ide/src/lib/components/FileTree.stories.js @@ -0,0 +1,33 @@ +import FileTree from "./FileTree.svelte"; + +// The workspace file tree — the primary navigation surface. Rows are addressed +// in tests by `data-testid="file-"`. +export default { + title: "IDE/FileTree", + component: FileTree, + tags: ["autodocs"], +}; + +const files = [ + { fqn: "orders", path: "orders.pds" }, + { fqn: "shared", path: "shared.pds" }, + { fqn: "gateway", path: "gateway.pds" }, +]; + +export const TwoModules = { + args: { workspaceName: "ACME Tickets", files, openPath: "orders.pds" }, +}; + +export const WithUnsavedAndError = { + args: { + workspaceName: "ACME Tickets", + files, + openPath: "orders.pds", + dirtyPaths: new Set(["shared.pds"]), + errorPaths: new Set(["gateway.pds"]), + }, +}; + +export const Empty = { + args: { workspaceName: "Empty", files: [] }, +}; diff --git a/web-ide/src/lib/components/FileTree.svelte b/web-ide/src/lib/components/FileTree.svelte index 8ca72bb..dcbf89a 100644 --- a/web-ide/src/lib/components/FileTree.svelte +++ b/web-ide/src/lib/components/FileTree.svelte @@ -219,6 +219,7 @@ class:active={file.path === openPath} class:has-error={errorPaths.has(file.path)} class:is-dirty={!errorPaths.has(file.path) && dirtyPaths.has(file.path)} + data-testid="file-{file.fqn}" draggable={!!onmovefile} ondragstart={() => (dragFile = file)} ondragend={() => { diff --git a/web-ide/src/lib/components/FileTree.test.js b/web-ide/src/lib/components/FileTree.test.js new file mode 100644 index 0000000..099f453 --- /dev/null +++ b/web-ide/src/lib/components/FileTree.test.js @@ -0,0 +1,39 @@ +import { render, screen } from "@testing-library/svelte"; +import userEvent from "@testing-library/user-event"; +import { describe, expect, it, vi } from "vitest"; + +import FileTree from "./FileTree.svelte"; + +const files = [ + { fqn: "orders", path: "orders.pds" }, + { fqn: "shared", path: "shared.pds" }, +]; + +// The file tree is the entry point every e2e flow drives, so its rows must be +// addressable by a stable `data-testid` (file-), never by label text. +describe("FileTree", () => { + it("renders a stable data-testid per module", () => { + render(FileTree, { props: { files } }); + expect(screen.getByTestId("file-orders")).toBeInTheDocument(); + expect(screen.getByTestId("file-shared")).toBeInTheDocument(); + }); + + it("shows the module fqn as the row label", () => { + render(FileTree, { props: { files } }); + expect(screen.getByTestId("file-orders")).toHaveTextContent("orders"); + }); + + it("calls onopen with the file when a row is clicked", async () => { + const onopen = vi.fn(); + render(FileTree, { props: { files, onopen } }); + await userEvent.click(screen.getByTestId("file-shared")); + expect(onopen).toHaveBeenCalledTimes(1); + expect(onopen).toHaveBeenCalledWith(files[1]); + }); + + it("marks the open file with aria-current", () => { + render(FileTree, { props: { files, openPath: "orders.pds" } }); + expect(screen.getByTestId("file-orders")).toHaveAttribute("aria-current", "true"); + expect(screen.getByTestId("file-shared")).not.toHaveAttribute("aria-current"); + }); +}); diff --git a/web-ide/src/lib/components/ProjectPanel.svelte b/web-ide/src/lib/components/ProjectPanel.svelte index 4307ee3..e31d477 100644 --- a/web-ide/src/lib/components/ProjectPanel.svelte +++ b/web-ide/src/lib/components/ProjectPanel.svelte @@ -112,7 +112,7 @@