diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 14f839f3..ab0bd0a9 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -19,7 +19,7 @@ body: attributes: label: "Project" description: "Which subproject or area" - placeholder: "core | compiler | vscode | book | tests | other" + placeholder: "core | compiler | book | tests | other" validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index 90fd91a2..68fd5748 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -9,7 +9,7 @@ body: attributes: label: "Project" description: "Which subproject or area" - placeholder: "core | compiler | vscode | book | tests | other" + placeholder: "core | compiler | book | tests | other" validations: required: true - type: textarea diff --git a/.github/workflows/extension.yml b/.github/workflows/extension.yml deleted file mode 100644 index ea092dcc..00000000 --- a/.github/workflows/extension.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Deploy Extension on VSCode marketplace and Open VSX Registry -on: - push: - tags: - - "simplicityhl-vscode-v*" -jobs: - Extension: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - - run: npm ci - working-directory: vscode - - - name: Verify tag matches extension version - working-directory: vscode - shell: bash - run: | - TAG="${GITHUB_REF##*/}" - VERSION_TAG="${TAG#simplicityhl-vscode-v}" - - PACKAGE_VERSION=$(jq -r '.version' package.json) - - echo "Tag version: $VERSION_TAG" - echo "Package version: $PACKAGE_VERSION" - - if [ "$VERSION_TAG" != "$PACKAGE_VERSION" ]; then - echo "Tag version ($VERSION_TAG) does not match package.json version ($PACKAGE_VERSION)" - exit 1 - fi - - - name: Publish to Open VSX Registry - uses: HaaLeo/publish-vscode-extension@v2 - with: - pat: ${{ secrets.OPEN_VSX_TOKEN }} - packagePath: vscode - skipDuplicate: true - - - name: Publish to Visual Studio Marketplace - uses: HaaLeo/publish-vscode-extension@v2 - with: - pat: ${{ secrets.VS_MARKETPLACE_TOKEN }} - registryUrl: https://marketplace.visualstudio.com - packagePath: vscode - skipDuplicate: true diff --git a/.github/workflows/lsp-ci.yml b/.github/workflows/lsp-ci.yml deleted file mode 100644 index 12f8a0a3..00000000 --- a/.github/workflows/lsp-ci.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: LSP CI - -on: - pull_request: - paths: - - 'lsp/**' - - '.github/workflows/lsp-ci.yml' - push: - branches: - - master - paths: - - 'lsp/**' - - '.github/workflows/lsp-ci.yml' - -jobs: - fmt: - name: Rustfmt (lsp) - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt - - - name: Check formatting - working-directory: lsp - run: cargo fmt --all -- --check - - clippy: - name: Clippy (lsp) - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: dtolnay/rust-toolchain@stable - with: - components: clippy - - - name: Run clippy - working-directory: lsp - run: cargo clippy --all-targets --all-features - - tests: - name: Tests (lsp) - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: dtolnay/rust-toolchain@stable - - - name: Run tests - working-directory: lsp - run: cargo test --all-features -- --nocapture - - diff --git a/.github/workflows/publish-lsp.yml b/.github/workflows/publish-lsp.yml deleted file mode 100644 index 9101fb42..00000000 --- a/.github/workflows/publish-lsp.yml +++ /dev/null @@ -1,95 +0,0 @@ -name: Publish simplicityhl-lsp - -on: - push: - tags: - - 'simplicityhl-lsp-v*' - workflow_dispatch: {} - release: - types: [published] - -jobs: - lint: - name: Lint (lsp) - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: dtolnay/rust-toolchain@stable - with: - components: clippy, rustfmt - - - name: Rustfmt check - working-directory: lsp - run: cargo fmt --all -- --check - - - name: Clippy - working-directory: lsp - run: cargo clippy --all-targets --all-features - - tests: - name: Tests (lsp) - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: dtolnay/rust-toolchain@stable - - - name: Run tests - working-directory: lsp - run: cargo test --all-features -- --nocapture - - publish: - name: Publish simplicityhl-lsp to crates.io - needs: [lint, tests] - runs-on: ubuntu-latest - environment: release - concurrency: - group: publish-lsp-${{ github.ref }} - cancel-in-progress: false - permissions: - id-token: write - contents: read - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust (stable) - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - - - name: Verify tag matches crate version - shell: bash - run: | - set -euo pipefail - TAG="${GITHUB_REF##*/}" - VERSION_TAG="${TAG#simplicityhl-lsp-v}" - CRATE_VERSION=$(cargo metadata --manifest-path lsp/Cargo.toml --no-deps --format-version=1 | jq -r '.packages[] | select(.name=="simplicityhl-lsp").version') - echo "Tag version: $VERSION_TAG" - echo "Crate version: $CRATE_VERSION" - if [ "$VERSION_TAG" != "$CRATE_VERSION" ]; then - echo "Tag version ($VERSION_TAG) does not match crate version ($CRATE_VERSION)" - exit 1 - fi - - - name: Check package - working-directory: lsp - run: cargo package - - - name: Authenticate with crates.io - id: auth - uses: rust-lang/crates-io-auth-action@v1 - - - name: Publish - env: - CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} - working-directory: lsp - run: cargo publish - - diff --git a/.github/workflows/typescript.yml b/.github/workflows/typescript.yml deleted file mode 100644 index 8ca9bf66..00000000 --- a/.github/workflows/typescript.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: VS Code extension (ESLint) - -on: - push: - branches: - - master - paths: - - 'vscode/**' - - '.github/workflows/typescript.yml' - pull_request: - branches: - - master - paths: - - 'vscode/**' - - '.github/workflows/typescript.yml' - workflow_dispatch: - -jobs: - eslint: - name: Lint on Node v${{ matrix.node }} - runs-on: ubuntu-latest - timeout-minutes: 10 - - permissions: - contents: read - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - - strategy: - fail-fast: false - matrix: - node: - - 22 - - defaults: - run: - working-directory: ./vscode - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - cache: 'npm' - cache-dependency-path: vscode/package-lock.json - - - name: Install dependencies - run: npm ci - env: - CI: true - - - name: Run ESLint - run: npm run eslint-check - env: - CI: true diff --git a/.gitignore b/.gitignore index 4b40e9ab..af36ea38 100644 --- a/.gitignore +++ b/.gitignore @@ -13,17 +13,8 @@ target/ .idea *.iml -# Vscode project files -.vscode - # mdbook HTML output dir book/book/ -# Node.js modules -node_modules/ - -# VSCode extension package -*.vsix - # macOS .DS_Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75fd0127..e6075e0a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,10 +9,10 @@ check out the following resources: * Our in-browser playground: https://ide.simplicity-lang.org/ This project defines and implements the SimplicityHL language, and provides -a compiler binary and language server protocol (LSP) implementation. We -welcome contributions across a wide spectrum of tasks. For example, +a compiler binary. We welcome contributions across a wide spectrum of tasks. +For example, -* Improving tooling: compiler command-line interface or LSP +* Improving tooling: compiler command-line interface * Documentation: this repository can always use more documentation; for documentation about Simplicity and SimplicityHL it may make more sense to contribute to https://github.com/BlockstreamResearch/simplicity-lang-org/ diff --git a/Cargo.toml b/Cargo.toml index 35820433..68d3f726 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,7 @@ getrandom = { version = "0.2", features = ["js"] } [workspace] members = ["codegen", "fuzz"] -exclude = ["bitcoind-tests", "lsp"] +exclude = ["bitcoind-tests"] [workspace.metadata.rbmt.toolchains] nightly = "nightly-2025-08-23" diff --git a/README.md b/README.md index 1b0696f2..325e85ec 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,9 @@ Produce JSON output with the `--json` flag. ./target/debug/simc examples/p2pkh.simf -w examples/p2pkh.wit --json ``` -### VSCode extension +### Editor tooling -See the installation [instructions](./vscode/README.md). +The language server and VS Code extension are maintained in separate repositories: + +* [simplicityhl-lsp](https://github.com/BlockstreamResearch/simplicityhl-lsp) +* [simplicityhl-vscode](https://github.com/BlockstreamResearch/simplicityhl-vscode) diff --git a/lsp/.gitignore b/lsp/.gitignore deleted file mode 100644 index 5abe97fb..00000000 --- a/lsp/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -# rust executables files -target/ -debug/ - -# client executables files -node_modules/ -out/ - -.pnpm-debug.log - -*.ast -dist/ - -# vscode package -*.vsix - -# lock files -Cargo.lock -**/pnpm-lock.yaml diff --git a/lsp/Cargo.toml b/lsp/Cargo.toml deleted file mode 100644 index 3aa165b5..00000000 --- a/lsp/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "simplicityhl-lsp" -version = "0.3.0" -edition = "2021" -rust-version = "1.79" -description = "Language Server Protocol (LSP) server for SimplicityHL." -license = "MIT OR Apache-2.0" -repository = "https://github.com/BlockstreamResearch/SimplicityHL" -homepage = "https://github.com/BlockstreamResearch/SimplicityHL/tree/master/lsp" -readme = "README.md" -documentation = "https://docs.rs/simplicityhl-lsp" -keywords = ["simplicity", "liquid", "bitcoin", "elements", "lsp"] - -[dependencies] -tokio = { version = "1.47.1", features = ["full"] } -serde_json = "1.0.143" -tower-lsp-server = "0.22.1" - -env_logger = "0.11.8" -thiserror = "2.0.17" - -ropey = "1.6.1" -miniscript = "12" -simplicityhl = "0.5.0-rc.0" -nom = "8.0.0" -lazy_static = "1.5.0" - -[lints.rust] -unsafe_code = "deny" -unused_variables = "warn" -dead_code = "warn" -unreachable_code = "warn" -unused_mut = "warn" - -[lints.clippy] -pedantic = "warn" diff --git a/lsp/README.md b/lsp/README.md deleted file mode 100644 index 3d3955fb..00000000 --- a/lsp/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# SimplicityHL LSP - -Language Server for [SimplicityHL language](https://simplicity-lang.org/). - -## Features - -- Basic diagnostic for SimplicityHL code - -![diagnostics](assets/diagnostics.gif) - -- Completions of built-ins, jets and functions - -![completion](assets/completion.gif) - -- Hover for built-ins, jets and functions, with support of documentation - -![hover](assets/hover.gif) - -- Go to definition for functions - -![goto-definition](assets/goto-definition.gif) - -## Installation - -Install Language Server using `cargo`: - -```bash -cargo install simplicityhl-lsp -``` - -## Integration with editors - -### Neovim - -#### LSP - -0. Install `simplicityhl-lsp` to your `PATH`. - -1. Include this Lua snippet to your Neovim config: - -```lua -vim.filetype.add({ - extension = { - simf = "simf", - }, -}) - -vim.lsp.config["simplicityhl-lsp"] = { cmd = { "simplicityhl-lsp" }, filetypes = { "simf" }, settings = {} } -vim.lsp.enable("simplicityhl-lsp") -``` - -2. Open `.simf` file and check that LSP is active ("attached"): - -```vim -:checkhealth vim.lsp -``` - -#### Tree-sitter (Highlighting) - -Currently, the Language Server does not provide any syntax highlighting on its own, but you can install tree-sitter for SimplicityHL: - -0. Set up the [`nvim-treesitter`](https://github.com/nvim-treesitter/nvim-treesitter/tree/main) plugin. - -1. Include this Lua snippet in your Neovim config to register parser: - -```lua -vim.api.nvim_create_autocmd("User", { - pattern = "TSUpdate", - callback = function() - require("nvim-treesitter.parsers").simplicityhl = { - install_info = { - url = "https://github.com/distributed-lab/tree-sitter-simplicityhl", - queries = "queries", - }, - filetype = "simf", - tier = 0, - } - end, -}) - -vim.treesitter.language.register("simplicityhl", { "simf" }) - -vim.api.nvim_create_autocmd("FileType", { - pattern = { "simf" }, - callback = function() - vim.treesitter.start() - end, -}) -``` - -2. Restart Neovim and run: - -```vim -:TSInstall simplicityhl -``` - -If everything is working correctly, you should see syntax highlighting in `.simf` files. - -**Note:** This method is compatible only with `nvim-treesitter` v0.10 or newer. - diff --git a/lsp/assets/completion.gif b/lsp/assets/completion.gif deleted file mode 100644 index 0b8d35be..00000000 Binary files a/lsp/assets/completion.gif and /dev/null differ diff --git a/lsp/assets/diagnostics.gif b/lsp/assets/diagnostics.gif deleted file mode 100644 index 609eacd6..00000000 Binary files a/lsp/assets/diagnostics.gif and /dev/null differ diff --git a/lsp/assets/goto-definition.gif b/lsp/assets/goto-definition.gif deleted file mode 100644 index ffef8140..00000000 Binary files a/lsp/assets/goto-definition.gif and /dev/null differ diff --git a/lsp/assets/hover.gif b/lsp/assets/hover.gif deleted file mode 100644 index fa5d625e..00000000 Binary files a/lsp/assets/hover.gif and /dev/null differ diff --git a/lsp/examples/recursive_covenant.simf b/lsp/examples/recursive_covenant.simf deleted file mode 100644 index eec94075..00000000 --- a/lsp/examples/recursive_covenant.simf +++ /dev/null @@ -1,25 +0,0 @@ -mod witness { - const ALICE_SIGNATURE: [u8; 64] = 0x5824f67b5350aa37bb4419eaf5ae56c7ac40056d8f6954be0c3a0e942329c5e4b25876fb63c1a0e2b2b3c8c4056187ed7e4e8792e2d01c8747c50faae27e81a1; -} - -mod param { - const ALICE_PUBLIC_KEY: u256 = 0x9bef8d556d80e43ae7e0becb3a7e6838b95defe45896ed6075bb9035d06c9964; -} - -fn checksig(pk: Pubkey, sig: Signature) { - let msg: u256 = jet::sig_all_hash(); - jet::bip_0340_verify((pk, msg), sig); -} - -fn recursive_covenant(){ - assert!(jet::eq_32(jet::num_outputs(), 2)); - let this_script_hash: u256 = jet::current_script_hash(); - let output_script_hash: u256 = unwrap(jet::output_script_hash(0)); - assert!(jet::eq_256(this_script_hash, output_script_hash)); - assert!(unwrap(jet::output_is_fee(1))); -} - -fn main() { - checksig(param::ALICE_PUBLIC_KEY, witness::ALICE_SIGNATURE); - recursive_covenant(); -} diff --git a/lsp/src/backend.rs b/lsp/src/backend.rs deleted file mode 100644 index fd033140..00000000 --- a/lsp/src/backend.rs +++ /dev/null @@ -1,895 +0,0 @@ -use ropey::Rope; -use serde_json::Value; -use simplicityhl::parse::ParseFromStrWithErrors; - -use std::collections::HashMap; -use std::str::FromStr; -use std::sync::Arc; -use tokio::sync::RwLock; - -use tower_lsp_server::jsonrpc::Result; -use tower_lsp_server::lsp_types::{ - CompletionOptions, CompletionParams, CompletionResponse, Diagnostic, - DidChangeConfigurationParams, DidChangeTextDocumentParams, DidChangeWatchedFilesParams, - DidChangeWorkspaceFoldersParams, DidCloseTextDocumentParams, DidOpenTextDocumentParams, - DidSaveTextDocumentParams, DocumentSymbol, DocumentSymbolParams, DocumentSymbolResponse, - ExecuteCommandParams, GotoDefinitionParams, GotoDefinitionResponse, Hover, HoverParams, - HoverProviderCapability, InitializeParams, InitializeResult, InitializedParams, Location, - MarkupContent, MarkupKind, OneOf, Range, ReferenceParams, SaveOptions, SemanticToken, - SemanticTokenModifier, SemanticTokenType, SemanticTokens, SemanticTokensFullOptions, - SemanticTokensLegend, SemanticTokensOptions, SemanticTokensParams, SemanticTokensResult, - SemanticTokensServerCapabilities, ServerCapabilities, SignatureHelp, SignatureHelpOptions, - SignatureHelpParams, SymbolKind, TextDocumentSyncCapability, TextDocumentSyncKind, - TextDocumentSyncOptions, TextDocumentSyncSaveOptions, Uri, WorkDoneProgressOptions, - WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, -}; -use tower_lsp_server::{Client, LanguageServer}; - -use miniscript::iter::TreeLike; -use simplicityhl::{ast, error::RichError, parse}; - -use crate::completion::{self, CompletionProvider}; -use crate::error::LspError; -use crate::function::Functions; -use crate::utils::{ - create_signature_info, find_all_references, find_builtin_signature, find_function_call_context, - find_function_name_range, find_key_position, find_related_call, get_call_span, - get_comments_from_lines, offset_to_position, position_to_span, span_contains, - span_to_positions, -}; - -/// Semantic token type indices - must match the legend order -mod semantic_token_types { - pub const FUNCTION: u32 = 0; - pub const NAMESPACE: u32 = 5; -} - -/// Get the semantic token legend for this server -fn get_semantic_token_legend() -> SemanticTokensLegend { - SemanticTokensLegend { - token_types: vec![ - SemanticTokenType::FUNCTION, - SemanticTokenType::PARAMETER, - SemanticTokenType::VARIABLE, - SemanticTokenType::TYPE, - SemanticTokenType::KEYWORD, - SemanticTokenType::NAMESPACE, - ], - token_modifiers: vec![ - SemanticTokenModifier::DECLARATION, - SemanticTokenModifier::DEFINITION, - ], - } -} - -#[derive(Debug)] -struct Document { - functions: Functions, - text: Rope, -} - -#[derive(Debug)] -pub struct Backend { - client: Client, - - document_map: Arc>>, - - completion_provider: CompletionProvider, -} - -struct TextDocumentItem<'a> { - uri: Uri, - text: &'a str, - version: Option, -} - -impl LanguageServer for Backend { - async fn initialize(&self, _: InitializeParams) -> Result { - Ok(InitializeResult { - server_info: None, - capabilities: ServerCapabilities { - text_document_sync: Some(TextDocumentSyncCapability::Options( - TextDocumentSyncOptions { - open_close: Some(true), - change: Some(TextDocumentSyncKind::FULL), - save: Some(TextDocumentSyncSaveOptions::SaveOptions(SaveOptions { - include_text: Some(true), - })), - ..Default::default() - }, - )), - completion_provider: Some(CompletionOptions { - resolve_provider: Some(false), - trigger_characters: Some(vec![":".to_string(), "<".to_string()]), - work_done_progress_options: WorkDoneProgressOptions::default(), - all_commit_characters: None, - completion_item: None, - }), - workspace: Some(WorkspaceServerCapabilities { - workspace_folders: Some(WorkspaceFoldersServerCapabilities { - supported: Some(true), - change_notifications: Some(OneOf::Left(true)), - }), - file_operations: None, - }), - hover_provider: Some(HoverProviderCapability::Simple(true)), - definition_provider: Some(OneOf::Left(true)), - references_provider: Some(OneOf::Left(true)), - document_symbol_provider: Some(OneOf::Left(true)), - signature_help_provider: Some(SignatureHelpOptions { - trigger_characters: Some(vec!["(".to_string(), ",".to_string()]), - retrigger_characters: Some(vec![",".to_string()]), - work_done_progress_options: WorkDoneProgressOptions::default(), - }), - semantic_tokens_provider: Some( - SemanticTokensServerCapabilities::SemanticTokensOptions( - SemanticTokensOptions { - work_done_progress_options: WorkDoneProgressOptions::default(), - legend: get_semantic_token_legend(), - range: Some(false), - full: Some(SemanticTokensFullOptions::Bool(true)), - }, - ), - ), - ..ServerCapabilities::default() - }, - }) - } - - async fn initialized(&self, _: InitializedParams) {} - - async fn shutdown(&self) -> Result<()> { - Ok(()) - } - - async fn did_change_workspace_folders(&self, _: DidChangeWorkspaceFoldersParams) {} - - async fn did_change_configuration(&self, _: DidChangeConfigurationParams) {} - - async fn did_change_watched_files(&self, _: DidChangeWatchedFilesParams) {} - - async fn execute_command(&self, _: ExecuteCommandParams) -> Result> { - Ok(None) - } - - async fn did_open(&self, params: DidOpenTextDocumentParams) { - self.on_change(TextDocumentItem { - uri: params.text_document.uri, - text: ¶ms.text_document.text, - version: Some(params.text_document.version), - }) - .await; - } - - async fn did_change(&self, params: DidChangeTextDocumentParams) { - self.on_change(TextDocumentItem { - text: ¶ms.content_changes[0].text, - uri: params.text_document.uri, - version: Some(params.text_document.version), - }) - .await; - } - - async fn did_save(&self, params: DidSaveTextDocumentParams) { - if let Some(text) = params.text { - self.on_change(TextDocumentItem { - uri: params.text_document.uri, - text: &text, - version: None, - }) - .await; - } - } - - async fn did_close(&self, _: DidCloseTextDocumentParams) {} - - async fn semantic_tokens_full( - &self, - params: SemanticTokensParams, - ) -> Result> { - let uri = ¶ms.text_document.uri; - - // .wit files don't have semantic tokens - if std::path::Path::new(uri.path().as_str()) - .extension() - .is_some_and(|ext| ext.eq_ignore_ascii_case("wit")) - { - return Ok(None); - } - - let documents = self.document_map.read().await; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - - let functions = doc.functions.functions(); - let mut raw_tokens: Vec<(u32, u32, u32, u32, u32)> = Vec::new(); // (line, col, len, type, modifiers) - - for func in &functions { - // Add function name token (declaration) - if let Ok(name_range) = find_function_name_range(func, &doc.text) { - let len = u32::try_from(func.name().as_inner().len()).map_err(LspError::from)?; - raw_tokens.push(( - name_range.start.line, - name_range.start.character, - len, - semantic_token_types::FUNCTION, - 0b11, // DECLARATION | DEFINITION - )); - } - - // Add function call tokens by walking the expression tree - let calls = parse::ExprTree::Expression(func.body()) - .pre_order_iter() - .filter_map(|expr| { - if let parse::ExprTree::Call(call) = expr { - Some((call, get_call_span(call))) - } else { - None - } - }) - .collect::>(); - - for (call, span) in calls { - if let Ok((start, _end)) = span_to_positions(&span, &doc.text) { - let name = call.name(); - let name_str = name.to_string(); - - // Determine token type based on call name - let (token_type, prefix_len) = match name { - parse::CallName::Jet(_) => { - // jet::xxx - add namespace token for "jet" and function for xxx - // First add "jet" as namespace - raw_tokens.push(( - start.line, - start.character, - 3, // "jet" - semantic_token_types::NAMESPACE, - 0, - )); - // The function name starts after "jet::" - (semantic_token_types::FUNCTION, 5) - } - _ => (semantic_token_types::FUNCTION, 0), - }; - - // Add the function name token - let func_name_len = if prefix_len > 0 { - name_str.len().saturating_sub(prefix_len) - } else { - name_str.len() - }; - - if func_name_len > 0 { - raw_tokens.push(( - start.line, - start.character + u32::try_from(prefix_len).map_err(LspError::from)?, - u32::try_from(func_name_len).map_err(LspError::from)?, - token_type, - 0, - )); - } - } - } - } - - // Sort tokens by position (line, then column) - raw_tokens.sort_by(|a, b| a.0.cmp(&b.0).then(a.1.cmp(&b.1))); - - // Convert to delta-encoded semantic tokens - let mut semantic_tokens = Vec::new(); - let mut prev_line = 0u32; - let mut prev_char = 0u32; - - for (line, col, len, token_type, modifiers) in raw_tokens { - let delta_line = line - prev_line; - let delta_start = if delta_line == 0 { - col - prev_char - } else { - col - }; - - semantic_tokens.push(SemanticToken { - delta_line, - delta_start, - length: len, - token_type, - token_modifiers_bitset: modifiers, - }); - - prev_line = line; - prev_char = col; - } - - Ok(Some(SemanticTokensResult::Tokens(SemanticTokens { - result_id: None, - data: semantic_tokens, - }))) - } - - async fn document_symbol( - &self, - params: DocumentSymbolParams, - ) -> Result> { - let uri = ¶ms.text_document.uri; - - // .wit files don't have symbols - if std::path::Path::new(uri.path().as_str()) - .extension() - .is_some_and(|ext| ext.eq_ignore_ascii_case("wit")) - { - return Ok(None); - } - - let documents = self.document_map.read().await; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - - let functions = doc.functions.functions(); - - let symbols: Vec = functions - .iter() - .filter_map(|func| { - // Get the full function range - let (start, end) = span_to_positions(func.span(), &doc.text).ok()?; - let full_range = Range { start, end }; - - // Get the function name range for selection - let selection_range = find_function_name_range(func, &doc.text).ok()?; - - // Build parameters detail string - let params_str = func - .params() - .iter() - .map(|p| format!("{p}")) - .collect::>() - .join(", "); - - let return_type = match func.ret() { - Some(ret) => format!("{ret}"), - None => "()".to_string(), - }; - - #[allow(deprecated)] - Some(DocumentSymbol { - name: func.name().to_string(), - detail: Some(format!("fn({params_str}) -> {return_type}")), - kind: SymbolKind::FUNCTION, - tags: None, - deprecated: None, - range: full_range, - selection_range, - children: None, - }) - }) - .collect(); - - Ok(Some(DocumentSymbolResponse::Nested(symbols))) - } - - async fn signature_help(&self, params: SignatureHelpParams) -> Result> { - let documents = self.document_map.read().await; - let uri = ¶ms.text_document_position_params.text_document.uri; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - - let token_pos = params.text_document_position_params.position; - - // Get the current line up to cursor position - let line = doc - .text - .lines() - .nth(token_pos.line as usize) - .ok_or(LspError::Internal("Line not found".into()))?; - - let line_str = line - .get_slice(..token_pos.character as usize) - .map(|s| s.to_string()) - .unwrap_or_default(); - - // Find function call context: look for unclosed '(' and count commas - let Some((func_name, active_param)) = find_function_call_context(&line_str) else { - return Ok(None); - }; - - // Try to find the function signature - let signature_info = if func_name.starts_with("jet::") { - // It's a jet function - let jet_name = func_name.strip_prefix("jet::").unwrap_or(&func_name); - match simplicityhl::simplicity::jet::Elements::from_str(jet_name) { - Ok(element) => { - let template = completion::jet::jet_to_template(element); - Some(create_signature_info(&template)) - } - Err(_) => None, - } - } else if let Some((function, function_doc)) = doc.functions.get(&func_name) { - // It's a custom function - let template = completion::function_to_template(function, function_doc); - Some(create_signature_info(&template)) - } else { - // Try builtin functions - find_builtin_signature(&func_name) - }; - - match signature_info { - Some(sig) => Ok(Some(SignatureHelp { - signatures: vec![sig], - active_signature: Some(0), - active_parameter: Some(active_param), - })), - None => Ok(None), - } - } - - async fn completion(&self, params: CompletionParams) -> Result> { - let documents = self.document_map.read().await; - let uri = ¶ms.text_document_position.text_document.uri; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - - let pos = params.text_document_position.position; - - let line = doc - .text - .lines() - .nth(pos.line as usize) - .ok_or(LspError::Internal("Rope proccesing error".into()))?; - - let slice = line - .get_slice(..pos.character as usize) - .ok_or(LspError::ConversionFailed( - "Rope to slice conversion failed".into(), - ))?; - - let prefix = slice.as_str().ok_or(LspError::ConversionFailed( - "RopeSlice to str conversion failed".into(), - ))?; - - let completions = self - .completion_provider - .process_completions(prefix, &doc.functions.functions_and_docs()) - .map(CompletionResponse::Array); - - Ok(completions) - } - - async fn hover(&self, params: HoverParams) -> Result> { - let uri = ¶ms.text_document_position_params.text_document.uri; - - // .wit files don't have hover info - if std::path::Path::new(uri.path().as_str()) - .extension() - .is_some_and(|ext| ext.eq_ignore_ascii_case("wit")) - { - return Ok(None); - } - - let documents = self.document_map.read().await; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - let functions = doc.functions.functions(); - - let token_pos = params.text_document_position_params.position; - - let token_span = position_to_span(token_pos, &doc.text)?; - let Ok(Some(call)) = find_related_call(&functions, token_span) else { - return Ok(None); - }; - - let call_span = get_call_span(call); - let (start, end) = span_to_positions(&call_span, &doc.text)?; - - let description = match call.name() { - parse::CallName::Jet(jet) => { - let Ok(element) = - simplicityhl::simplicity::jet::Elements::from_str(format!("{jet}").as_str()) - else { - return Ok(None); - }; - - let template = completion::jet::jet_to_template(element); - format!( - "Jet function\n```simplicityhl\nfn {}({}) -> {}\n```\n---\n\n{}", - template.display_name, - template.args.join(", "), - template.return_type, - template.description - ) - } - parse::CallName::Custom(func) => { - let Some((function, function_doc)) = doc.functions.get(func.as_inner()) else { - return Ok(None); - }; - - let template = completion::function_to_template(function, function_doc); - format!( - "```simplicityhl\nfn {}({}) -> {}\n```\n---\n{}", - template.display_name, - template.args.join(", "), - template.return_type, - template.description - ) - } - other => { - let Some(template) = completion::builtin::match_callname(other) else { - return Ok(None); - }; - format!( - "Built-in function\n```simplicityhl\nfn {}({}) -> {}\n```\n---\n{}", - template.display_name, - template.args.join(", "), - template.return_type, - template.description - ) - } - }; - - Ok(Some(Hover { - contents: tower_lsp_server::lsp_types::HoverContents::Markup(MarkupContent { - kind: MarkupKind::Markdown, - value: description, - }), - range: Some(Range { start, end }), - })) - } - - async fn goto_definition( - &self, - params: GotoDefinitionParams, - ) -> Result> { - let documents = self.document_map.read().await; - let uri = ¶ms.text_document_position_params.text_document.uri; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - let functions = doc.functions.functions(); - - let token_position = params.text_document_position_params.position; - let token_span = position_to_span(token_position, &doc.text)?; - - let Ok(Some(call)) = find_related_call(&functions, token_span) else { - let Some(func) = functions - .iter() - .find(|func| span_contains(func.span(), &token_span)) - else { - return Ok(None); - }; - let range = find_function_name_range(func, &doc.text)?; - - if token_position <= range.end && token_position >= range.start { - return Ok(Some(GotoDefinitionResponse::from(Location::new( - uri.clone(), - range, - )))); - } - return Ok(None); - }; - - match call.name() { - simplicityhl::parse::CallName::Custom(func) => { - let function = - doc.functions - .get_func(func.as_inner()) - .ok_or(LspError::FunctionNotFound(format!( - "Function {func} is not found" - )))?; - - let (start, end) = span_to_positions(function.as_ref(), &doc.text)?; - Ok(Some(GotoDefinitionResponse::from(Location::new( - uri.clone(), - Range::new(start, end), - )))) - } - _ => Ok(None), - } - } - - async fn references(&self, params: ReferenceParams) -> Result>> { - let documents = self.document_map.read().await; - let uri = ¶ms.text_document_position.text_document.uri; - - // Return None if document not found (e.g., file has parse errors) - let Some(doc) = documents.get(uri) else { - return Ok(None); - }; - let functions = doc.functions.functions(); - - let token_position = params.text_document_position.position; - - let token_span = position_to_span(token_position, &doc.text)?; - - let call_name = - find_related_call(&functions, token_span)?.map(simplicityhl::parse::Call::name); - - match call_name { - Some(parse::CallName::Custom(_)) | None => {} - Some(name) => { - return Ok(Some( - find_all_references(&doc.text, &functions, name)? - .iter() - .map(|range| Location { - range: *range, - uri: uri.clone(), - }) - .collect(), - )); - } - } - - let Some(func) = functions.iter().find(|func| match call_name { - Some(parse::CallName::Custom(name)) => func.name() == name, - _ => span_contains(func.span(), &token_span), - }) else { - return Ok(None); - }; - - let range = find_function_name_range(func, &doc.text)?; - - if (token_position <= range.end && token_position >= range.start) || call_name.is_some() { - Ok(Some( - find_all_references( - &doc.text, - &functions, - &parse::CallName::Custom(func.name().clone()), - )? - .into_iter() - .chain(std::iter::once(range)) - .map(|range| Location { - range, - uri: uri.clone(), - }) - .collect(), - )) - } else { - Ok(None) - } - } -} - -impl Backend { - pub fn new(client: Client) -> Self { - Self { - client, - document_map: Arc::new(RwLock::new(HashMap::new())), - completion_provider: CompletionProvider::new(), - } - } - - /// Function which executed on change of file (`did_save`, `did_open` or `did_change` methods) - async fn on_change(&self, params: TextDocumentItem<'_>) { - // Check if this is a witness file - if std::path::Path::new(params.uri.path().as_str()) - .extension() - .is_some_and(|ext| ext.eq_ignore_ascii_case("wit")) - { - self.on_change_witness(params).await; - return; - } - - let (err, document) = parse_program(params.text); - let rope = Rope::from_str(params.text); - let mut documents = self.document_map.write().await; - if let Some(doc) = document { - documents.insert(params.uri.clone(), doc); - } else if let Some(doc) = documents.get_mut(¶ms.uri) { - doc.text = rope.clone(); - } - let diagnostics = err - .iter() - .filter_map(|err| { - let Ok((start, end)) = span_to_positions(err.span(), &rope) else { - return None; - }; - - Some(Diagnostic::new_simple( - Range::new(start, end), - err.error().to_string(), - )) - }) - .collect(); - - self.client - .publish_diagnostics(params.uri.clone(), diagnostics, params.version) - .await; - } - - /// Validate witness (.wit) files - async fn on_change_witness(&self, params: TextDocumentItem<'_>) { - let diagnostics = validate_witness_file(params.text); - self.client - .publish_diagnostics(params.uri.clone(), diagnostics, params.version) - .await; - } -} - -/// Create [`Document`] using parsed program and code. -fn create_document(program: &simplicityhl::parse::Program, text: &str) -> Document { - let mut document = Document { - functions: Functions::new(), - text: Rope::from_str(text), - }; - - program - .items() - .iter() - .filter_map(|item| { - if let parse::Item::Function(func) = item { - Some(func) - } else { - None - } - }) - .for_each(|func| { - let start_line = offset_to_position(func.span().start, &document.text) - .unwrap_or_default() - .line; - document.functions.insert( - func.name().to_string(), - func.to_owned(), - get_comments_from_lines(start_line, &document.text), - ); - }); - - document -} - -/// Parse and analyze program using [`simplicityhl`] compiler and return an list of [`RichError`] -/// to use in diagnostics. Also creates a [`Document`] if parsing is successfull. -fn parse_program(text: &str) -> (Vec, Option) { - let mut error_collector = simplicityhl::error::ErrorCollector::new(Arc::from(text)); - - let Some(program) = parse::Program::parse_from_str_with_errors(text, &mut error_collector) - else { - return (error_collector.get().to_vec(), None); - }; - - if let Err(err) = ast::Program::analyze(&program) { - error_collector.update([err]); - } - - ( - error_collector.get().to_vec(), - Some(create_document(&program, text)), - ) -} - -/// Validate a witness (.wit) file and return diagnostics. -fn validate_witness_file(text: &str) -> Vec { - let mut diagnostics = Vec::new(); - - let json: serde_json::Value = match serde_json::from_str(text) { - Ok(v) => v, - Err(e) => { - let line = u32::try_from(e.line().saturating_sub(1)).unwrap_or(0); - let col = u32::try_from(e.column().saturating_sub(1)).unwrap_or(0); - diagnostics.push(Diagnostic::new_simple( - Range::new( - tower_lsp_server::lsp_types::Position::new(line, col), - tower_lsp_server::lsp_types::Position::new(line, col + 1), - ), - format!("JSON syntax error: {e}"), - )); - return diagnostics; - } - }; - - let Some(obj) = json.as_object() else { - diagnostics.push(Diagnostic::new_simple( - Range::new( - tower_lsp_server::lsp_types::Position::new(0, 0), - tower_lsp_server::lsp_types::Position::new(0, 1), - ), - "Witness file must be a JSON object".to_string(), - )); - return diagnostics; - }; - - for (name, value) in obj { - let Some(witness_obj) = value.as_object() else { - // Find approximate position for this key - if let Some(pos) = find_key_position(text, name) { - diagnostics.push(Diagnostic::new_simple( - Range::new(pos, pos), - format!("Witness '{name}' must be an object with 'value' and 'type' fields"), - )); - } - continue; - }; - - if !witness_obj.contains_key("value") { - if let Some(pos) = find_key_position(text, name) { - diagnostics.push(Diagnostic::new_simple( - Range::new(pos, pos), - format!("Witness '{name}' is missing required 'value' field"), - )); - } - } - - if !witness_obj.contains_key("type") { - if let Some(pos) = find_key_position(text, name) { - diagnostics.push(Diagnostic::new_simple( - Range::new(pos, pos), - format!("Witness '{name}' is missing required 'type' field"), - )); - } - } - } - - diagnostics -} - -#[cfg(test)] -mod tests { - use simplicityhl::error::Error; - - use super::*; - - fn sample_program() -> &'static str { - "fn add(a: u32, b: u32) -> u32 { let (_, res): (bool, u32) = jet::add_32(a, b); res } - fn main() {}" - } - fn invalid_program_on_ast() -> &'static str { - "fn add(a: u32, b: u32) -> u32 {}" - } - - fn invalid_program_on_parsing() -> &'static str { - "fn add(a: u32, b: u32) -> u32 " - } - - #[test] - fn test_parse_program_valid() { - let (err, doc) = parse_program(sample_program()); - assert!(err.is_empty(), "Expected no parsing error"); - let doc = doc.expect("Expected Some(Document)"); - assert_eq!(doc.functions.map.len(), 2); - } - - #[test] - fn test_parse_program_invalid_ast() { - let (err, doc) = parse_program(invalid_program_on_ast()); - assert!( - err.first() - .expect("program should produce an error") - .to_string() - .contains("Expected expression of type `u32`, found type `()`"), - "Expected error on return type" - ); - assert!(doc.is_some(), "Expected problem in AST build, not parse"); - } - - #[test] - fn test_parse_program_invalid_parse() { - let (err, doc) = parse_program(invalid_program_on_parsing()); - assert_eq!( - err.first() - .expect("program should produce an error") - .error() - .clone(), - Error::Syntax { - expected: ["{".to_string()].to_vec(), - label: Some("function body".to_string()), - found: None - }, - "Expected `Grammar error`" - ); - - assert!(doc.is_none(), "Expected no document to return"); - } -} diff --git a/lsp/src/completion/builtin.rs b/lsp/src/completion/builtin.rs deleted file mode 100644 index a18e9ee0..00000000 --- a/lsp/src/completion/builtin.rs +++ /dev/null @@ -1,285 +0,0 @@ -use std::num::NonZero; - -use simplicityhl::{ - num::NonZeroPow2Usize, - parse::CallName, - str::{AliasName, FunctionName}, - types::AliasedType, -}; - -use crate::completion::types::FunctionTemplate; - -/// Get completion of builtin functions. They are all defined in [`simplicityhl::parse::CallName`] -pub fn get_builtin_functions() -> Vec { - let ty = AliasedType::from(AliasName::from_str_unchecked("T")); - let function_name = FunctionName::from_str_unchecked("fn"); - let Some(some) = NonZero::new(1) else { - return vec![]; - }; - - let functions = vec![ - CallName::UnwrapLeft(ty.clone()), - CallName::UnwrapRight(ty.clone()), - CallName::Unwrap, - CallName::IsNone(ty.clone()), - CallName::Assert, - CallName::Debug, - CallName::Panic, - CallName::Fold(function_name.clone(), NonZeroPow2Usize::TWO), - CallName::ArrayFold(function_name.clone(), some), - CallName::ForWhile(function_name.clone()), - CallName::TypeCast(ty.clone()), - ]; - - functions.iter().filter_map(match_callname).collect() -} - -/// Match [`simplicityhl::parse::CallName`] and return [`FunctionTemplate`] -pub fn match_callname(call: &CallName) -> Option { - let doc = builtin_documentation(call); - match call { - CallName::UnwrapLeft(aliased_type) => { - let ty = aliased_type.to_string(); - Some(FunctionTemplate::new( - "unwrap_left", - vec![format!("{ty}")], - vec![format!("Either")], - ty, - doc, - )) - } - CallName::UnwrapRight(aliased_type) => { - let ty = aliased_type.to_string(); - Some(FunctionTemplate::new( - "unwrap_right", - vec![format!("{ty}")], - vec![format!("Either<{ty}, U>")], - ty, - doc, - )) - } - CallName::Unwrap => Some(FunctionTemplate::simple( - "unwrap", - vec!["Option".to_string()], - "T", - doc, - )), - CallName::IsNone(aliased_type) => { - let ty = aliased_type.to_string(); - Some(FunctionTemplate::new( - "is_none".to_string(), - vec![format!("{ty}")], - vec![format!("Option<{ty}>")], - "bool", - doc, - )) - } - CallName::Assert => Some(FunctionTemplate::simple( - "assert!", - vec!["condition: bool".to_string()], - "()", - doc, - )), - CallName::Panic => Some(FunctionTemplate::simple("panic!", vec![], "()", doc)), - CallName::Debug => Some(FunctionTemplate::simple( - "dbg!", - vec!["T".to_string()], - "T", - doc, - )), - CallName::Fold(_, _) => Some(FunctionTemplate::new( - "fold", - vec!["f".to_string(), "N".to_string()], - vec![ - "list: List".to_string(), - "initial_accumulator: A".to_string(), - ], - "A", - doc, - )), - CallName::ArrayFold(_, _) => Some(FunctionTemplate::new( - "array_fold", - vec!["f".to_string(), "N".to_string()], - vec![ - "array: [E; N]".to_string(), - "initial_accumulator: A".to_string(), - ], - "A", - doc, - )), - CallName::ForWhile(_) => Some(FunctionTemplate::new( - "for_while", - vec!["f".to_string()], - vec!["accumulator: A".to_string(), "context: C".to_string()], - "Either", - doc, - )), - - // The `into` function has a different structure compared to the other built-ins, - // so we defined a different snippet for it. - CallName::TypeCast(_) => Some(FunctionTemplate { - display_name: "into".into(), - generics: vec!["Input".to_string()], - args: vec!["input".to_string()], - return_type: "Output".into(), - description: doc, - snippet: "<${1:Input}>::into".into(), - }), - CallName::Jet(_) | CallName::Custom(_) => None, - } -} - -/// Return documentation for builtin function. -fn builtin_documentation(call: &CallName) -> String { - String::from(match call { - CallName::UnwrapLeft(_) => - "Extracts the left variant of an `Either` value.\n -Returns the left-side value if it exists, otherwise panics.\n -```simplicityhl -let x: Either = Left(42); -// We must specify the type of the right variant so the compiler knows the full type. -let y: u8 = unwrap_left::(x); // 42 -```", - CallName::UnwrapRight(_) => - "Extracts the right variant of an `Either` value.\n -Returns the right-side value if it exists, otherwise panics.\n -```simplicityhl -let x: Either = Right(128); -// We must specify the type of the left variant so the compiler knows the full type. -let y: u32 = unwrap_right::(x); // 128 -```", - CallName::Unwrap => - "Unwraps an `Option` value, panicking if it is `None`.\n -```simplicityhl -let x: Option = Some(5); -let y: u8 = unwrap(x); // 5 -```", - CallName::IsNone(_) => - "Checks if an `Option` is `None`.\n -Returns `true` if the value is `None`, otherwise `false`. -", - CallName::Assert => "Panics when `condition` is false.", - CallName::Panic => "Unconditionally terminates program execution.", - CallName::Debug => - "Prints a value if debugging symbols is enabled and returns it unchanged. \n -```simplicityhl -let x: u32 = dbg!(42); // prints 42, returns 42 -```", - CallName::Fold(_, _) => - "Fold a list of bounded length by repeatedly applying a function.\n -- Signature: `fold::(list: List, initial_accumulator: A) -> A` -- Fold step: `fn f(element: E, acc: A) -> A` -- Note: `N` is a power of two; lists hold fewer than `N` elements.\n -Example: sum a list of 32-bit integers.\n -```simplicityhl -fn sum(elt: u32, acc: u32) -> u32 { - let (_, acc): (bool, u32) = jet::add_32(elt, acc); - acc -} - -fn main() { - let xs: List = list![1, 2, 3]; - let s: u32 = fold::(xs, 0); - assert!(jet::eq_32(s, 6)); -} -```", - CallName::ArrayFold(_, _) => - "Fold a fixed-size array by repeatedly applying a function.\n -- Signature: `array_fold::(array: [E; N], initial_accumulator: A) -> A` -- Fold step: `fn f(element: E, acc: A) -> A`\n -Example: sum an array of 7 elements.\n -```simplicityhl -fn sum(elt: u32, acc: u32) -> u32 { - let (_, acc): (bool, u32) = jet::add_32(elt, acc); - acc -} - -fn main() { - let arr: [u32; 7] = [1, 2, 3, 4, 5, 6, 7]; - let sum: u32 = array_fold::(arr, 0); - assert!(jet::eq_32(sum, 28)); -} -```", - CallName::ForWhile(_) => - "Run a function `f` repeatedly with a bounded counter. The loop stops early when the function returns a successful value.\n -- Signature: `for_while::(initial_accumulator: A, readonly_context: C) -> Either` -- Loop body: `fn f(acc: A, ctx: C, counter: uN) -> Either` where `N ∈ {1, 2, 4, 8, 16}`\n -Example: stop when `counter == 10`.\n -```simplicityhl -fn stop_at_10(acc: (), _: (), i: u8) -> Either { - match jet::eq_8(i, 10) { - true => Left(i), // success → exit loop - false => Right(acc), // continue with same accumulator - } -} - -fn main() { - let out: Either = for_while::((), ()); - assert!(jet::eq_8(10, unwrap_left::<()>(out))); -} -```", - CallName::TypeCast(_) => type_casting_documentation(), - CallName::Jet(_) | CallName::Custom(_) => "", - }) -} - -/// Return documentation for `into` casting. -fn type_casting_documentation() -> &'static str { - "A SimplicityHL type can be cast into another SimplicityHL type if both types share the same structure. - -## Casting Rules - -- Type `A` can be cast into itself (reflexivity). - -- If type `A` can be cast into type `B`, then type `B` can be cast into type `A` (symmetry). - -- If type `A` can be cast into type `B` and type `B` can be cast into type `C`, then type `A` can be cast into type `C` (transitivity). - -Below is a table of types that can be cast into each other. - -| Type | Casts To (And Back) | -|----------------|------------------------------------| -| `bool` | `Either<(), ()>` | -| `Option` | `Either<(), A>` | -| `u1` | `bool` | -| `u2` | `(u1, u1)` | -| `u4` | `(u2, u2)` | -| `u8` | `(u4, u4)` | -| `u16` | `(u8, u8)` | -| `u32` | `(u16, u16)` | -| `u64` | `(u32, u32)` | -| `u128` | `(u64, u64)` | -| `u256` | `(u128, u128)` | -| `(A)` | `A` | -| `(A, B, C)` | `(A, (B, C))` | -| `(A, B, C, D)` | `((A, B), (C, D))` | -| ... | ... | -| `[A; 0]` | `()` | -| `[A; 1]` | `A` | -| `[A; 2]` | `(A, A)` | -| `[A; 3]` | `(A, (A, A))` | -| `[A; 4]` | `((A, A), (A, A))` | -| ... | ... | -| `List` | `Option` | -| `List` | `(Option<[A; 2]>, List)` | -| `List` | `(Option<[A; 4]>, List)` | -| `List` | `(Option<[A; 8]>, List)` | -| `List` | `(Option<[A; 16]>, List)` | -| `List` | `(Option<[A; 32]>, List)` | -| `List` | `(Option<[A; 64]>, List)` | -| `List` | `(Option<[A; 128]>, List)` | -| `List` | `(Option<[A; 256]>, List)` | -| ... | ... | - -## Casting Expression - -All casting in SimplicityHL happens explicitly through a casting expression. - -```simplicityhl -::into(input) -``` - -The above expression casts the value `input` of type `Input` into some output type. -The input type of the cast is explicit while the output type is implicit. -" -} diff --git a/lsp/src/completion/jet.rs b/lsp/src/completion/jet.rs deleted file mode 100644 index 549b9a76..00000000 --- a/lsp/src/completion/jet.rs +++ /dev/null @@ -1,826 +0,0 @@ -use crate::completion::types; - -use simplicityhl::jet; -use simplicityhl::simplicity::jet::Elements; - -/// Convert all jets to [`types::FunctionTemplate`]. -pub fn get_jets_completions() -> Vec { - Elements::ALL.iter().copied().map(jet_to_template).collect() -} - -/// Convert [`Elements`] to [`types::FunctionTemplate`] -pub fn jet_to_template(jet: Elements) -> types::FunctionTemplate { - types::FunctionTemplate::simple( - jet.to_string(), - jet::source_type(jet) - .iter() - .map(|item| format!("{item}")) - .collect::>(), - jet::target_type(jet).to_string().as_str(), - documentation(jet), - ) -} - -// copied from https://github.com/BlockstreamResearch/SimplicityHL/blob/master/codegen/src/jet.rs -#[allow(warnings)] -#[rustfmt::skip] -pub fn documentation(jet: Elements) -> &'static str { - match jet { - // Multi-bit logic - Elements::All8 => "Check if the value is [`u8::MAX`].", - Elements::All16 => "Check if the value is [`u16::MAX`].", - Elements::All32 => "Check if the value is [`u32::MAX`].", - Elements::All64 => "Check if the value is [`u64::MAX`].", - Elements::And1 => "Bitwise AND of two 1-bit values.", - Elements::And8 => "Bitwise AND of two 8-bit values.", - Elements::And16 => "Bitwise AND of two 16-bit values.", - Elements::And32 => "Bitwise AND of two 32-bit values", - Elements::And64 => "Bitwise AND of two 64-bit values", - Elements::Ch1 => "Bitwise CHOICE of a bit and two 1-bit values. If the bit is true, then take the first value, else take the second value.", - Elements::Ch8 => "Bitwise CHOICE of a bit and two 8-bit values. If the bit is true, then take the first value, else take the second value.", - Elements::Ch16 => "Bitwise CHOICE of a bit and two 16-bit values. If the bit is true, then take the first value, else take the second value.", - Elements::Ch32 => "Bitwise CHOICE of a bit and two 32-bit values. If the bit is true, then take the first value, else take the second value.", - Elements::Ch64 => "Bitwise CHOICE of a bit and two 64-bit values. If the bit is true, then take the first value, else take the second value.", - Elements::Complement1 => "Bitwise NOT of a 1-bit value.", - Elements::Complement8 => "Bitwise NOT of an 8-bit value.", - Elements::Complement16 => "Bitwise NOT of a 16-bit value.", - Elements::Complement32 => "Bitwise NOT of a 32-bit value.", - Elements::Complement64 => "Bitwise NOT of a 64-bit value.", - Elements::Eq1 => "Check if two 1-bit values are equal.", - Elements::Eq8 => "Check if two 8-bit values are equal.", - Elements::Eq16 => "Check if two 16-bit values are equal.", - Elements::Eq32 => "Check if two 32-bit values are equal.", - Elements::Eq64 => "Check if two 64-bit values are equal.", - Elements::Eq256 => "Check if two 256-bit values are equal.", - Elements::FullLeftShift8_1 => "Helper for left-shifting bits. The bits are shifted from a 1-bit value into a 8-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullLeftShift8_2 => "Helper for left-shifting bits. The bits are shifted from a 2-bit value into a 8-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullLeftShift8_4 => "Helper for left-shifting bits. The bits are shifted from a 4-bit value into a 8-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullLeftShift16_1 => "Helper for left-shifting bits. The bits are shifted from a 1-bit value into a 16-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullLeftShift16_2 => "Helper for left-shifting bits. The bits are shifted from a 2-bit value into a 16-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullLeftShift16_4 => "Helper for left-shifting bits. The bits are shifted from a 4-bit value into a 16-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullLeftShift16_8 => "Helper for left-shifting bits. The bits are shifted from a 8-bit value into a 16-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullLeftShift32_1 => "Helper for left-shifting bits. The bits are shifted from a 1-bit value into a 32-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullLeftShift32_2 => "Helper for left-shifting bits. The bits are shifted from a 2-bit value into a 32-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullLeftShift32_4 => "Helper for left-shifting bits. The bits are shifted from a 4-bit value into a 32-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullLeftShift32_8 => "Helper for left-shifting bits. The bits are shifted from a 8-bit value into a 32-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullLeftShift32_16 => "Helper for left-shifting bits. The bits are shifted from a 16-bit value into a 32-bit value. Return the shifted value and the 16 bits that were shifted out.", - Elements::FullLeftShift64_1 => "Helper for left-shifting bits. The bits are shifted from a 1-bit value into a 64-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullLeftShift64_2 => "Helper for left-shifting bits. The bits are shifted from a 2-bit value into a 64-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullLeftShift64_4 => "Helper for left-shifting bits. The bits are shifted from a 4-bit value into a 64-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullLeftShift64_8 => "Helper for left-shifting bits. The bits are shifted from a 8-bit value into a 64-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullLeftShift64_16 => "Helper for left-shifting bits. The bits are shifted from a 16-bit value into a 64-bit value. Return the shifted value and the 16 bits that were shifted out.", - Elements::FullLeftShift64_32 => "Helper for left-shifting bits. The bits are shifted from a 32-bit value into a 64-bit value. Return the shifted value and the 32 bits that were shifted out.", - Elements::FullRightShift8_1 => "Helper for right-shifting bits. The bits are shifted from a 1-bit value into a 8-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullRightShift8_2 => "Helper for right-shifting bits. The bits are shifted from a 2-bit value into a 8-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullRightShift8_4 => "Helper for right-shifting bits. The bits are shifted from a 4-bit value into a 8-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullRightShift16_1 => "Helper for right-shifting bits. The bits are shifted from a 1-bit value into a 16-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullRightShift16_2 => "Helper for right-shifting bits. The bits are shifted from a 2-bit value into a 16-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullRightShift16_4 => "Helper for right-shifting bits. The bits are shifted from a 4-bit value into a 16-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullRightShift16_8 => "Helper for right-shifting bits. The bits are shifted from a 8-bit value into a 16-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullRightShift32_1 => "Helper for right-shifting bits. The bits are shifted from a 1-bit value into a 32-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullRightShift32_2 => "Helper for right-shifting bits. The bits are shifted from a 2-bit value into a 32-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullRightShift32_4 => "Helper for right-shifting bits. The bits are shifted from a 4-bit value into a 32-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullRightShift32_8 => "Helper for right-shifting bits. The bits are shifted from a 8-bit value into a 32-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullRightShift32_16 => "Helper for right-shifting bits. The bits are shifted from a 16-bit value into a 32-bit value. Return the shifted value and the 16 bits that were shifted out.", - Elements::FullRightShift64_1 => "Helper for right-shifting bits. The bits are shifted from a 1-bit value into a 64-bit value. Return the shifted value and the 1 bit that was shifted out.", - Elements::FullRightShift64_2 => "Helper for right-shifting bits. The bits are shifted from a 2-bit value into a 64-bit value. Return the shifted value and the 2 bits that were shifted out.", - Elements::FullRightShift64_4 => "Helper for right-shifting bits. The bits are shifted from a 4-bit value into a 64-bit value. Return the shifted value and the 4 bits that were shifted out.", - Elements::FullRightShift64_8 => "Helper for right-shifting bits. The bits are shifted from a 8-bit value into a 64-bit value. Return the shifted value and the 8 bits that were shifted out.", - Elements::FullRightShift64_16 => "Helper for right-shifting bits. The bits are shifted from a 16-bit value into a 64-bit value. Return the shifted value and the 16 bits that were shifted out.", - Elements::FullRightShift64_32 => "Helper for right-shifting bits. The bits are shifted from a 32-bit value into a 64-bit value. Return the shifted value and the 32 bits that were shifted out.", - Elements::High1 => "Return `u1::MAX` = 1.", - Elements::High8 => "Return [`u8::MAX`].", - Elements::High16 => "Return [`u16::MAX`].", - Elements::High32 => "Return [`u32::MAX`].", - Elements::High64 => "Return [`u64::MAX`].", - Elements::LeftExtend1_8 => "Extend a 1-bit value to an 8-bit value by padding its left with the MSB.", - Elements::LeftExtend1_16 => "Extend a 1-bit value to a 16-bit value by padding its left with the MSB.", - Elements::LeftExtend1_32 => "Extend a 1-bit value to a 32-bit value by padding its left with the MSB.", - Elements::LeftExtend1_64 => "Extend a 1-bit value to a 64-bit value by padding its left with the MSB.", - Elements::LeftExtend8_16 => "Extend an 8-bit value to a 16-bit value by padding its left with the MSB.", - Elements::LeftExtend8_32 => "Extend an 8-bit value to a 32-bit value by padding its left with the MSB.", - Elements::LeftExtend8_64 => "Extend an 8-bit value to a 64-bit value by padding its left with the MSB.", - Elements::LeftExtend16_32 => "Extend a 16-bit value to a 32-bit value by padding its left with the MSB.", - Elements::LeftExtend16_64 => "Extend a 16-bit value to a 64-bit value by padding its left with the MSB.", - Elements::LeftExtend32_64 => "Extend a 16-bit value to a 64-bit value by padding its left with the MSB.", - Elements::LeftPadHigh1_8 => "Extend a 1-bit value to an 8-bit value by padding its left with ones.", - Elements::LeftPadHigh1_16 => "Extend a 1-bit value to a 16-bit value by padding its left with ones.", - Elements::LeftPadHigh1_32 => "Extend a 1-bit value to a 32-bit value by padding its left with ones.", - Elements::LeftPadHigh1_64 => "Extend a 1-bit value to a 64-bit value by padding its left with ones.", - Elements::LeftPadHigh8_16 => "Extend an 8-bit value to a 16-bit value by padding its left with ones.", - Elements::LeftPadHigh8_32 => "Extend an 8-bit value to a 32-bit value by padding its left with ones.", - Elements::LeftPadHigh8_64 => "Extend a 1-bit value to a 64-bit value by padding its left with ones.", - Elements::LeftPadHigh16_32 => "Extend a 16-bit value to a 32-bit value by padding its left with ones.", - Elements::LeftPadHigh16_64 => "Extend a 16-bit value to a 64-bit value by padding its left with ones.", - Elements::LeftPadHigh32_64 => "Extend a 32-bit value to a 64-bit value by padding its left with ones.", - Elements::LeftPadLow1_8 => "Extend a 1-bit value to an 8-bit value by padding its left with zeroes.", - Elements::LeftPadLow1_16 => "Extend a 1-bit value to a 16-bit value by padding its left with zeroes.", - Elements::LeftPadLow1_32 => "Extend a 1-bit value to a 32-bit value by padding its left with zeroes.", - Elements::LeftPadLow1_64 => "Extend a 1-bit value to a 64-bit value by padding its left with zeroes.", - Elements::LeftPadLow8_16 => "Extend an 8-bit value to a 16-bit value by padding its left with zeroes.", - Elements::LeftPadLow8_32 => "Extend an 8-bit value to a 32-bit value by padding its left with zeroes.", - Elements::LeftPadLow8_64 => "Extend an 8-bit value to a 64-bit value by padding its left with zeroes.", - Elements::LeftPadLow16_32 => "Extend a 16-bit value to a 32-bit value by padding its left with zeroes.", - Elements::LeftPadLow16_64 => "Extend a 16-bit value to a 64-bit value by padding its left with zeroes.", - Elements::LeftPadLow32_64 => "Extend a 32-bit value to a 64-bit value by padding its left with zeroes.", - Elements::LeftRotate8 => "Left-rotate an 8-bit value by the given amount.", - Elements::LeftRotate16 => "Left-rotate a 16-bit value by the given amount.", - Elements::LeftRotate32 => "Left-rotate a 32-bit value by the given amount.", - Elements::LeftRotate64 => "Left-rotate a 64-bit value by the given amount.", - Elements::LeftShift8 => "Left-shift an 8-bit value by the given amount. Bits are filled with zeroes.", - Elements::LeftShift16 => "Left-shift a 16-bit value by the given amount. Bits are filled with zeroes.", - Elements::LeftShift32 => "Left-shift a 32-bit value by the given amount. Bits are filled with zeroes.", - Elements::LeftShift64 => "Left-shift a 64-bit value by the given amount. Bits are filled with zeroes.", - Elements::LeftShiftWith8 => "Left-shift an 8-bit value by the given amount. Bits are filled with the given bit.", - Elements::LeftShiftWith16 => "Left-shift a 16-bit value by the given amount. Bits are filled with the given bit.", - Elements::LeftShiftWith32 => "Left-shift a 32-bit value by the given amount. Bits are filled with the given bit.", - Elements::LeftShiftWith64 => "Left-shift a 64-bit value by the given amount. Bits are filled with the given bit.", - Elements::Leftmost8_1 => "Return the most significant 1 bits of an 8-bit value.", - Elements::Leftmost8_2 => "Return the most significant 1 bits of an 8-bit value.", - Elements::Leftmost8_4 => "Return the most significant 1 bits of an 8-bit value.", - Elements::Leftmost16_1 => "Return the most significant 1 bit of a 16-bit value.", - Elements::Leftmost16_2 => "Return the most significant 2 bits of a 16-bit value.", - Elements::Leftmost16_4 => "Return the most significant 4 bits of a 16-bit value.", - Elements::Leftmost16_8 => "Return the most significant 8 bits of a 16-bit value.", - Elements::Leftmost32_1 => "Return the most significant 1 bit of a 32-bit value.", - Elements::Leftmost32_2 => "Return the most significant 2 bits of a 32-bit value.", - Elements::Leftmost32_4 => "Return the most significant 4 bits of a 32-bit value.", - Elements::Leftmost32_8 => "Return the most significant 8 bits of a 32-bit value.", - Elements::Leftmost32_16 => "Return the most significant 16 bits of a 32-bit value.", - Elements::Leftmost64_1 => "Return the most significant 1 bits of a 64-bit value.", - Elements::Leftmost64_2 => "Return the most significant 2 bits of a 64-bit value.", - Elements::Leftmost64_4 => "Return the most significant 4 bits of a 64-bit value.", - Elements::Leftmost64_8 => "Return the most significant 8 bits of a 64-bit value.", - Elements::Leftmost64_16 => "Return the most significant 16 bits of a 64-bit value.", - Elements::Leftmost64_32 => "Return the most significant 32 bits of a 64-bit value.", - Elements::Low1 => "Return `u1::MIN` = 1.", - Elements::Low8 => "Return [`u8::MIN`].", - Elements::Low16 => "Return [`u16::MIN`].", - Elements::Low32 => "Return [`u32::MIN`].", - Elements::Low64 => "Return [`u64::MIN`].", - Elements::Maj1 => "Bitwise MAJORITY of three 1-bit values. The output bit is false if two or more input bits are false, and true otherwise.", - Elements::Maj8 => "Bitwise MAJORITY of three 1-bit values. The output bit is false if two or more input bits are false, and true otherwise.", - Elements::Maj16 => "Bitwise MAJORITY of three 1-bit values. The output bit is false if two or more input bits are false, and true otherwise.", - Elements::Maj32 => "Bitwise MAJORITY of three 1-bit values. The output bit is false if two or more input bits are false, and true otherwise.", - Elements::Maj64 => "Bitwise MAJORITY of three 1-bit values. The output bit is false if two or more input bits are false, and true otherwise.", - Elements::Or1 => "Bitwise OR of two 1-bit values.", - Elements::Or8 => "Bitwise OR of two 8-bit values.", - Elements::Or16 => "Bitwise OR of two 16-bit values.", - Elements::Or32 => "Bitwise OR of two 32-bit values.", - Elements::Or64 => "Bitwise OR of two 64-bit values.", - Elements::RightExtend8_16 => "Extend an 8-bit value to a 16-bit value by padding its right with the MSB.", - Elements::RightExtend8_32 => "Extend an 8-bit value to a 32-bit value by padding its right with the MSB.", - Elements::RightExtend8_64 => "Extend an 8-bit value to a 64-bit value by padding its right with the MSB.", - Elements::RightExtend16_32 => "Extend a 16-bit value to a 32-bit value by padding its right with the MSB.", - Elements::RightExtend16_64 => "Extend a 16-bit value to a 64-bit value by padding its right with the MSB.", - Elements::RightExtend32_64 => "Extend a 16-bit value to a 64-bit value by padding its right with the MSB.", - Elements::RightPadHigh1_8 => "Extend a 1-bit value to an 8-bit value by padding its right with ones.", - Elements::RightPadHigh1_16 => "Extend a 1-bit value to a 16-bit value by padding its right with ones.", - Elements::RightPadHigh1_32 => "Extend a 1-bit value to a 32-bit value by padding its right with ones.", - Elements::RightPadHigh1_64 => "Extend a 1-bit value to a 64-bit value by padding its right with ones.", - Elements::RightPadHigh8_16 => "Extend an 8-bit value to a 16-bit value by padding its right with ones.", - Elements::RightPadHigh8_32 => "Extend an 8-bit value to a 32-bit value by padding its right with ones.", - Elements::RightPadHigh8_64 => "Extend a 1-bit value to a 64-bit value by padding its right with ones.", - Elements::RightPadHigh16_32 => "Extend a 16-bit value to a 32-bit value by padding its right with ones.", - Elements::RightPadHigh16_64 => "Extend a 16-bit value to a 64-bit value by padding its right with ones.", - Elements::RightPadHigh32_64 => "Extend a 32-bit value to a 64-bit value by padding its right with ones.", - Elements::RightPadLow1_8 => "Extend a 1-bit value to an 8-bit value by padding its right with zeroes.", - Elements::RightPadLow1_16 => "Extend a 1-bit value to a 16-bit value by padding its right with zeroes.", - Elements::RightPadLow1_32 => "Extend a 1-bit value to a 32-bit value by padding its right with zeroes.", - Elements::RightPadLow1_64 => "Extend a 1-bit value to a 64-bit value by padding its right with zeroes.", - Elements::RightPadLow8_16 => "Extend an 8-bit value to a 16-bit value by padding its right with zeroes.", - Elements::RightPadLow8_32 => "Extend an 8-bit value to a 32-bit value by padding its right with zeroes.", - Elements::RightPadLow8_64 => "Extend an 8-bit value to a 64-bit value by padding its right with zeroes.", - Elements::RightPadLow16_32 => "Extend a 16-bit value to a 32-bit value by padding its right with zeroes.", - Elements::RightPadLow16_64 => "Extend a 16-bit value to a 64-bit value by padding its right with zeroes.", - Elements::RightPadLow32_64 => "Extend a 32-bit value to a 64-bit value by padding its right with zeroes.", - Elements::RightRotate8 => "Right-rotate an 8-bit value by the given amount.", - Elements::RightRotate16 => "Right-rotate a 16-bit value by the given amount.", - Elements::RightRotate32 => "Right-rotate a 32-bit value by the given amount.", - Elements::RightRotate64 => "Right-rotate a 64-bit value by the given amount.", - Elements::RightShift8 => "Right-shift an 8-bit value by the given amount. Bits are filled with zeroes.", - Elements::RightShift16 => "Right-shift a 16-bit value by the given amount. Bits are filled with zeroes.", - Elements::RightShift32 => "Right-shift a 32-bit value by the given amount. Bits are filled with zeroes.", - Elements::RightShift64 => "Right-shift a 64-bit value by the given amount. Bits are filled with zeroes.", - Elements::RightShiftWith8 => "Right-shift an 8-bit value by the given amount. Bits are filled with the given bit.", - Elements::RightShiftWith16 => "Right-shift a 16-bit value by the given amount. Bits are filled with the given bit.", - Elements::RightShiftWith32 => "Right-shift a 32-bit value by the given amount. Bits are filled with the given bit.", - Elements::RightShiftWith64 => "Right-shift a 64-bit value by the given amount. Bits are filled with the given bit.", - Elements::Rightmost8_1 => "Return the least significant 1 bits of an 8-bit value.", - Elements::Rightmost8_2 => "Return the least significant 1 bits of an 8-bit value.", - Elements::Rightmost8_4 => "Return the least significant 1 bits of an 8-bit value.", - Elements::Rightmost16_1 => "Return the least significant 1 bit of a 16-bit value.", - Elements::Rightmost16_2 => "Return the least significant 2 bits of a 16-bit value.", - Elements::Rightmost16_4 => "Return the least significant 4 bits of a 16-bit value.", - Elements::Rightmost16_8 => "Return the least significant 8 bits of a 16-bit value.", - Elements::Rightmost32_1 => "Return the least significant 1 bit of a 32-bit value.", - Elements::Rightmost32_2 => "Return the least significant 2 bits of a 32-bit value.", - Elements::Rightmost32_4 => "Return the least significant 4 bits of a 32-bit value.", - Elements::Rightmost32_8 => "Return the least significant 8 bits of a 32-bit value.", - Elements::Rightmost32_16 => "Return the least significant 16 bits of a 32-bit value.", - Elements::Rightmost64_1 => "Return the least significant 1 bits of a 64-bit value.", - Elements::Rightmost64_2 => "Return the least significant 2 bits of a 64-bit value.", - Elements::Rightmost64_4 => "Return the least significant 4 bits of a 64-bit value.", - Elements::Rightmost64_8 => "Return the least significant 8 bits of a 64-bit value.", - Elements::Rightmost64_16 => "Return the least significant 16 bits of a 64-bit value.", - Elements::Rightmost64_32 => "Return the least significant 32 bits of a 64-bit value.", - Elements::Some1 => "Check if a 1-bit value is nonzero.", - Elements::Some8 => "Check if an 8-bit value is nonzero.", - Elements::Some16 => "Check if a 16-bit value is nonzero.", - Elements::Some32 => "Check if a 32-bit value is nonzero.", - Elements::Some64 => "Check if a 64-bit value is nonzero.", - Elements::Verify => r#"Assert that a bit is true. - -## Panics -The assertion fails."#, - Elements::Xor1 => "Bitwise XOR of two 1-bit values.", - Elements::Xor8 => "Bitwise XOR of two 8-bit values.", - Elements::Xor16 => "Bitwise XOR of two 16-bit values.", - Elements::Xor32 => "Bitwise XOR of two 32-bit values.", - Elements::Xor64 => "Bitwise XOR of two 64-bit values.", - Elements::XorXor1 => "Bitwise XOR of three 1-bit values.", - Elements::XorXor8 => "Bitwise XOR of three 8-bit values.", - Elements::XorXor16 => "Bitwise XOR of three 16-bit values.", - Elements::XorXor32 => "Bitwise XOR of three 32-bit values.", - Elements::XorXor64 => "Bitwise XOR of three 64-bit values.", - // Arithmetic - Elements::Add8 - | Elements::Add16 - | Elements::Add32 - | Elements::Add64 => "Add two integers and return the carry.", - Elements::Decrement8 - | Elements::Decrement16 - | Elements::Decrement32 - | Elements::Decrement64 => "Decrement an integer by one and return the borrow bit.", - Elements::DivMod8 - | Elements::DivMod16 - | Elements::DivMod32 - | Elements::DivMod64 => "Divide the first integer by the second integer, and return the remainder.", - Elements::DivMod128_64 => r#"Divide the 128-bit integer `a` by the 64-bit integer `b`. -Return a tuple of the quotient `q` and the remainer `r`. - -Use this jet to recursively define wide integer divisions. - -## Preconditions -1. `q` < 2^64 -2. 2^63 ≤ `b` - -Return `(u64::MAX, u64::MAX)` when the preconditions are not satisfied."#, - Elements::Divide8 - | Elements::Divide16 - | Elements::Divide32 - | Elements::Divide64 => "Divide the first integer by the second integer.", - Elements::Divides8 - | Elements::Divides16 - | Elements::Divides32 - | Elements::Divides64 => "Check if the first integer is divisible by the second integer.", - Elements::FullAdd8 - | Elements::FullAdd16 - | Elements::FullAdd32 - | Elements::FullAdd64 => "Add two integers. Take a carry-in and return a carry-out.", - Elements::FullDecrement8 - | Elements::FullDecrement16 - | Elements::FullDecrement32 - | Elements::FullDecrement64 => "Decrement an integer by one. Take a borrow-in and return a borrow-out.", - Elements::FullIncrement8 - | Elements::FullIncrement16 - | Elements::FullIncrement32 - | Elements::FullIncrement64 => "Increment an integer by one. Take a carry-in and return a carry-out.", - Elements::FullMultiply8 - | Elements::FullMultiply16 - | Elements::FullMultiply32 - | Elements::FullMultiply64 => "Helper for multiplying integers. Take the product of the first pair of integers and add the sum of the second pair.", - Elements::FullSubtract8 - | Elements::FullSubtract16 - | Elements::FullSubtract32 - | Elements::FullSubtract64 => "Subtract the second integer from the first integer. Take a borrow-in and return a borrow-out.", - Elements::Increment8 - | Elements::Increment16 - | Elements::Increment32 - | Elements::Increment64 => "Increment an integer by one and return the carry.", - Elements::IsOne8 - | Elements::IsOne16 - | Elements::IsOne32 - | Elements::IsOne64 => "Check if an integer is one.", - Elements::IsZero8 - | Elements::IsZero16 - | Elements::IsZero32 - | Elements::IsZero64 => "Check if an integer is zero.", - Elements::Le8 - | Elements::Le16 - | Elements::Le32 - | Elements::Le64 => "Check if an integer is less than or equal to another integer.", - Elements::Lt8 - | Elements::Lt16 - | Elements::Lt32 - | Elements::Lt64 => "Check if an integer is less than another integer.", - Elements::Max8 - | Elements::Max16 - | Elements::Max32 - | Elements::Max64 => "Return the bigger of two integers.", - Elements::Median8 - | Elements::Median16 - | Elements::Median32 - | Elements::Median64 => "Return the median of three integers.", - Elements::Min8 - | Elements::Min16 - | Elements::Min32 - | Elements::Min64 => "Return the smaller of two integers.", - Elements::Modulo8 - |Elements::Modulo16 - |Elements::Modulo32 - |Elements::Modulo64 => "Compute the remainder after dividing both integers.", - Elements::Multiply8 => "Multiply two integers. The output is a 16-bit integer.", - Elements::Multiply16 => "Multiply two integers. The output is a 32-bit integer.", - Elements::Multiply32 => "Multiply two integers. The output is a 64-bit integer.", - Elements::Multiply64 => "Multiply two integers. The output is a 128-bit integer.", - Elements::Negate8 => "Negate the integer (modulo 2⁸) and return the borrow bit.", - Elements::Negate16 => "Negate the integer (modulo 2¹⁶) and return the borrow bit.", - Elements::Negate32 => "Negate the integer (modulo 2³²) and return the borrow bit.", - Elements::Negate64 => "Negate the integer (modulo 2⁶⁴) and return the borrow bit.", - Elements::One8 => "Return 1 as an 8-bit integer.", - Elements::One16 => "Return 1 as a 16-bit integer.", - Elements::One32 => "Return 1 as a 32-bit integer.", - Elements::One64 => "Return 1 as a 64-bit integer.", - Elements::Subtract8 - | Elements::Subtract16 - | Elements::Subtract32 - | Elements::Subtract64 => "Subtract the second integer from the first integer, and return the borrow bit.", - // Hash functions - Elements::Sha256Block => "Update the given 256-bit midstate by running the SHA256 block compression function, using the given 512-bit block.", - Elements::Sha256Ctx8Add1 => "Add 1 byte to the SHA256 hash engine.", - Elements::Sha256Ctx8Add2 => "Add 2 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add4 => "Add 4 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add8 => "Add 8 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add16 => "Add 16 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add32 => "Add 32 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add64 => "Add 64 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add128 => "Add 128 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add256 => "Add 256 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Add512 => "Add 512 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8AddBuffer511 => "Add a list of less than 512 bytes to the SHA256 hash engine.", - Elements::Sha256Ctx8Finalize => "Produce a hash from the current state of the SHA256 hash engine.", - Elements::Sha256Ctx8Init => "Initialize a default SHA256 hash engine.", - Elements::Sha256Iv => "Return the SHA256 initial value.", - // Elliptic curve functions - Elements::Decompress => r#"Decompress a point into affine coordinates. - -- Return `None` if the x-coordinate is not on the curve. -- Return `Some(ge)` even if the x-coordinate is not normalized."#, - Elements::FeAdd => "Add two field elements.", - Elements::FeInvert => "Compute the modular inverse of a field element.", - Elements::FeIsOdd => "Check if the canonical representative of the field element is odd.", - Elements::FeIsZero => "Check if the field element represents zero.", - Elements::FeMultiply => "Multiply two field elements.", - Elements::FeMultiplyBeta => "Multiply a field element by the canonical primitive cube root of unity (beta).", - Elements::FeNegate => "Negate a field element.", - Elements::FeNormalize => "Return the canonical representation of a field element.", - Elements::FeSquare => "Square a field element.", - Elements::FeSquareRoot => "Compute the modular square root of a field element if it exists.", - Elements::GeIsOnCurve - | Elements::GejIsOnCurve => "Check if the given point satisfies the curve equation y² = x³ + 7.", - Elements::GeNegate - | Elements::GejNegate => "Negate a point.", - Elements::GejAdd => "Add two points.", - Elements::GejDouble => "Double a point. If the result is the point at infinity, it is returned in canonical form.", - Elements::GejEquiv => "Check if two points represent the same point.", - Elements::GejGeAdd => "Add two points. If the result is the point at infinity, it is returned in canonical form.", - Elements::GejGeAddEx => "Add two points. Also return the ration of the `a`s z-coordinate and the result's z-coordinate. If the result is the point at infinity, it is returned in canonical form.", - Elements::GejGeEquiv => "Check if two points represent the same point.", - Elements::GejInfinity => "Return the canonical representation of the point at infinity.", - Elements::GejIsInfinity => "Check if the point represents infinity.", - Elements::GejNormalize => "Convert the point into affine coordinates with canonical field representatives. If the result is the point at infinity, it is returned in canonical form.", - Elements::GejRescale => "Change the representatives of a point by multiplying the z-coefficient by the given value.", - Elements::GejXEquiv => "Check if the point represents an affine point with the given x-coordinate.", - Elements::GejYIsOdd => "Check if the point represents an affine point with odd y-coordinate.", - Elements::Generate => "Multiply the generator point with the given scalar.", - Elements::LinearCombination1 => "Compute the linear combination `b * a + c * g` for point `b` and scalars `a` and `c`, where `g` is the generator point.", - Elements::LinearVerify1 => r#"Assert that a point `b` is equal to the linear combination `a.0 * a.1 + a.2 * g`, where `g` is the generator point. - -## Panics -The assertion fails."#, - Elements::PointVerify1 => r#"Assert that a point `b` is equal to the linear combination `a.0 * a.1 + a.2 * g`, where `g` is the generator point. - -## Panics -- The assertion fails. -- Fails if the points cannot be decompressed."#, - Elements::ScalarAdd => "Add two scalars.", - Elements::ScalarInvert => "Compute the modular inverse of a scalar.", - Elements::ScalarIsZero => "Check if the scalar represents zero.", - Elements::ScalarMultiply => "Multiply two scalars.", - Elements::ScalarMultiplyLambda => "Multiply a scalar with the canonical primitive cube of unity (lambda)", - Elements::ScalarNegate => "Negate a scalar.", - Elements::ScalarNormalize => "Return the canonical representation of the scalar.", - Elements::ScalarSquare => "Square a scalar.", - Elements::Scale => "Multiply a point by a scalar.", - Elements::HashToCurve => r#"A cryptographic hash function that results in a point on the secp256k1 curve. - -This matches the hash function used to map asset IDs to asset commitments."#, - Elements::Swu => r#"Algebraically distribute a field element over the secp256k1 curve as defined in -["Indifferentiable Hashing to Barreto-Naehrig Curves" by Pierre-Alain Fouque, Mehdi Tibouchi](https://inria.hal.science/hal-01094321/file/FT12.pdf). - -While this by itself is not a cryptographic hash function, it can be used as a subroutine -in a [`hash_to_curve`] function. However, the distribution only approaches uniformity when it is called twice."#, - // Digital Signatures - Elements::Bip0340Verify => r#"Assert that a Schnorr signature matches a public key and message. - -## Panics -The assertion fails."#, - Elements::CheckSigVerify => r#"Assert that a Schnorr signature matches a public key and message, using a custom sighash mode. - -## Panics -The assertion fails. - -## Safety -This jet should not be used directly."#, - // Bitcoin (without primitives) - Elements::ParseLock => "Parse an integer as a consensus-encoded Bitcoin lock time.", - Elements::ParseSequence => "Parse an integer as a consensus-encoded Bitcoin sequence number.", - Elements::TapdataInit => r#"Create a SHA256 context, initialized with a "TapData" tag."#, - // Signature hash modes - Elements::AnnexHash => r#"Continue a SHA256 hash with an optional hash by appending the following: -- If there is no hash, then the byte `0x00`. -- If there is a hash, then the byte `0x01` followed by the given hash (32 bytes)."#, - Elements::AssetAmountHash => "Continue a SHA256 hash with the serialization of a confidential asset followed by the serialization of a amount.", - Elements::BuildTapbranch => r#"Return the SHA256 hash of the following: -- The hash of the ASCII string `TapBranch/elements` (32 bytes). -- The lexicographically smaller of the two inputs (32 bytes). -- The hash of the ASCII string `TapBranch/elements` again (32 bytes). -- The lexicographically larger of the two inputs (32 bytes). - -This builds a taproot from two branches."#, - Elements::BuildTapleafSimplicity => r#"Return the SHA256 hash of the following: -- The hash of the ASCII string `TapLeaf/elements` (32 bytes). -- The hash of the ASCII string `TapLeaf/elements` again (32 bytes). -- The Simplicity leaf version `0xbe` (1 byte). -- The byte `0x20` (1 byte). -- The input CMR (32 bytes). - -This builds a tapleaf hash for a Simplicity program."#, - Elements::BuildTaptweak => r#"Implementation of `taproot_tweak_pubkey` from BIP-0341. - -## Panics -1. The input x-only public key is off curve or exceeds the field size. -2. The internal hash value `t` exceeds the secp256k1 group order. -3. The generated tweaked point is infinity, and thus has no valid x-only public key. - -Note that situations 2 and 3 are cryptographically impossible to occur."#, - Elements::InputAmountsHash => "Return the SHA256 hash of the serialization of each input UTXO's asset and amount fields.", - Elements::InputAnnexesHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- If the input has no annex, or isn't a taproot spend, then the byte `0x00`. -- If the input has an annex, then the byte `0x01` followed by the SHA256 hash of the annex (32 bytes)."#, - Elements::InputOutpointsHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- If the input is not a pegin, then the byte `0x00`. -- If the input is a pegin, then the byte `0x01` followed by the parent chain's genesis hash (32 bytes). -- The input's serialized previous transaction id (32 bytes). -- The input's previous transaction index in big endian format (4 bytes). - -IMPORTANT: the index is serialized in big endian format rather than little endian format."#, - Elements::InputScriptSigsHash => r#"Return the SHA256 hash of the concatenation of the SHA256 hash of each input's scriptSig. - -Note that if an input's UTXO uses segwit, then it's scriptSig will necessarily be the empty string. In -such cases we still use the SHA256 hash of the empty string."#, - Elements::InputScriptsHash => "Return the SHA256 hash of the concatenation of the SHA256 hash of each input UTXO's scriptPubKey.", - Elements::InputSequencesHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- The input's sequence number in big endian format (4 bytes). - -IMPORTANT, the sequence number is serialized in big endian format rather than little endian format."#, - Elements::InputUtxoHash => r#"Return the SHA256 hash of the following: -- The serialization of the input UTXO's asset and amount fields. -- The SHA256 hash of the input UTXO's scriptPubKey. - -Return `None` if the input does not exist."#, - Elements::InputUtxosHash => r#"Return the SHA256 hash of the following: -- The result of [`input_amounts_hash`] (32 bytes). -- The result of [`input_scripts_hash`] (32 bytes)."#, - Elements::InputHash => r#"Return the SHA256 hash of the following: -- If the input is not a pegin, then the byte `0x00`. -- If the input is a pegin, then the byte `0x01` followed by the parent chain's genesis hash (32 bytes). -- The input's serialized previous transaction id (32 bytes). -- The input's previous transaction index in big endian format (4 bytes). -- The input's sequence number in big endian format (4 bytes). -- If the input has no annex, or isn't a taproot spend, then the byte `0x00`. -- If the input has an annex, then the byte `0x01` followed by the SHA256 hash of the annex (32 bytes). - -Return `None` if the input does not exist."#, - Elements::InputsHash => r#"Return the SHA256 hash of the following: -- The result of [`input_outpoints_hash`] (32 bytes). -- The result of [`input_sequences_hash`] (32 bytes). -- The result of [`input_annexes_hash`] (32 bytes)."#, - Elements::IssuanceAssetAmountsHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- If the input has no issuance then two bytes `0x00 0x00`. -- If the input is has a new issuance then the byte `0x01` followed by a serialization of the calculated issued -asset id (32 bytes) followed by the serialization of the (possibly confidential) issued asset amount (9 -bytes or 33 bytes). -- If the input is has a reissuance then the byte `0x01` followed by a serialization of the issued asset id -(32 bytes), followed by the serialization of the (possibly confidential) issued asset amount (9 bytes or -33 bytes). - -IMPORTANT: If there is an issuance but there are no asset issued (i.e. the amount is null) we serialize -the vase as the explicit 0 amount, (i.e. `0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00`). - -Note, the issuance asset id is serialized in the same format as an explicit asset id would be."#, - Elements::IssuanceBlindingEntropyHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- If the input has no issuance then the byte `0x00`. -- If the input is has a new issuance then the byte `0x01` followed by 32 `0x00` bytes and the new issuance's -contract hash field (32 bytes). -- If the input is has reissuance then the byte `0x01` followed by a serializaiton of the reissuance's blinding -nonce field (32 bytes) and the reissuance's entropy field (32 bytes). - -Note that if the issuance is a new issuance then the blinding nonce field is 32 `0x00` bytes and new issuance's -contract hash."#, - Elements::IssuanceRangeProofsHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- The SHA256 hash of the range proof of the input's issuance asset amount (32 bytes). -- The SHA256 hash of the range proof of the input's issuance token amount (32 bytes). - -Note that each the range proof is considered to be the empty string in the case there is no issuance, or if the -asset or token amount doesn't exist (i.e is null). The SHA256 hash of the empty string is still used in these -cases."#, - Elements::IssuanceTokenAmountsHash => r#"Return the SHA256 hash of the concatenation of the following for every input: -- If the input has no issuance then two bytes `0x00 0x00`. -- If the input is has a new issuance then the byte `0x01` followed by a serialization of the calculated issued -token id (32 bytes) followed by the serialization of the (possibly confidential) issued token amount (9 -bytes or 33 bytes). -- If the input is has a reissuance then the byte `0x01` followed by a serialization of the issued token id -(32 bytes), followed by the serialization of the explicit 0 amount (i.e `0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00`) (9 bytes). - -IMPORTANT: If there is an issuance but there are no tokens issued (i.e. the amount is null) we serialize -the vase as the explicit 0 amount, (i.e. `0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00`). - -Note, the issuance token id is serialized in the same format as an explicit asset id would be."#, - Elements::IssuanceHash => r#"Return the SHA256 hash of the following: -1. The asset issuance: - - If the input has no issuance then two bytes `0x00 0x00`. - - If the input is has a new issuance then the byte `0x01` followed by a serialization of the calculated issued - asset id (32 bytes) followed by the serialization of the (possibly confidential) issued asset amount (9 bytes or 33 bytes). - - If the input is has a reissuance then the byte `0x01` followed by a serialization of the issued asset id - (32 bytes), followed by the serialization of the (possibly confidential) issued asset amount (9 bytes or 33 bytes). -2. The token issuance: - - If the input has no issuance then two bytes `0x00 0x00`. - - If the input is has a new issuance then the byte `0x01` followed by a serialization of the calculated issued - token id (32 bytes) followed by the serialization of the (possibly confidential) issued token amount (9 bytes or 33 bytes). - - If the input is has a reissuance then the byte `0x01` followed by a serialization of the issued token id (32 bytes), - followed by the serialization of the explicit 0 amount (i.e `0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00`) (9 bytes). -3. The range proofs: - - The SHA256 hash of the range proof of the input's issuance asset amount (32 bytes). - - The SHA256 hash of the range proof of the input's issuance token amount (32 bytes). -4. The blinding entropy: - - If the input has no issuance then the byte `0x00`. - - If the input is has a new issuance then the byte `0x01` followed by 32 `0x00` bytes and the new issuance's - contract hash field (32 bytes). - - If the input is has reissuance then the byte `0x01` followed by a serializaiton of the reissuance's blinding - nonce field (32 bytes) and the reissuance's entropy field (32 bytes). - -Return `None` if the input does not exist."#, - Elements::IssuancesHash => r#"Return the SHA256 hash of the following: -- The result of [`issuance_asset_amounts_hash`] (32 bytes). -- The result of [`issuance_token_amounts_hash`] (32 bytes). -- The result of [`issuance_range_proofs_hash`] (32 bytes). -- The result of [`issuance_blinding_entropy_hash`] (32 bytes)."#, - Elements::NonceHash => "Continue the SHA256 hash with the serialization of an optional nonce.", - Elements::OutpointHash => r#"Continue the SHA256 hash with an optional pegin and an outpoint by appending the following: -- If the input is not a pegin, then the byte `0x00`. -- If the input is a pegin, then the byte `0x01` followed by the given parent genesis hash (32 bytes). -- The input's previous transaction id (32 bytes). -- The input's previous transaction index in big endian format (4 bytes)."#, - Elements::OutputAmountsHash => "Return the SHA256 hash of the serialization of each output's asset and amount fields.", - Elements::OutputNoncesHash => "Return the SHA256 hash of the serialization of each output's nonce field.", - Elements::OutputRangeProofsHash => r#"Return the SHA256 hash of the concatenation of the SHA256 hash of each output's range proof. - -Note that if the output's amount is explicit then the range proof is considered the empty string."#, - Elements::OutputScriptsHash => "Return the SHA256 hash of the concatenation of the SHA256 hash of each output's scriptPubKey.", - Elements::OutputSurjectionProofsHash => r#"Return the SHA256 hash of the concatenation of the SHA256 hash of each output's surjection proof. - -Note that if the output's asset is explicit then the surjection proof is considered the empty string."#, - Elements::OutputHash => r#"Return the SHA256 hash of the following: -- The serialization of the output's asset and amount fields. -- The serialization of the output's nonce field. -- The SHA256 hash of the output's scriptPubKey. -- The SHA256 hash of the output's range proof. - -Return `None` if the output does not exist. - -Note: the result of [`output_surjection_proofs_hash`] is specifically excluded because surjection proofs are dependent on the inputs as well as the output."#, - Elements::OutputsHash => r#"Return the SHA256 hash of the following: -- The result of [`output_amounts_hash`] (32 bytes). -- The result of [`output_nonces_hash`] (32 bytes). -- The result of [`output_scripts_hash`] (32 bytes). -- The result of [`output_range_proofs_hash`] (32 bytes). - -Note: the result of [`output_surjection_proofs_hash`] is specifically excluded because surjection proofs are dependent on the inputs as well as the output. See also [`tx_hash`]."#, - Elements::SigAllHash => r#"Return the SHA256 hash of the following: -- The result of [`genesis_block_hash`] (32 bytes). -- The result of [`genesis_block_hash`] again (32 bytes). -- The result of [`tx_hash`] (32 bytes). -- The result of [`tap_env_hash`] (32 bytes). -- The result of [`current_index`] (Note: this is in big endian format) (4 bytes). - -Note: the two copies of the [`genesis_block_hash`] values effectively makes this result a BIP-340 style tagged hash."#, - Elements::TapEnvHash => r#"Return the SHA256 hash of the following: -- The result of [`tapleaf_hash`] (32 bytes). -- The result of [`tappath_hash`] (32 bytes). -- The result of [`internal_key`] (32 bytes)."#, - Elements::TapleafHash => r#"Return the SHA256 hash of the following: -- The hash of the ASCII string `TapLeaf/elements` (32 bytes). -- The hash of the ASCII string `TapLeaf/elements` again (32 bytes). -- The result of [`tapleaf_version`] (1 byte). -- The byte `0x20` (1 byte). -- The result of [`script_cmr`] (32 bytes). - -Note: this matches Element's modified BIP-0341 definition of tapleaf hash."#, - Elements::TappathHash => r#"Return a hash of the current input's control block excluding the leaf version and the taproot internal key. - -Using the notation of BIP-0341, it returns the SHA256 hash of c[33: 33 + 32m]."#, - Elements::TxHash => r#"Return the SHA256 hash of the following: -- The result of [`version`] (Note: this is in big endian format) (4 bytes). -- The result of [`tx_lock_time`] (Note: this is in big endian format) (4 bytes). -- The result of [`inputs_hash`] (32 bytes). -- The result of [`outputs_hash`] (32 bytes). -- The result of [`issuances_hash`] (32 bytes). -- The result of [`output_surjection_proofs_hash`] (32 bytes). -- The result of [`input_utxos_hash`] (32 bytes)."#, - // Time locks - Elements::CheckLockDistance => r#"Assert that the value returned by [`tx_lock_distance`] is greater than or equal to the given value. - -## Panics -The assertion fails."#, - Elements::CheckLockDuration => r#"Assert that the value returned by [`tx_lock_duration`] is greater than or equal to the given value. - -## Panics -The assertion fails"#, - Elements::CheckLockHeight => r#"Assert that the value returned by [`tx_lock_height`] is greater than or equal to the given value. - -## Panics -The assertion fails."#, - Elements::CheckLockTime => r#"Assert that the value returned by [`tx_lock_time`] is greater than or equal to the given value. - -## Panics -The assertion fails."#, - Elements::TxIsFinal => "Check if the sequence numbers of all transaction inputs are at their maximum value.", - Elements::TxLockDistance => "If [`version`] returns 2 or greater, then return the greatest valid [`Distance`] value of any transaction input. Return zeroes otherwise.", - Elements::TxLockDuration => "If [`version`] returns 2 or greater, then return the greatest valid [`Duration`] value of any transaction input. Return zeroes otherwise.", - Elements::TxLockHeight => "If [`tx_is_final`] returns false, then try to parse the transaction's lock time as a [`Height`] value. Return zeroes otherwise.", - Elements::TxLockTime => "If [`tx_is_final`] returns false, then try to parse the transaction's lock time as a [`Time`] value. Return zeroes otherwise.", - // Issuance - Elements::CalculateAsset => "Calculate the issued asset id from a given entropy value.", - Elements::CalculateConfidentialToken => "Calculate the reissuance token id from a given entropy value for assets with confidential issued amounts.", - Elements::CalculateExplicitToken => "Calculate the reissuance token id from a given entropy value for assets with explicit issued amounts.", - Elements::CalculateIssuanceEntropy => r#"Calculate the entropy value from a given outpoint and contract hash. - -This entropy value is used to compute issued asset and token IDs."#, - Elements::Issuance => r#"Return the kind of issuance of the input at the given index: -- Return `Some(Some(false))` if the input has new issuance. -- Return `Some(Some(true))` if the input as reissuance. -- Return `Some(None)` if the input has no issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceAsset => r#"Return the ID of the issued asset of the input at the given index: -- Return `Some(Some(x))` if the input has issuance with asset id `x`. -- Return `Some(None)` if the input has no issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceEntropy => r#"Return the issuance entropy of the input at the given index: -- Return `Some(Some(x))` if the input has reissuance with entropy `x` or if there is new issuance whose computed entropy is `x`. -- Return `Some(Some(x))` if the input has no issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceToken => r#"Return the reissuance token of the input at the given index: -- Return `Some(Some(x))` if the input has issuance with the reissuance token ID `x`. -- Return `Some(None)` if the input has no issuance. -- Return `None` if the input does not exist."#, - Elements::LbtcAsset => "Return the asset for Liquid Bitcoin.", - // Transaction - Elements::CurrentAmount => "Return the [`input_amount`] at the [`current_index`].", - Elements::CurrentAnnexHash => "Return the [`input_annex_hash`] at th [`current_index`].", - Elements::CurrentAsset => "Return the [`input_asset`] at the [`current_index`].", - Elements::CurrentIndex => "Return the index of the current txin.", - Elements::CurrentIssuanceAssetAmount => "Return the [`issuance_asset_amount`] at the [`current_index`].", - Elements::CurrentIssuanceAssetProof => "Return the [`issuance_asset_proof`] at the [`current_index`].", - Elements::CurrentIssuanceTokenAmount => "Return the [`issuance_token_amount`] at the [`current_index`].", - Elements::CurrentIssuanceTokenProof => "Return the [`issuance_token_proof`] at the [`current_index`].", - Elements::CurrentNewIssuanceContract => "Return the [`new_issuance_contract`] at the [`current_index`].", - Elements::CurrentPegin => "Return the [`input_pegin`] at the [`current_index`].", - Elements::CurrentPrevOutpoint => "Return the previous outpoint of the current txin.", - Elements::CurrentReissuanceBlinding => "Return the [`reissuance_blinding`] at the [`current_index`].", - Elements::CurrentReissuanceEntropy => "Return the [`reissuance_entropy`] at the [`current_index`].", - Elements::CurrentScriptHash => "Return the SHA256 hash of the scriptPubKey of the UTXO of the current txin.", - Elements::CurrentScriptSigHash => r#"Return the SHA256 hash of the scriptSig of the current txin. - -SegWit UTXOs enforce scriptSig to be the empty string. In such cases, we return the SHA256 hash of the empty string."#, - Elements::CurrentSequence => r#"Return the nSequence of the current txin. - -Use this jet to obtain the raw, encoded sequence number. -Use [`tx_lock_distance`] to obtain a relative block height, or [`tx_lock_duration`] to obtain a relative UNIX timestamp, in a safe manner."#, - Elements::GenesisBlockHash => "Return the SHA256 hash of the genesis block.", - Elements::InputAmount => r#"Return the asset id and the asset amount at the given input index. - -Return `None` if the input does not exist."#, - Elements::InputAnnexHash => r#"Return the SHA256 hash of the annex at the given input: -- Return `Some(Some(x))` if the input has an annex that hashes to `x`. -- Return `Some(None`) if the input has no annex. -- Return `None` if the input does not exist."#, - Elements::InputAsset => r#"Return the asset id of the input at the given index. - -Return `None` if the input does not exist."#, - Elements::InputPegin => r#"Return the parent genesis block hash if the input at the given index is a peg-in. - -- Return `Some(None)` if the input is not a peg-in. -- Return `None` if the input does not exist."#, - Elements::InputPrevOutpoint => r#"Return the previous outpoint of the input at the given index. - -Return `None` if the input does not exist."#, - Elements::InputScriptHash => r#"Return the SHA256 hash of the scriptPubKey of the UTXO of the input at the given index. - -Return `None` if the input does not exist."#, - Elements::InputScriptSigHash => r#"Return the SHA256 hash of the scriptSigKey of the input at the given index. - -Return `None` if the input does not exist. - -SegWit UTXOs enforce scriptSig to be the empty string. In such cases, we return the SHA256 hash of the empty string."#, - Elements::InputSequence => r#"Return the nSequence of the input at the given index. - -Return `None` if the input does not exist."#, - Elements::InternalKey => r#"Return the internal key of the current input. - -We assume that Simplicity can be spent in Taproot outputs only, so there always exists an internal key."#, - Elements::IssuanceAssetAmount => r#"Return the possibly confidential amount of the issuance if the input at the given index has an issuance. - -- Return `Some(None)` if the input does not have an issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceAssetProof => r#"Return the SHA256 hash of the range proof for the amount of the issuance at the given input index. - -- Return the hash of the empty string if the input does not have an issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceTokenAmount => r#"Return the possibly confidential amount of the reissuance tokens if the input at the given index has an issuance. - -- Return `Some(Some(Right(0)))` if the input is itself a reissuance. -- Return `Some(None)` if the input does not have an issuance. -- Return `None` if the input does not exist."#, - Elements::IssuanceTokenProof => r#"Return the SHA256 hash of the range proof for the amount of the reissuance tokens at the given input index. - -- Return the hash of the empty string if the input does not have an issuance. -- Return `None` if the input does not exist."#, - Elements::LockTime => "Return the lock time of the transaction.", - Elements::NewIssuanceContract => r#"Return the contract hash for the new issuance at the given input index. - -- Return `Some(None)` if the input does not have a new issuance. -- Return `None` if the input does not exist."#, - Elements::NumInputs => "Return the number of inputs of the transaction.", - Elements::NumOutputs => "Return the number of outputs of the transaction.", - Elements::OutputAmount => r#"Return the asset amount of the output at the given index. - -Return `None` if the output does not exist."#, - Elements::OutputAsset => r#"Return the asset id of the output at the given index. - -Return `None` if the output does not exist."#, - Elements::OutputIsFee => r#"Check if the output at the given index is a fee output. - -Return `None` if the output does not exist."#, - Elements::OutputNonce => r#"Return the nonce of the output at the given index. - -- Return `Some(None)` if the output does not have a nonce. -- Return `None` if the output does not exist."#, - Elements::OutputNullDatum => r#"Return the `b`-th entry of a null data (`OP_RETURN`) output at index `a`. - -- Return `Some(Some(Right(Right(x-1))))` if the entry is `OP_x` for `x` in the range 1..=16. -- Return `Some(Some(Right(Left(0))))` if the entry is `OP_1NEGATE`. -- Return `Some(Some(Right(Left(1))))` if the entry is `OP_RESERVED`. -- Return `Some(Some(Left((x, hash))))` if the entry is pushed data. `hash` is the SHA256 hash of the data pushed and `x` indicates how the data was pushed: - - `x == 0` means the push was an immediate 0 to 75 bytes. - - `x == 1` means the push was an `OP_PUSHDATA1`. - - `x == 2` means the push was an `OP_PUSHDATA2`. - - `x == 3` means the push was an `OP_PUSHDATA4`. -- Return `Some(None)` if the null data has fewer than `b` entries. -- Return `None` if the output is not a null data output. - -Use this jet to read peg-out data from an output."#, - Elements::OutputRangeProof => r#"Return the SHA256 hash of the range proof of the output at the given index. - -Return `None` if the output does not exist."#, - Elements::OutputScriptHash => r#"Return the SHA256 hash of the scriptPubKey of the output at the given index. - -Return `None` if the output does not exist."#, - Elements::OutputSurjectionProof => r#"Return the SHA256 hash of the surjection proof of the output at the given index. - -Return `None` if the output does not exist."#, - Elements::ReissuanceBlinding => r#"Return the blinding factor used for the reissuance at the given input index. - -- Return `Some(None)` if the input does not have a reissuance. -- Return `None` if the input does not exist."#, - Elements::ReissuanceEntropy => r#"Return the entropy used for the reissuance at the given input index. - -- Return `Some(None)` if the input does not have a reissuance. -- Return `None` if the input does not exist."#, - Elements::ScriptCMR => r#"Return the CMR of the Simplicity program in the current input. - -This is the CMR of the currently executed Simplicity program."#, - Elements::TapleafVersion => r#"Return the tap leaf version of the current input. - -We assume that Simplicity can be spent in Taproot outputs only, so there always exists a tap leaf."#, - Elements::Tappath => r#"Return the SHA256 hash of the tap path of the current input. - -We assume that Simplicity can be spent in Taproot outputs only, so there always exists a tap path."#, - Elements::TotalFee => r#"Return the total amount of fees paid to the given asset id. - -Return zero for any asset without fees."#, - Elements::TransactionId => "Return the transaction ID.", - Elements::Version => "Return the version number of the transaction.", - } -} diff --git a/lsp/src/completion/mod.rs b/lsp/src/completion/mod.rs deleted file mode 100644 index 069b33ef..00000000 --- a/lsp/src/completion/mod.rs +++ /dev/null @@ -1,183 +0,0 @@ -use simplicityhl::parse::Function; - -pub mod builtin; -pub mod jet; -pub mod tokens; -pub mod type_cast; -pub mod types; - -use tower_lsp_server::lsp_types::{ - CompletionItem, CompletionItemKind, Documentation, InsertTextFormat, MarkupContent, MarkupKind, -}; - -use tokens::parse; -use tokens::CompletionType; - -/// Build and provide [`CompletionItem`] for jets and builtin functions. -#[derive(Debug)] -pub struct CompletionProvider { - /// All jets completions. - jets: Vec, - - /// All builtin functions completions. - builtin: Vec, - - /// Modules completions. - modules: Vec, - - /// Default Type cast completions. - type_casts: Vec, -} - -impl CompletionProvider { - /// Create new [`CompletionProvider`] with evaluated jets and builtins completions. - pub fn new() -> Self { - let jets_completion = jet::get_jets_completions() - .iter() - .map(template_to_completion) - .collect(); - let builtin_completion = builtin::get_builtin_functions() - .iter() - .map(template_to_completion) - .collect(); - - let modules_completion = [ - ("jet", "Module which contains jets"), - ("param", "Module which contains parameters"), - ("witness", "Module which contains witnesses"), - ] - .iter() - .map(|(module, detail)| module_to_completion((*module).to_string(), (*detail).to_string())) - .collect(); - - let type_casts_completion = type_cast::TYPE_CASTS - .iter() - .map(|(&to, &from)| CompletionItem { - label: format!("{to} <- {from}"), - kind: Some(CompletionItemKind::FUNCTION), - detail: Some(format!("Cast into type `{to}`",)), - documentation: None, - insert_text: Some(format!("{from}>::into(${{1:{from}}})")), - insert_text_format: Some(InsertTextFormat::SNIPPET), - ..Default::default() - }) - .collect::>(); - - Self { - jets: jets_completion, - builtin: builtin_completion, - modules: modules_completion, - type_casts: type_casts_completion, - } - } - - /// Get generic functions completions. - pub fn get_function_completions(functions: &[(&Function, &str)]) -> Vec { - functions - .iter() - .map(|(func, doc)| { - let template = function_to_template(func, doc); - template_to_completion(&template) - }) - .collect() - } - - /// Return completions based on line and functions provided. - pub fn process_completions( - &self, - prefix: &str, - functions: &[(&Function, &str)], - ) -> Option> { - let completion_type = parse(prefix)?; - - match completion_type { - CompletionType::Jet => Some(self.jets.clone()), - - CompletionType::Assignment(type_name) => { - let to = type_name.as_str(); - - if let Some(from) = type_cast::TYPE_CASTS.get(to) { - return Some(vec![CompletionItem { - label: format!("{to} <- {from}"), - kind: Some(CompletionItemKind::FUNCTION), - detail: Some(format!("Cast into type `{to}`",)), - documentation: None, - insert_text: Some(format!("{from}>::into(${{1:{from}}})")), - insert_text_format: Some(InsertTextFormat::SNIPPET), - ..Default::default() - }]); - } - Some(self.type_casts.clone()) - } - - CompletionType::ClosingType => Some(vec![CompletionItem { - label: "into".to_string(), - kind: Some(CompletionItemKind::FUNCTION), - detail: Some("Cast into type".to_string()), - documentation: None, - insert_text: Some("into(${1:type})".to_string()), - insert_text_format: Some(InsertTextFormat::SNIPPET), - ..Default::default() - }]), - - CompletionType::NonCompletionSymbol => None, - - _ => { - let mut completions = CompletionProvider::get_function_completions(functions); - - completions.extend_from_slice(&self.builtin); - completions.extend_from_slice(&self.modules); - - Some(completions) - } - } - } -} - -/// Convert [`simplicityhl::parse::Function`] to [`types::FunctionTemplate`]. -pub fn function_to_template(func: &Function, doc: &str) -> types::FunctionTemplate { - types::FunctionTemplate::simple( - func.name().to_string(), - func.params().iter().map(|item| format!("{item}")).collect(), - match func.ret() { - Some(ret) => format!("{ret}"), - None => "()".to_string(), - }, - doc, - ) -} - -/// Convert [`types::FunctionTemplate`] to [`CompletionItem`]. -fn template_to_completion(func: &types::FunctionTemplate) -> CompletionItem { - CompletionItem { - label: func.display_name.clone(), - // Because `into` has different structure, completion with CompletionItemKind::FUNCTION - // have strange visual effects, so we use CompletionItemKind::SNIPPET - kind: Some(if func.display_name == "into" { - CompletionItemKind::SNIPPET - } else { - CompletionItemKind::FUNCTION - }), - detail: Some(func.get_signature()), - documentation: Some(Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: func.description.clone(), - })), - insert_text: Some(func.get_insert_text()), - insert_text_format: Some(InsertTextFormat::SNIPPET), - ..Default::default() - } -} - -/// Convert module name to [`CompletionItem`]. -fn module_to_completion(module: String, detail: String) -> CompletionItem { - CompletionItem { - label: module.clone(), - kind: Some(CompletionItemKind::MODULE), - detail: Some(detail), - documentation: None, - insert_text: Some(module), - insert_text_format: Some(InsertTextFormat::PLAIN_TEXT), - ..Default::default() - } -} diff --git a/lsp/src/completion/tokens.rs b/lsp/src/completion/tokens.rs deleted file mode 100644 index 4773c6b4..00000000 --- a/lsp/src/completion/tokens.rs +++ /dev/null @@ -1,243 +0,0 @@ -use nom::{ - branch::alt, - bytes::complete::{tag, take_while}, - character::complete::{alpha1, alphanumeric1, digit0, multispace0, none_of, one_of}, - combinator::{map, opt, recognize, value}, - multi::{many0, many0_count, separated_list0}, - sequence::{delimited, pair, preceded, separated_pair}, - IResult, Parser, -}; - -#[derive(Debug, PartialEq, Clone)] -/// Enum that indicates which completion strategy to use. -pub enum CompletionType { - NonCompletionSymbol, - OtherSymbol, - Jet, - Assignment(String), - Identifier(String), - ClosingType, -} - -/// Parses single characters acting as triggers. As we define '<' and ':' as symbols for completion -/// inside server capabilities, we don't want to trigger completion every time these symbols are pressed. -fn parse_symbol(input: &str) -> IResult<&str, CompletionType> { - let mut parser = alt(( - value(CompletionType::NonCompletionSymbol, one_of("<:")), - value(CompletionType::OtherSymbol, none_of("<:")), - )); - - parser.parse(input) -} - -/// Parses the specific `jet::` namespace token, optionally followed by an identifier for the correct -/// completion trigger. -fn parse_jet(input: &str) -> IResult<&str, CompletionType> { - let mut parser = value( - CompletionType::Jet, - recognize(pair( - tag("jet::"), - opt(take_while(|c: char| c.is_alphanumeric() || c == '_')), - )), - ); - parser.parse(input) -} - -/// Parses standard identifiers consisting of alphanumeric characters and underscores. -fn parse_identifier(input: &str) -> IResult<&str, &str> { - let mut parser = recognize(pair( - alt((alpha1, tag("_"))), - many0_count(alt((alphanumeric1, tag("_")))), - )); - parser.parse(input) -} - -/// Parses a parenthesized, comma-separated list of patterns. -fn parse_tuple(input: &str) -> IResult<&str, &str> { - let mut parser = recognize(delimited( - tag("("), - separated_list0(delimited(multispace0, tag(","), multispace0), parse_pattern), - tag(")"), - )); - - parser.parse(input) -} - -/// Parses a bracketed, comma-separated list of patterns. -fn parse_array(input: &str) -> IResult<&str, &str> { - recognize(delimited( - tag("["), - separated_list0(delimited(multispace0, tag(","), multispace0), parse_pattern), - tag("]"), - )) - .parse(input) -} - -/// Parses a structural pattern which can be a tuple, array, or identifier. -fn parse_pattern(input: &str) -> IResult<&str, &str> { - recognize(alt((parse_tuple, parse_array, parse_identifier))).parse(input) -} - -/// Parses an array type like `[type; number]` -fn parse_type_array(input: &str) -> IResult<&str, &str> { - recognize(delimited( - tag("["), - separated_pair( - parse_pattern, - delimited(multispace0, tag(";"), multispace0), - digit0, - ), - tag("]"), - )) - .parse(input) -} - -/// Parses type for assignment. Almost identical to [`parse_pattern`], but handles arrays -/// differently -fn parse_ty(input: &str) -> IResult<&str, &str> { - recognize(alt((parse_tuple, parse_type_array, parse_identifier))).parse(input) -} - -/// Parses a variable assignment statement ending with a completion trigger '<'. -fn parse_assignment(input: &str) -> IResult<&str, CompletionType> { - let mut parser = map( - ( - preceded(multispace0, tag("let")), - preceded(multispace0, parse_pattern), - preceded(multispace0, tag(":")), - preceded(multispace0, parse_ty), - preceded(multispace0, tag("=")), - preceded(multispace0, tag("<")), - opt(parse_pattern), - ), - |(_, _, _, s, ..)| CompletionType::Assignment(s.to_string()), - ); - - parser.parse(input) -} - -/// Parses the closure of a type cast `>::`, which triggers the 'into' keyword. -fn parse_type_end(input: &str) -> IResult<&str, CompletionType> { - let mut parser = value( - CompletionType::ClosingType, - ( - preceded(multispace0, tag(">")), - preceded(multispace0, tag("::")), - opt(parse_identifier), - ), - ); - - parser.parse(input) -} - -/// Main entry point that parses a sequence of tokens and returns the last significant completion event. -pub fn parse(input: &str) -> Option { - let mut parser = many0(preceded( - multispace0, - alt(( - parse_assignment, - parse_type_end, - parse_jet, - map(parse_identifier, |t| { - CompletionType::Identifier(t.to_owned()) - }), - parse_symbol, - )), - )); - - let output = parser.parse(input); - let Ok(completion) = output else { - return None; - }; - - completion.1.last().cloned() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parse_assignment() { - let input = "let var: u32 = <"; - assert_eq!( - parse(input), - Some(CompletionType::Assignment("u32".to_string())) - ); - } - - #[test] - fn test_parse_assignment_nested_tuples() { - let input = "let (a,b): (u32, (u32, u32)) = <"; - assert_eq!( - parse(input), - Some(CompletionType::Assignment("(u32, (u32, u32))".to_string())) - ); - } - - #[test] - fn test_parse_assignment_nested_arrays() { - let input = "let (a,b): [(u32, u32); 12] = <"; - assert_eq!( - parse(input), - Some(CompletionType::Assignment("[(u32, u32); 12]".to_string())) - ); - } - - #[test] - fn test_parse_jet() { - let input = "other keywords jet::"; - assert_eq!(parse(input), Some(CompletionType::Jet)); - } - - #[test] - fn test_parse_jet_with_identifier() { - let input = "jet::add_32"; - assert_eq!(parse(input), Some(CompletionType::Jet)); - } - - #[test] - fn test_parse_closing_type() { - let input = ">::"; - assert_eq!(parse(input), Some(CompletionType::ClosingType)); - } - - #[test] - fn test_parse_closing_type_with_identifier() { - let input = ">::method"; - assert_eq!(parse(input), Some(CompletionType::ClosingType)); - } - - #[test] - fn test_parse_non_completion_symbol_colon() { - let input = ":"; - assert_eq!(parse(input), Some(CompletionType::NonCompletionSymbol)); - } - - #[test] - fn test_parse_non_completion_symbol_angle() { - let input = "<"; - assert_eq!(parse(input), Some(CompletionType::NonCompletionSymbol)); - } - - #[test] - fn test_parse_other_symbol() { - let input = "some other keywords"; - assert_eq!( - parse(input), - Some(CompletionType::Identifier("keywords".to_owned())) - ); - } - - #[test] - fn test_parse_mixed_sequence() { - let input = "let x: T = < jet::"; - assert_eq!(parse(input), Some(CompletionType::Jet)); - } - - #[test] - fn test_parse_empty() { - let input = ""; - assert_eq!(parse(input), None); - } -} diff --git a/lsp/src/completion/type_cast.rs b/lsp/src/completion/type_cast.rs deleted file mode 100644 index 77bca79d..00000000 --- a/lsp/src/completion/type_cast.rs +++ /dev/null @@ -1,28 +0,0 @@ -use lazy_static::lazy_static; -use std::collections::HashMap; - -// Most basic type casts for integer types. -lazy_static! { - pub(crate) static ref TYPE_CASTS: HashMap<&'static str, &'static str> = { - HashMap::from([ - ("u1", "bool"), - ("u2", "(u1, u1)"), - ("u4", "(u2, u2)"), - ("u8", "(u4, u4)"), - ("u16", "(u8, u8)"), - ("u32", "(u16, u16)"), - ("u64", "(u32, u32)"), - ("u128", "(u64, u64)"), - ("u256", "(u128, u128)"), - ("bool", "u1"), - ("(u1, u1)", "u2"), - ("(u2, u2)", "u4"), - ("(u4, u4)", "u8"), - ("(u8, u8)", "u16"), - ("(u16, u16)", "u32"), - ("(u32, u32)", "u64"), - ("(u64, u64)", "u128"), - ("(u128, u128)", "u256"), - ]) - }; -} diff --git a/lsp/src/completion/types.rs b/lsp/src/completion/types.rs deleted file mode 100644 index 662f792e..00000000 --- a/lsp/src/completion/types.rs +++ /dev/null @@ -1,96 +0,0 @@ -/// Template for all functions -#[derive(Debug, Clone)] -pub struct FunctionTemplate { - /// Display name shown in completion list - pub display_name: String, - /// Generic type parameters to include and use with snippet base - pub generics: Vec, - /// Function arguments - pub args: Vec, - /// Return type - pub return_type: String, - /// Documentation - pub description: String, - /// Snippet to use when completion is triggered - pub snippet: String, -} - -impl FunctionTemplate { - /// Create a template with generics (used only for built-ins) - pub fn new( - display_name: impl Into, - generics: Vec, - args: Vec, - return_type: impl Into, - description: impl Into, - ) -> Self { - let name = display_name.into(); - let snippet = Self::get_snippet_name(&name, &generics); - Self { - display_name: name, - generics, - args, - return_type: return_type.into(), - description: description.into(), - snippet, - } - } - - /// Create a template without generics - pub fn simple( - name: impl Into, - args: Vec, - return_type: impl Into, - description: impl Into, - ) -> Self { - let name = name.into(); - Self::new(name.clone(), vec![], args, return_type, description) - } - - /// Get snippet for function - pub fn get_snippet_name(name: &str, generics: &[String]) -> String { - if generics.is_empty() { - name.to_string() - } else { - format!( - "{}::<{}>", - name, - generics - .iter() - .enumerate() - .map(|(index, item)| { format!("${{{}:{}}}", index + 1, item) }) - .collect::>() - .join(", ") - ) - } - } - - /// Get text, which would inserted when completion triggered - pub fn get_insert_text(&self) -> String { - format!( - "{}({})", - self.snippet, - self.args - .iter() - .enumerate() - .map(|(index, item)| { - format!("${{{}:{}}}", index + 1 + self.generics.len(), item) - }) - .collect::>() - .join(", ") - ) - } - - /// Get signature text for function, which would show in `detail` field - pub fn get_signature(&self) -> String { - format!( - "fn({}) -> {}", - self.args.join(", "), - if self.return_type.is_empty() { - "()".to_string() - } else { - self.return_type.clone() - } - ) - } -} diff --git a/lsp/src/error.rs b/lsp/src/error.rs deleted file mode 100644 index 86c06684..00000000 --- a/lsp/src/error.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::num::TryFromIntError; - -use thiserror::Error; - -use tower_lsp_server::jsonrpc::Error; -use tower_lsp_server::lsp_types::Uri; - -/// Custom error type for LSP server. -#[derive(Debug, Clone, Error)] -pub enum LspError { - /// An error during the conversion of different types. - #[error("Conversion failed: {0}")] - ConversionFailed(String), - - /// An error during the conversion of integer types. - #[error("Conversion failed: {0}")] - IntegerConversionFailed(#[from] TryFromIntError), - - /// Failed to find function inside `functions` map. - #[error("Function not found: {0}")] - FunctionNotFound(String), - - /// Failed to find call inside function. - #[error("Call not found: {0}")] - CallNotFound(String), - - /// Failed to find given document inside `documents` map. - #[error("Document not found: {0:?}")] - DocumentNotFound(Uri), - - /// A generic or unexpected internal error. - #[error("Internal error: {0}")] - Internal(String), -} - -impl LspError { - /// Return error code for error. - /// - /// Error code is needed for [`tower_lsp_server::jsonrpc::Error`] to differentiate errors. It's - /// recommended to use values from 1 to 5000. - pub const fn code(&self) -> i64 { - match self { - LspError::ConversionFailed(_) => 1, - LspError::FunctionNotFound(_) => 2, - LspError::CallNotFound(_) => 3, - LspError::DocumentNotFound(_) => 4, - LspError::IntegerConversionFailed(_) => 5, - LspError::Internal(_) => 100, - } - } -} - -/// Convert [`LspError`] to [`tower_lsp_server::jsonrpc::Error`]. -impl From for Error { - fn from(err: LspError) -> Self { - Error { - code: err.code().into(), - message: err.to_string().into(), - data: None, - } - } -} - -/// Convert [`LspError`] to [`tower_lsp_server::jsonrpc::Error`]. -impl From for LspError { - fn from(err: ropey::Error) -> Self { - LspError::Internal(err.to_string()) - } -} diff --git a/lsp/src/function.rs b/lsp/src/function.rs deleted file mode 100644 index 126a63c9..00000000 --- a/lsp/src/function.rs +++ /dev/null @@ -1,46 +0,0 @@ -use simplicityhl::parse::Function; -use std::collections::HashMap; - -/// Container for parsed functions and their corresponding source text. -#[derive(Debug, Clone)] -pub struct Functions { - /// The map from function name to its parsed representation and source text. - pub map: HashMap, -} - -impl Functions { - /// Creates a new, empty `Functions` structure. - pub fn new() -> Self { - Self { - map: HashMap::new(), - } - } - - /// Inserts or updates a function and its document text. - pub fn insert(&mut self, name: String, func: Function, doc: String) { - self.map.insert(name, (func, doc)); - } - - /// Get pair of function and documentation. - pub fn get(&self, name: &str) -> Option<(&Function, &String)> { - self.map.get(name).map(|(func, doc)| (func, doc)) - } - - /// Retrieves a reference to a parsed function by name. - pub fn get_func(&self, name: &str) -> Option<&Function> { - self.map.get(name).map(|(func, _)| func) - } - - /// Returns a vector of all parsed functions. - pub fn functions(&self) -> Vec<&Function> { - self.map.values().map(|(func, _)| func).collect() - } - - /// Returns a vector of (function name, function) pairs. - pub fn functions_and_docs(&self) -> Vec<(&Function, &str)> { - self.map - .values() - .map(|(func, doc)| (func, doc.as_str())) - .collect() - } -} diff --git a/lsp/src/main.rs b/lsp/src/main.rs deleted file mode 100644 index d73285da..00000000 --- a/lsp/src/main.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![warn(clippy::all, clippy::pedantic)] - -mod backend; -mod completion; -mod error; -mod function; -mod utils; - -use backend::Backend; -use tower_lsp_server::{LspService, Server}; - -#[tokio::main] -async fn main() { - env_logger::init(); - let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); - - let (service, socket) = LspService::new(Backend::new); - Server::new(stdin, stdout, socket).serve(service).await; -} diff --git a/lsp/src/utils.rs b/lsp/src/utils.rs deleted file mode 100644 index 152c6404..00000000 --- a/lsp/src/utils.rs +++ /dev/null @@ -1,607 +0,0 @@ -use miniscript::iter::TreeLike; - -use crate::completion; -use crate::error::LspError; -use ropey::Rope; -use simplicityhl::parse::{self, CallName}; -use tower_lsp_server::lsp_types::{ - self, MarkupContent, MarkupKind, ParameterInformation, ParameterLabel, SignatureInformation, -}; - -pub fn span_contains(a: &simplicityhl::error::Span, b: &simplicityhl::error::Span) -> bool { - a.start <= b.start && a.end >= b.end -} - -/// Convert byte offset to [`lsp_types::Position`]. -/// -/// It's converting to UTF-16 column position because it's default to LSP settings. For more -/// context, see [`lsp_types::PositionEncodingKind`] -pub fn offset_to_position(offset: usize, rope: &Rope) -> Result { - let line = rope.try_byte_to_line(offset)?; - let first_byte_of_line = rope.try_line_to_byte(line)?; - let column = offset - first_byte_of_line; - - let rope_line = rope - .get_line(line) - .ok_or_else(|| LspError::ConversionFailed("Offset to position".to_string()))?; - - let utf16_offset: usize = rope_line - .get_byte_slice(..column) - .ok_or_else(|| LspError::ConversionFailed("Offset to position".to_string()))? - .chars() - .map(char::len_utf16) - .sum(); - - Ok(lsp_types::Position::new( - ::try_from(line)?, - ::try_from(utf16_offset)?, - )) -} - -/// Convert [`lsp_types::Position`] to byte offset. -pub fn position_to_offset(position: lsp_types::Position, rope: &Rope) -> Result { - let line_index = usize::try_from(position.line)?; - let target_utf16 = usize::try_from(position.character)?; - - let line = rope - .get_line(line_index) - .ok_or_else(|| LspError::ConversionFailed("Position to offset".to_string()))?; - - let line_start = rope.try_line_to_byte(line_index)?; - let mut utf16_offset_in_line = 0usize; - let mut byte_offset_in_line = 0usize; - - // LSP positions use UTF-16 code units, but Rope is indexed by UTF-8 bytes. Walk the line - // until we reach the requested UTF-16 boundary so navigation features resolve the right byte. - for ch in line.chars() { - if utf16_offset_in_line == target_utf16 { - return Ok(line_start + byte_offset_in_line); - } - - let ch_utf16 = ch.len_utf16(); - // Reject positions that would land inside a single scalar value encoded as multiple - // UTF-16 code units, because spans can only point at byte boundaries between characters. - if utf16_offset_in_line + ch_utf16 > target_utf16 { - return Err(LspError::ConversionFailed( - "Position points inside a UTF-16 code unit sequence".to_string(), - )); - } - - utf16_offset_in_line += ch_utf16; - byte_offset_in_line += ch.len_utf8(); - } - - // LSP allows the cursor to sit at end-of-line, so accept that exact boundary after the scan. - if utf16_offset_in_line == target_utf16 { - Ok(line_start + byte_offset_in_line) - } else { - Err(LspError::ConversionFailed("Position to offset".to_string())) - } -} - -/// Convert [`simplicityhl::error::Span`] to [`tower_lsp_server::lsp_types::Position`] -/// -/// Converting is required because [`simplicityhl::error::Span`] contains byte offsets instead of -/// `line` and `col` fields. -pub fn span_to_positions( - span: &simplicityhl::error::Span, - rope: &Rope, -) -> Result<(lsp_types::Position, lsp_types::Position), LspError> { - Ok(( - offset_to_position(span.start, rope)?, - offset_to_position(span.end, rope)?, - )) -} - -/// Convert [`tower_lsp_server::lsp_types::Position`] to [`simplicityhl::error::Span`] -/// -/// Useful when [`tower_lsp_server::lsp_types::Position`] represents some singular point. -pub fn position_to_span( - position: lsp_types::Position, - rope: &Rope, -) -> Result { - let start_line = position_to_offset(position, rope)?; - - Ok(simplicityhl::error::Span::new(start_line, start_line)) -} - -/// Get document comments, using lines above given line index. Only used to -/// get documentation for custom functions. -pub fn get_comments_from_lines(line: u32, rope: &Rope) -> String { - let mut lines = Vec::new(); - - if line == 0 { - return String::new(); - } - - for i in (0..line).rev() { - let Some(rope_slice) = rope.get_line(i as usize) else { - break; - }; - let text = rope_slice.to_string(); - - if text.starts_with("///") { - let doc = text - .strip_prefix("///") - .unwrap_or("") - .trim_end() - .to_string(); - lines.push(doc); - } else { - break; - } - } - - lines.reverse(); - - let mut result = String::new(); - let mut prev_line_was_text = false; - - for line in lines { - let trimmed = line.trim(); - - let is_md_block = trimmed.is_empty() - || trimmed.starts_with('#') - || trimmed.starts_with('-') - || trimmed.starts_with('*') - || trimmed.starts_with('>') - || trimmed.starts_with("```") - || trimmed.starts_with(" "); - - if result.is_empty() { - result.push_str(trimmed); - } else if prev_line_was_text && !is_md_block { - result.push(' '); - result.push_str(trimmed); - } else { - result.push('\n'); - result.push_str(trimmed); - } - - prev_line_was_text = !trimmed.is_empty() && !is_md_block; - } - - result -} - -/// Find [`simplicityhl::parse::Call`] which contains given [`simplicityhl::error::Span`], which also have minimal Span. -pub fn find_related_call<'a>( - functions: &'a [&'a parse::Function], - token_span: simplicityhl::error::Span, -) -> Result, LspError> { - let func = functions - .iter() - .find(|func| span_contains(func.span(), &token_span)) - .ok_or(LspError::CallNotFound( - "Span of the call is not inside function.".into(), - ))?; - - let call = parse::ExprTree::Expression(func.body()) - .pre_order_iter() - .filter_map(|expr| { - if let parse::ExprTree::Call(call) = expr { - // Only include if call span can be obtained - Some((call, get_call_span(call))) - } else { - None - } - }) - .filter(|(_, span)| span_contains(span, &token_span)) - .map(|(call, _)| call) - .last(); - - Ok(call) -} - -pub fn find_function_name_range( - function: &parse::Function, - text: &Rope, -) -> Result { - let start_line = offset_to_position(function.span().start, text)?.line; - let Some((line, character)) = - text.lines() - .enumerate() - .skip(start_line as usize) - .find_map(|(i, line)| { - line.to_string() - .find(function.name().as_inner()) - .map(|col| (i, col)) - }) - else { - return Err(LspError::FunctionNotFound(format!( - "Function with name {} not found", - function.name() - ))); - }; - - let func_size = u32::try_from(function.name().as_inner().len()).map_err(LspError::from)?; - - let (line, character) = ( - u32::try_from(line).map_err(LspError::from)?, - u32::try_from(character).map_err(LspError::from)?, - ); - - let (start, end) = ( - lsp_types::Position { line, character }, - lsp_types::Position { - line, - character: character + func_size, - }, - ); - Ok(lsp_types::Range { start, end }) -} - -pub fn get_call_span(call: &simplicityhl::parse::Call) -> simplicityhl::error::Span { - let length = call.name().to_string().len(); - - simplicityhl::error::Span { - start: call.span().start, - end: call.span().start + length, - } -} - -pub fn find_all_references<'a>( - text: &Rope, - functions: &'a [&'a parse::Function], - call_name: &CallName, -) -> Result, LspError> { - functions - .iter() - .flat_map(|func| { - parse::ExprTree::Expression(func.body()) - .pre_order_iter() - .filter_map(|expr| { - if let parse::ExprTree::Call(call) = expr { - Some((call, get_call_span(call))) - } else { - None - } - }) - .filter(|(call, _)| call.name() == call_name) - .map(|(_, span)| span) - .collect::>() - }) - .map(|span| { - let (start, end) = span_to_positions(&span, text)?; - Ok(lsp_types::Range { start, end }) - }) - .collect::, LspError>>() -} - -/// Find the position of a key in the JSON text -pub fn find_key_position(text: &str, key: &str) -> Option { - let search = format!("\"{key}\""); - for (line_num, line) in text.lines().enumerate() { - if let Some(col) = line.find(&search) { - return Some(lsp_types::Position::new( - u32::try_from(line_num).ok()?, - u32::try_from(col).ok()?, - )); - } - } - None -} - -/// Find function call context from the current line. -/// Returns (`function_name`, `active_parameter_index`) if inside a function call. -pub fn find_function_call_context(line: &str) -> Option<(String, u32)> { - let mut paren_depth = 0; - let mut bracket_depth = 0; - let mut angle_depth = 0; - let mut last_open_paren = None; - let mut comma_count = 0; - - // Scan from the end to find the innermost unclosed function call - for (i, ch) in line.chars().rev().enumerate() { - let pos = line.len() - 1 - i; - match ch { - ')' => paren_depth += 1, - '(' => { - if paren_depth > 0 { - paren_depth -= 1; - } else { - // Found unclosed '(' - this is our function call - last_open_paren = Some(pos); - break; - } - } - ']' => bracket_depth += 1, - '[' => { - if bracket_depth > 0 { - bracket_depth -= 1; - } - } - '>' => angle_depth += 1, - '<' => { - if angle_depth > 0 { - angle_depth -= 1; - } - } - ',' if paren_depth == 0 && bracket_depth == 0 && angle_depth == 0 => { - comma_count += 1; - } - _ => {} - } - } - - let open_paren_pos = last_open_paren?; - - // Extract function name before the '(' - let before_paren = &line[..open_paren_pos]; - let func_name = extract_function_name(before_paren)?; - - Some((func_name, comma_count)) -} - -/// Extract function name from text before an opening parenthesis. -/// Handles patterns like: `func_name`, `jet::add_32`, `fold::` -pub fn extract_function_name(text: &str) -> Option { - let trimmed = text.trim_end(); - - // Skip generic parameters if present (e.g., `fold::`) - let without_generics = if trimmed.ends_with('>') { - let mut depth = 0; - let mut start = None; - for (i, ch) in trimmed.chars().rev().enumerate() { - match ch { - '>' => depth += 1, - '<' => { - depth -= 1; - if depth == 0 { - start = Some(trimmed.len() - 1 - i); - break; - } - } - _ => {} - } - } - match start { - Some(pos) => { - let before = &trimmed[..pos]; - // Remove the `::` before `<` if present - before.strip_suffix("::").unwrap_or(before) - } - None => trimmed, - } - } else { - trimmed - }; - - // Now find the function name - it should be an identifier possibly with `::` - let mut name_chars = Vec::new(); - - for ch in without_generics.chars().rev() { - if ch.is_alphanumeric() || ch == '_' || ch == ':' { - name_chars.push(ch); - } else { - break; - } - } - - if name_chars.is_empty() { - return None; - } - - name_chars.reverse(); - let name: String = name_chars.into_iter().collect(); - - // Clean up leading colons - let cleaned = name.trim_start_matches(':'); - if cleaned.is_empty() { - None - } else { - Some(cleaned.to_string()) - } -} - -/// Create `SignatureInformation` from a `FunctionTemplate`. -pub fn create_signature_info( - template: &completion::types::FunctionTemplate, -) -> SignatureInformation { - let params: Vec = template - .args - .iter() - .map(|arg| ParameterInformation { - label: ParameterLabel::Simple(arg.clone()), - documentation: None, - }) - .collect(); - - let signature_label = format!( - "fn {}({}) -> {}", - template.display_name, - template.args.join(", "), - template.return_type - ); - - SignatureInformation { - label: signature_label, - documentation: if template.description.is_empty() { - None - } else { - Some(lsp_types::Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: template.description.clone(), - })) - }, - parameters: Some(params), - active_parameter: None, - } -} - -/// Find signature for builtin functions. -pub fn find_builtin_signature(name: &str) -> Option { - use simplicityhl::str::AliasName; - use simplicityhl::types::AliasedType; - - let ty = AliasedType::from(AliasName::from_str_unchecked("T")); - - // Match common builtin function names - let call_name = match name { - "unwrap_left" => Some(CallName::UnwrapLeft(ty.clone())), - "unwrap_right" => Some(CallName::UnwrapRight(ty.clone())), - "unwrap" => Some(CallName::Unwrap), - "is_none" => Some(CallName::IsNone(ty.clone())), - "assert!" => Some(CallName::Assert), - "panic!" => Some(CallName::Panic), - "dbg!" => Some(CallName::Debug), - _ => None, - }; - - let call_name = call_name?; - let template = completion::builtin::match_callname(&call_name)?; - Some(create_signature_info(&template)) -} - -#[cfg(test)] -mod tests { - use super::*; - use ropey::Rope; - - #[test] - fn test_get_comments_from_lines() { - let text = Rope::from_str("/// This is a test.\n/// It has two lines.\nfn func() {}"); - let result = get_comments_from_lines(2, &text); - assert_eq!(result, "This is a test. It has two lines."); - - let text = Rope::from_str("/// # Title\n/// - Point one\n/// - Point two\nfn func() {}"); - let result = get_comments_from_lines(3, &text); - assert_eq!(result, "# Title\n- Point one\n- Point two"); - - let text = Rope::from_str( - "/// This is not part of the doc \n\n/// This is part of the doc\nfn func() {}", - ); - let result = get_comments_from_lines(3, &text); - assert_eq!(result, "This is part of the doc"); - - let text = Rope::from_str("fn func() {}"); - let result = get_comments_from_lines(0, &text); - assert_eq!(result, ""); - } - - #[test] - fn test_extract_function_name() { - // Simple function name - assert_eq!(extract_function_name("foo"), Some("foo".to_string())); - assert_eq!( - extract_function_name("my_func"), - Some("my_func".to_string()) - ); - - // With module prefix - assert_eq!( - extract_function_name("jet::add_32"), - Some("jet::add_32".to_string()) - ); - - // With generic parameters - assert_eq!( - extract_function_name("fold::"), - Some("fold".to_string()) - ); - assert_eq!( - extract_function_name("unwrap_left::"), - Some("unwrap_left".to_string()) - ); - - // With leading whitespace/expressions - assert_eq!( - extract_function_name("let x = foo"), - Some("foo".to_string()) - ); - - // Empty input - assert_eq!(extract_function_name(""), None); - } - - #[test] - fn test_find_function_call_context() { - // Simple function call - assert_eq!( - find_function_call_context("foo("), - Some(("foo".to_string(), 0)) - ); - assert_eq!( - find_function_call_context("foo(a, "), - Some(("foo".to_string(), 1)) - ); - assert_eq!( - find_function_call_context("foo(a, b, "), - Some(("foo".to_string(), 2)) - ); - - // Nested function calls - assert_eq!( - find_function_call_context("outer(inner(x), "), - Some(("outer".to_string(), 1)) - ); - - // With module prefix - assert_eq!( - find_function_call_context("jet::add_32(a, "), - Some(("jet::add_32".to_string(), 1)) - ); - - // No function call - assert_eq!(find_function_call_context("let x = 5"), None); - } - - /// Tests for UTF-16 encoding: - #[test] - fn test_span_to_positions_handles_multibyte_utf8_before_span() { - let text = Rope::from_str("/// π\nfn foo() {}"); - - // "/// " = 4 bytes, "π" = 2 bytes, "\n" = 1 byte, so `fn` starts at byte 7. - let span = simplicityhl::error::Span::new(7, 9); - - let (start, end) = span_to_positions(&span, &text).expect("span conversion should succeed"); - - assert_eq!(start, lsp_types::Position::new(1, 0)); - assert_eq!(end, lsp_types::Position::new(1, 2)); - } - - #[test] - fn test_position_to_offset_uses_utf16_columns() { - let text = Rope::from_str("😀x"); - - // In LSP, 😀 occupies two UTF-16 code units, so column 2 is just after the emoji. - let offset = position_to_offset(lsp_types::Position::new(0, 2), &text) - .expect("position conversion should succeed"); - - assert_eq!(offset, 4); - } - - #[test] - fn test_position_to_offset_keeps_line_start_at_zero() { - let text = Rope::from_str("foo"); - - let offset = position_to_offset(lsp_types::Position::new(0, 0), &text) - .expect("line start should convert to byte offset 0"); - - assert_eq!(offset, 0); - } - - #[test] - fn test_position_to_offset_does_not_shift_ascii_columns_left() { - let text = Rope::from_str(" foo()"); - - let offset = position_to_offset(lsp_types::Position::new(0, 4), &text) - .expect("identifier start should map to its exact byte offset"); - let span = position_to_span(lsp_types::Position::new(0, 4), &text) - .expect("identifier start should map to the same byte offset"); - - assert_eq!(offset, 4); - assert_eq!(span, simplicityhl::error::Span::new(4, 4)); - } - - #[test] - fn test_position_to_offset_handles_single_utf16_multibyte_prefix() { - let text = Rope::from_str("πx"); - - // `π` is one UTF-16 code unit but two UTF-8 bytes, so column 1 should land after it. - let offset = position_to_offset(lsp_types::Position::new(0, 1), &text) - .expect("UTF-16 column after a BMP multibyte char should convert correctly"); - - assert_eq!(offset, 2); - } -} diff --git a/vscode/.gitignore b/vscode/.gitignore deleted file mode 100644 index edc71308..00000000 --- a/vscode/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ - -# client executables files -node_modules/ -out/ - -.pnpm-debug.log - -*.ast -dist/ - -# vscode package -*.vsix - -# lock files -Cargo.lock -**/pnpm-lock.yaml diff --git a/vscode/.vscodeignore b/vscode/.vscodeignore deleted file mode 100644 index ad5ad648..00000000 --- a/vscode/.vscodeignore +++ /dev/null @@ -1,16 +0,0 @@ -.vscode/ -node_modules/ -.git/ -.gitignore -npm-debug.log -**/*.ts -*.map -tsconfig.json -.github -test/ -tests/ -README.md -esbuild.js -bitcoind-tests/ -flake.* -Cargo.* diff --git a/vscode/LICENSE b/vscode/LICENSE deleted file mode 100644 index b12a53ee..00000000 --- a/vscode/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 SimplicityHL contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/vscode/README.md b/vscode/README.md deleted file mode 100644 index 336029ef..00000000 --- a/vscode/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# SimplicityHL extension for VSCode - -VSCode extension that provides syntax highlighting for the [SimplicityHL](https://github.com/BlockstreamResearch/SimplicityHL) programming language. - -[Simplicity](https://github.com/BlockstreamResearch/simplicity) is a typed, combinator-based, functional language without loops or recursion, developed to be an alternative to Bitcoin script that is formally specified, and can be statically analyzed with upper bounds on computation resources prior to execution. - -SimplicityHL is a high-level language for writing Simplicity smart contracts. SimplicityHL looks and feels like [Rust](https://www.rust-lang.org), but is compiled to Simplicity bytecode. Developers write SimplicityHL transactions, which Bitcoin/Liquid nodes verify with the Simplicity script interpreter. - -## Features - -- Syntax highlighting for .simf and .wit files -- Basic language configuration (brackets, comments) - -Also, you can install the [SimplicityHL language server](https://github.com/distributed-lab/simplicityhl-lsp), which enables several features: -- Error diagnostics -![diagnostics](https://github.com/user-attachments/assets/54315645-464b-40c3-bb72-c6e8c4bc0ad5) - -- Completion of user-defined functions and jets -![completion](https://github.com/user-attachments/assets/bbc2b9de-c286-4d31-b47e-ac95885f8916) - - - - -### Development - -To install the extension manually or hack on the source code see [development.md](docs/development.md) diff --git a/vscode/docs/development.md b/vscode/docs/development.md deleted file mode 100644 index 13358bc2..00000000 --- a/vscode/docs/development.md +++ /dev/null @@ -1,68 +0,0 @@ -## Extension installation from source code - -Install Node.js (v14 or later recommended). - -### Local Installation - -1. Clone this repository -2. Navigate to the extension directory: - ```bash - cd vscode - ``` -3. Install dependencies: - ```bash - npm install - ``` -4. Package the extension: - ```bash - npm install -g @vscode/vsce - vsce package - ``` - This will create a `.vsix` file in the current directory. - -5. Install the extension in VSCode: - - Launch VS Code - - Go to the Extensions view (Ctrl+Shift+X) - - Click on the "..." menu in the top-right of the Extensions view - - Select "Install from VSIX..." - - Navigate to and select the `.vsix` file you created - -### Alternative Installation Method - -You can also install the extension directly from the source code: - -1. Copy the `vscode` folder (rename it if necessary) to your VSCode extensions directory: - - Windows: `%USERPROFILE%\.vscode\extensions` - - macOS/Linux: `~/.vscode/extensions` - -2. Restart VSCode - -## Development - -1. Clone this repository and cd into `vscode` directory -2. Run `npm install` -3. Open the project in VS Code -4. Press F5 to start debugging (this will launch a new VSCode window with the extension loaded) -5. Make changes to the extension -6. Reload the debugging window to see your changes (Ctrl+R or Cmd+R) - -### Reloading the Extension During Development - -When making changes to the extension, you can reload it without uninstalling and reinstalling: - -1. **Using the Command Palette**: - - Press `Ctrl+Shift+P` (or `Cmd+Shift+P` on macOS) - - Type "Developer: Reload Window" and select it - -2. **Using keyboard shortcut**: - - Press `Ctrl+R` (or `Cmd+R` on macOS) - -3. **For extensions installed from folder**: - - Make your changes to the extension files - - Run the "Developer: Reload Window" command as described above - - VSCode will reload with the updated extension - -4. **For more substantial changes**: - - If you've made significant changes to the extension's structure or manifest - - You may need to restart VSCode completely (close and reopen) - - In some cases, you might need to run the command "Developer: Restart Extension Host" diff --git a/vscode/esbuild.js b/vscode/esbuild.js deleted file mode 100644 index 948e9efd..00000000 --- a/vscode/esbuild.js +++ /dev/null @@ -1,57 +0,0 @@ -import { context } from "esbuild"; -import process from "node:process"; - -const production = process.argv.includes("--production"); -const watch = process.argv.includes("--watch"); - -async function main() { - const ctx = await context({ - entryPoints: ["src/extension.ts"], - bundle: true, - format: "cjs", - minify: production, - sourcemap: !production, - sourcesContent: false, - platform: "node", - outfile: "dist/extension.js", - external: ["vscode"], - logLevel: "warning", - plugins: [ - esbuildProblemMatcherPlugin, - ], - }); - if (watch) { - await ctx.watch(); - } else { - await ctx.rebuild(); - await ctx.dispose(); - } -} - -/** - * @type {import('esbuild').Plugin} - */ -const esbuildProblemMatcherPlugin = { - name: "esbuild-problem-matcher", - - setup(build) { - build.onStart(() => { - console.log("[watch] build started"); - }); - build.onEnd((result) => { - result.errors.forEach(({ text, location }) => { - console.error(`✘ [ERROR] ${text}`); - if (location == null) return; - console.error( - ` ${location.file}:${location.line}:${location.column}:`, - ); - }); - console.log("[watch] build finished"); - }); - }, -}; - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/vscode/eslint.config.ts b/vscode/eslint.config.ts deleted file mode 100644 index 3928713f..00000000 --- a/vscode/eslint.config.ts +++ /dev/null @@ -1,44 +0,0 @@ -import js from "@eslint/js"; - -import { defineConfig } from "eslint/config"; -import globals from "globals"; -import tseslint from "typescript-eslint"; - -export default defineConfig( - { - ignores: ["dist/**", "node_modules/**", "generated-types/**", "artifacts/**", "coverage/**"], - }, - js.configs.recommended, - ...tseslint.configs.recommended, - { - files: ["src/**/*.ts"], - languageOptions: { - parser: tseslint.parser, - parserOptions: { - project: "./tsconfig.json", - tsconfigRootDir: process.cwd(), - }, - globals: { - ...globals.node, - }, - }, - plugins: { - "@typescript-eslint": tseslint.plugin, - }, - rules: { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-expressions": "off", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-misused-promises": ["error", { checksVoidReturn: { attributes: false } }], - }, - }, - { - files: ["**/*.js"], - languageOptions: { - globals: { - ...globals.node, - }, - }, - } -); diff --git a/vscode/icon.png b/vscode/icon.png deleted file mode 100644 index cf1ab171..00000000 Binary files a/vscode/icon.png and /dev/null differ diff --git a/vscode/icons/simf.svg b/vscode/icons/simf.svg deleted file mode 100644 index 4d94ca94..00000000 --- a/vscode/icons/simf.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vscode/icons/wit.svg b/vscode/icons/wit.svg deleted file mode 100644 index 11be2aa3..00000000 --- a/vscode/icons/wit.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/vscode/language-configuration.json b/vscode/language-configuration.json deleted file mode 100644 index a7ce9cf6..00000000 --- a/vscode/language-configuration.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "comments": { - "lineComment": "//" - }, - "brackets": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] - ], - "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" }, - { "open": "\"", "close": "\"" } - ], - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""] - ] -} \ No newline at end of file diff --git a/vscode/package-lock.json b/vscode/package-lock.json deleted file mode 100644 index f5681bb3..00000000 --- a/vscode/package-lock.json +++ /dev/null @@ -1,7125 +0,0 @@ -{ - "name": "simplicityhl", - "version": "0.2.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "simplicityhl", - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "vscode-languageclient": "^9.0.1" - }, - "devDependencies": { - "@eslint/js": "^9.13.0", - "@stylistic/eslint-plugin": "^2.9.0", - "@types/node": "^22", - "@types/vscode": "^1.66.0", - "@typescript-eslint/eslint-plugin": "^8.44.1", - "@typescript-eslint/parser": "^8.44.1", - "@vscode/vsce": "^3.6.0", - "esbuild": "^0.25.9", - "eslint": "^9.36.0", - "eslint-plugin-promise": "^7.2.1", - "jiti": "^2.6.0", - "ts-loader": "^9.5.4", - "ts-node": "^10.9.2", - "typescript": "^5.7.3", - "typescript-eslint": "^8.44.1" - }, - "engines": { - "vscode": "^1.85.0" - } - }, - "node_modules/@azu/format-text": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", - "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@azu/style-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", - "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "@azu/format-text": "^1.0.1" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz", - "integrity": "sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.25.0.tgz", - "integrity": "sha512-kbL+Ae7/UC62wSzxirZddYeVnHvvkvAnSZkBqL55X+jaSXTAXfngnNsDM5acEWU0Q/SAv3gEQfxO1igWOn87Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "15.13.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.0.tgz", - "integrity": "sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.0.tgz", - "integrity": "sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.0", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", - "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", - "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", - "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", - "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", - "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", - "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", - "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", - "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", - "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", - "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", - "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", - "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", - "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", - "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", - "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", - "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", - "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", - "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", - "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", - "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", - "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", - "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", - "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", - "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", - "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", - "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@secretlint/config-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", - "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/config-loader": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", - "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", - "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "structured-source": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", - "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@textlint/linter-formatter": "^15.2.0", - "@textlint/module-interop": "^15.2.0", - "@textlint/types": "^15.2.0", - "chalk": "^5.4.1", - "debug": "^4.4.1", - "pluralize": "^8.0.0", - "strip-ansi": "^7.1.0", - "table": "^6.9.0", - "terminal-link": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@secretlint/node": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", - "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/profiler": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", - "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/resolver": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", - "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", - "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-sarif-builder": "^3.2.0" - } - }, - "node_modules/@secretlint/secretlint-rule-no-dotenv": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", - "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", - "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/source-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", - "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2", - "istextorbinary": "^9.5.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/types": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", - "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", - "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.13.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@textlint/ast-node-types": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.3.tgz", - "integrity": "sha512-GEhoxfmh6TF+xC8TJmAUwOzzh0J6sVDqjKhwTTwetf7YDdhHbIv1PuUb/dTadMVIWs1H0+JD4Y27n6LWMmqn9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.3.tgz", - "integrity": "sha512-gnFGl8MejAS4rRDPKV2OYvU0Tb0iJySOPDahf+RCK30b615UqY6CjqWxXw1FvXfT3pHPoRrefVu39j1AKm2ezg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.2.3", - "@textlint/resolver": "15.2.3", - "@textlint/types": "15.2.3", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^3.14.1", - "lodash": "^4.17.21", - "pluralize": "^2.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "table": "^6.9.0", - "text-table": "^0.2.0" - } - }, - "node_modules/@textlint/linter-formatter/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/@textlint/linter-formatter/node_modules/pluralize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", - "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/module-interop": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.3.tgz", - "integrity": "sha512-dV6M3ptOFJjR5bgYUMeVqc8AqFrMtCEFaZEiLAfMufX29asYonI2K8arqivOA69S2Lh6esyij6V7qpQiXeK/cA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/resolver": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.3.tgz", - "integrity": "sha512-Qd3udqo2sWa3u0sYgDVd9M/iybBVBJLrWGaID6Yzl9GyhdGi0E6ngo3b9r+H6psbJDIaCKi54IxvC9q5didWfA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/types": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.3.tgz", - "integrity": "sha512-i8XVmDHJwykMXcGgkSxZLjdbeqnl+voYAcIr94KIe0STwgkHIhwHJgb/tEVFawGClHo+gPczF12l1C5+TAZEzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@textlint/ast-node-types": "15.2.3" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "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/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", - "integrity": "sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/vscode": { - "version": "1.105.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", - "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz", - "integrity": "sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@vscode/vsce": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.6.2.tgz", - "integrity": "sha512-gvBfarWF+Ii20ESqjA3dpnPJpQJ8fFJYtcWtjwbRADommCzGg1emtmb34E+DKKhECYvaVyAl+TF9lWS/3GSPvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", - "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", - "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^11.0.0", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "markdown-it": "^14.1.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "secretlint": "^10.1.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.5.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "keytar": "^7.7.0" - } - }, - "node_modules/@vscode/vsce-sign": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.8.tgz", - "integrity": "sha512-H7p8E11cZMj6mt8xIi3QXZ7dSU/2MH3Y7c+5JfUhHAV4xfaPNc8ozwLVK282c6ah596KoIJIdPUlNHV7Qs/5JA==", - "dev": true, - "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.6", - "@vscode/vsce-sign-alpine-x64": "2.0.6", - "@vscode/vsce-sign-darwin-arm64": "2.0.2", - "@vscode/vsce-sign-darwin-x64": "2.0.2", - "@vscode/vsce-sign-linux-arm": "2.0.6", - "@vscode/vsce-sign-linux-arm64": "2.0.6", - "@vscode/vsce-sign-linux-x64": "2.0.6", - "@vscode/vsce-sign-win32-arm64": "2.0.6", - "@vscode/vsce-sign-win32-x64": "2.0.6" - } - }, - "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", - "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", - "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", - "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", - "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", - "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", - "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", - "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", - "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", - "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/azure-devops-node-api": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", - "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.17.tgz", - "integrity": "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binaryextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", - "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/boundary": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", - "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "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/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0", - "peer": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cockatiel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", - "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "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/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/editions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", - "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "version-range": "^4.15.0" - }, - "engines": { - "ecmascript": ">= es5", - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.237", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", - "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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", - "peer": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", - "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.11", - "@esbuild/android-arm": "0.25.11", - "@esbuild/android-arm64": "0.25.11", - "@esbuild/android-x64": "0.25.11", - "@esbuild/darwin-arm64": "0.25.11", - "@esbuild/darwin-x64": "0.25.11", - "@esbuild/freebsd-arm64": "0.25.11", - "@esbuild/freebsd-x64": "0.25.11", - "@esbuild/linux-arm": "0.25.11", - "@esbuild/linux-arm64": "0.25.11", - "@esbuild/linux-ia32": "0.25.11", - "@esbuild/linux-loong64": "0.25.11", - "@esbuild/linux-mips64el": "0.25.11", - "@esbuild/linux-ppc64": "0.25.11", - "@esbuild/linux-riscv64": "0.25.11", - "@esbuild/linux-s390x": "0.25.11", - "@esbuild/linux-x64": "0.25.11", - "@esbuild/netbsd-arm64": "0.25.11", - "@esbuild/netbsd-x64": "0.25.11", - "@esbuild/openbsd-arm64": "0.25.11", - "@esbuild/openbsd-x64": "0.25.11", - "@esbuild/openharmony-arm64": "0.25.11", - "@esbuild/sunos-x64": "0.25.11", - "@esbuild/win32-arm64": "0.25.11", - "@esbuild/win32-ia32": "0.25.11", - "@esbuild/win32-x64": "0.25.11" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-promise": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", - "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC", - "optional": true - }, - "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-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istextorbinary": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", - "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "binaryextensions": "^6.11.0", - "editions": "^6.21.0", - "textextensions": "^6.11.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "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/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/node-abi": { - "version": "3.78.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.78.0.tgz", - "integrity": "sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", - "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/node-sarif-builder": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz", - "integrity": "sha512-kVIOdynrF2CRodHZeP/97Rh1syTUHBNiw17hUCIVhlhEsWlfJm19MuO56s4MdKbr22xWx6mzMnNAgXzVlIYM9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "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/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "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.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "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/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc-config-loader/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/rc-config-loader/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "license": "ISC" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/secretlint": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", - "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "debug": "^4.4.1", - "globby": "^14.1.0", - "read-pkg": "^9.0.1" - }, - "bin": { - "secretlint": "bin/secretlint.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/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", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/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/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/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/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/structured-source": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", - "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boundary": "^2.0.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/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/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terminal-link": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", - "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "supports-hyperlinks": "^3.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", - "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/textextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", - "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-loader": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", - "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "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" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-rest-client": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", - "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, - "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/typescript-eslint": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.1.tgz", - "integrity": "sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.1", - "@typescript-eslint/parser": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/version-range": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", - "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", - "dev": true, - "license": "Artistic-2.0", - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", - "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", - "license": "MIT", - "dependencies": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.5" - }, - "engines": { - "vscode": "^1.82.0" - } - }, - "node_modules/vscode-languageclient/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.102.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", - "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.26.3", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC", - "optional": true - }, - "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/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/vscode/package.json b/vscode/package.json deleted file mode 100644 index 1a5768a3..00000000 --- a/vscode/package.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "name": "simplicityhl", - "displayName": "SimplicityHL Language Support", - "description": "Syntax highlighting and autocompletion for SimplicityHL (Simfony) language", - "version": "0.3.1", - "publisher": "Blockstream", - "repository": { - "type": "git", - "url": "https://github.com/BlockstreamResearch/SimplicityHL" - }, - "engines": { - "vscode": "^1.85.0" - }, - "categories": [ - "Programming Languages" - ], - "main": "dist/extension.js", - "contributes": { - "languages": [ - { - "id": "simplicityhl", - "aliases": [ - "Simfony", - "simfony", - "SimplicityHL", - "simplicityhl" - ], - "extensions": [ - ".simf" - ], - "icon": { - "dark": "./icons/simf.svg", - "light": "./icons/simf.svg" - }, - "configuration": "./language-configuration.json" - }, - { - "id": "simplicityhl-witness", - "aliases": [ - "Simfony witness", - "simfony witness", - "SimplicityHL witness", - "simplicityhl witness" - ], - "extensions": [ - ".wit" - ], - "icon": { - "dark": "./icons/wit.svg", - "light": "./icons/wit.svg" - }, - "configuration": "./witness-configuration.json" - } - ], - "grammars": [ - { - "language": "simplicityhl", - "scopeName": "source.simplicityhl", - "path": "./syntaxes/simplicityhl.tmLanguage.json" - }, - { - "language": "simplicityhl-witness", - "scopeName": "source.wit", - "path": "./syntaxes/witness.tmLanguage.json" - } - ], - "snippets": [ - { - "language": "simplicityhl", - "path": "./snippets/simplicityhl.json" - } - ], - "configuration": { - "title": "SimplicityHL", - "properties": { - "simplicityhl.suppressMissingLspWarning": { - "type": "boolean", - "default": false, - "description": "Do not show missing LSP executable warning." - }, - "simplicityhl.disableAutoupdate": { - "type": "boolean", - "default": false, - "description": "Do not autoupdate LSP server." - }, - "simplicityhl.compiler.path": { - "type": "string", - "default": "", - "description": "Path to the simc compiler. If empty, searches PATH and common locations." - }, - "simplicityhl.build.autoSaveBeforeCompile": { - "type": "boolean", - "default": true, - "description": "Automatically save the file before compiling." - } - } - }, - "commands": [ - { - "command": "simplicityhl.restartServer", - "title": "Restart Server", - "category": "SimplicityHL" - }, - { - "command": "simplicityhl.compileFile", - "title": "Compile Current File", - "category": "SimplicityHL", - "icon": "$(play)" - }, - { - "command": "simplicityhl.compileFileDebug", - "title": "Compile with Debug Symbols", - "category": "SimplicityHL" - }, - { - "command": "simplicityhl.compileWithWitness", - "title": "Compile with Witness", - "category": "SimplicityHL" - }, - { - "command": "simplicityhl.compileJson", - "title": "Compile to JSON", - "category": "SimplicityHL" - } - ], - "menus": { - "editor/title": [ - { - "when": "resourceLangId == simplicityhl", - "command": "simplicityhl.compileFile", - "group": "navigation" - } - ], - "editor/context": [ - { - "when": "resourceLangId == simplicityhl", - "command": "simplicityhl.compileFile", - "group": "1_modification" - }, - { - "when": "resourceLangId == simplicityhl", - "command": "simplicityhl.compileWithWitness", - "group": "1_modification" - } - ], - "commandPalette": [ - { - "command": "simplicityhl.compileFile", - "when": "resourceLangId == simplicityhl" - }, - { - "command": "simplicityhl.compileFileDebug", - "when": "resourceLangId == simplicityhl" - }, - { - "command": "simplicityhl.compileWithWitness", - "when": "resourceLangId == simplicityhl" - }, - { - "command": "simplicityhl.compileJson", - "when": "resourceLangId == simplicityhl" - } - ] - }, - "keybindings": [ - { - "command": "simplicityhl.compileFile", - "key": "ctrl+shift+b", - "mac": "cmd+shift+b", - "when": "resourceLangId == simplicityhl" - } - ], - "taskDefinitions": [ - { - "type": "simplicityhl", - "required": [ - "command" - ], - "properties": { - "command": { - "type": "string", - "enum": [ - "compile", - "compile-debug", - "compile-with-witness" - ], - "description": "The compilation command to run" - }, - "file": { - "type": "string", - "description": "The SimplicityHL file to compile (defaults to current file)" - }, - "witnessFile": { - "type": "string", - "description": "The witness file to use (for compile-with-witness)" - } - } - } - ], - "problemMatchers": [ - { - "name": "simplicityhl", - "owner": "simplicityhl", - "fileLocation": [ - "absolute" - ], - "pattern": { - "regexp": "^Error:\\s+(.*)$", - "message": 1 - }, - "severity": "error" - } - ] - }, - "license": "MIT", - "scripts": { - "compile": "npm run check-types && node esbuild.js --production", - "check-types": "tsc --noEmit", - "watch": "npm-run-all -p watch:*", - "watch:esbuild": "node esbuild.js --watch", - "watch:tsc": "tsc --noEmit --watch --project tsconfig.json", - "vscode:prepublish": "npm run compile", - "login": "vsce login Simplicity", - "package": "vsce package", - "eslint-check": "eslint . --ext .ts", - "publish": "vsce publish" - }, - "icon": "icon.png", - "devDependencies": { - "@eslint/js": "^9.13.0", - "@stylistic/eslint-plugin": "^2.9.0", - "@types/node": "^22", - "esbuild": "^0.25.9", - "ts-loader": "^9.5.4", - "@types/vscode": "^1.66.0", - "@vscode/vsce": "^3.6.0", - "@typescript-eslint/eslint-plugin": "^8.44.1", - "@typescript-eslint/parser": "^8.44.1", - "eslint": "^9.36.0", - "eslint-plugin-promise": "^7.2.1", - "jiti": "^2.6.0", - "ts-node": "^10.9.2", - "typescript": "^5.7.3", - "typescript-eslint": "^8.44.1" - }, - "dependencies": { - "vscode-languageclient": "^9.0.1" - } -} diff --git a/vscode/snippets/simplicityhl.json b/vscode/snippets/simplicityhl.json deleted file mode 100644 index 3a02559a..00000000 --- a/vscode/snippets/simplicityhl.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "Function Declaration": { - "prefix": "fn", - "body": [ - "fn ${1:name}(${2:params}) ${3:-> ${4:ReturnType} }{", - " ${0}", - "}" - ], - "description": "Declare a new function" - }, - "Main Function": { - "prefix": "main", - "body": [ - "fn main() {", - " ${0}", - "}" - ], - "description": "Entry point function" - }, - "Let Binding": { - "prefix": "let", - "body": "let ${1:name}: ${2:Type} = ${0};", - "description": "Typed variable binding" - }, - "Let Destructure": { - "prefix": "letd", - "body": "let (${1:a}, ${2:b}): (${3:Type1}, ${4:Type2}) = ${0};", - "description": "Destructuring let binding" - }, - "Match Expression": { - "prefix": "match", - "body": [ - "match ${1:expr} {", - " Left(${2:left_val}: ${3:LeftType}) => ${4:left_expr},", - " Right(${5:right_val}: ${6:RightType}) => ${0:right_expr},", - "}" - ], - "description": "Match on Either type" - }, - "Match Option": { - "prefix": "matcho", - "body": [ - "match ${1:option_val} {", - " Some(${2:val}: ${3:Type}) => ${4:some_expr},", - " None => ${0:none_expr},", - "}" - ], - "description": "Match on Option type" - }, - "Assert": { - "prefix": "assert", - "body": "assert!(${0:condition});", - "description": "Assert macro" - }, - "Jet Call": { - "prefix": "jet", - "body": "jet::${1:jet_name}(${0})", - "description": "Call a jet function" - }, - "Witness": { - "prefix": "witness", - "body": "witness::${0:WITNESS_NAME}", - "description": "Reference a witness value" - }, - "Param": { - "prefix": "param", - "body": "param::${0:PARAM_NAME}", - "description": "Reference a parameter" - }, - "Signature Verification": { - "prefix": "checksig", - "body": [ - "fn checksig(pk: Pubkey, sig: Signature) {", - " let msg: u256 = jet::sig_all_hash();", - " jet::bip_0340_verify((pk, msg), sig);", - "}" - ], - "description": "BIP-340 signature verification helper" - }, - "SHA256 Hash": { - "prefix": "sha256", - "body": [ - "fn sha256(data: u256) -> u256 {", - " let ctx: Ctx8 = jet::sha_256_ctx_8_init();", - " let ctx: Ctx8 = jet::sha_256_ctx_8_add_32(ctx, data);", - " jet::sha_256_ctx_8_finalize(ctx)", - "}" - ], - "description": "SHA-256 hash function" - }, - "Check Lock Height": { - "prefix": "lockheight", - "body": [ - "let timeout: Height = ${1:1000};", - "jet::check_lock_height(timeout);" - ], - "description": "Time lock by block height" - }, - "Check Lock Time": { - "prefix": "locktime", - "body": [ - "let timeout: Time = ${1:1700000000};", - "jet::check_lock_time(timeout);" - ], - "description": "Time lock by Unix timestamp" - }, - "Array Fold": { - "prefix": "fold", - "body": "let ${1:result}: ${2:AccType} = array_fold::<${3:fold_fn}, ${4:N}>(${5:arr}, ${0:init});", - "description": "Fold over an array" - }, - "For While Loop": { - "prefix": "forwhile", - "body": "let ${1:result}: ${2:Type} = for_while::<${3:N}>(${4:init}, |${5:acc}: ${2:Type}| { ${0} });", - "description": "Bounded loop with early exit" - }, - "Array Declaration": { - "prefix": "arr", - "body": "let ${1:arr}: [${2:Type}; ${3:N}] = [${0}];", - "description": "Fixed-size array" - }, - "P2PK Template": { - "prefix": "p2pk", - "body": [ - "/*", - " * Pay to Public Key", - " * Coins move when signed by the specified public key.", - " */", - "fn main() {", - " jet::bip_0340_verify((param::${1:PUBLIC_KEY}, jet::sig_all_hash()), witness::${2:SIGNATURE})", - "}" - ], - "description": "Pay-to-public-key contract template" - }, - "File Header": { - "prefix": "header", - "body": [ - "/*", - " * ${1:CONTRACT_NAME}", - " *", - " * ${2:Description of what this contract does.}", - " */", - "" - ], - "description": "File header comment block" - } -} diff --git a/vscode/src/client.ts b/vscode/src/client.ts deleted file mode 100644 index 4a017e31..00000000 --- a/vscode/src/client.ts +++ /dev/null @@ -1,98 +0,0 @@ -// LSP client for SimplicityHL language server. -// Manages connection lifecycle and integrates with status bar. - -import { window } from "vscode"; -import { - Executable, - LanguageClient, - LanguageClientOptions, - ServerOptions, -} from "vscode-languageclient/node"; -import { ensureExecutable } from "./find_server"; -import { getStatusBar } from "./statusBar"; -import process from "node:process"; - -export class LspClient { - private client: LanguageClient | undefined; - - public async start(): Promise { - const statusBar = getStatusBar(); - statusBar.update("starting"); - statusBar.show(); - - const command = "simplicityhl-lsp"; - const execPath = await ensureExecutable(command); - - if (!execPath) { - statusBar.update("disconnected"); - return; - } - - const run: Executable = { - command: execPath, - options: { - env: { - ...process.env, - }, - }, - }; - const serverOptions: ServerOptions = { - run, - debug: run, - }; - - const clientOptions: LanguageClientOptions = { - documentSelector: [ - { scheme: "file", language: "simplicityhl" }, - { scheme: "file", language: "simplicityhl-witness" }, - ], - }; - - this.client = new LanguageClient( - "simplicityhlLspClient", - "SimplicityHL LSP", - serverOptions, - clientOptions, - ); - - try { - await this.client.start(); - statusBar.update("connected"); - window.showInformationMessage("SimplicityHL Language Server activated!"); - } catch (e) { - statusBar.update("error"); - window.showErrorMessage( - `Failed to start SimplicityHL Language Server: ${e}`, - ); - } - } - - public async stop(): Promise { - if (!this.client) { - return; - } - await this.client.stop(); - this.client = undefined; - getStatusBar().update("disconnected"); - } - - public async restart(): Promise { - const statusBar = getStatusBar(); - - if (!this.client) { - // Try to start even if not previously initialized - await this.start(); - return; - } - - try { - statusBar.update("starting"); - await this.stop(); - await this.start(); - window.showInformationMessage("SimplicityHL Language Server restarted successfully!"); - } catch (e) { - statusBar.update("error"); - window.showErrorMessage(`Failed to restart LSP: ${e}`); - } - } -} diff --git a/vscode/src/commands.ts b/vscode/src/commands.ts deleted file mode 100644 index 5b305056..00000000 --- a/vscode/src/commands.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ExtensionContext, commands } from "vscode"; -import { LspClient } from "./client"; - -export function registerRestartCommand( - context: ExtensionContext, - lspClient: LspClient -) { - const command = commands.registerCommand( - "simplicityhl.restartServer", - async () => { - await lspClient.restart(); - } - ); - - context.subscriptions.push(command); -} diff --git a/vscode/src/compile.ts b/vscode/src/compile.ts deleted file mode 100644 index 6806126b..00000000 --- a/vscode/src/compile.ts +++ /dev/null @@ -1,167 +0,0 @@ -// Compiler interface for SimplicityHL. -// Wraps the `simc` binary and parses its output for VSCode integration. - -import * as vscode from "vscode"; -import * as path from "path"; -import * as cp from "child_process"; -import { findExecutable } from "./find_server"; - -// Options for compilation -export interface CompileOptions { - debug?: boolean; // Include debug symbols (--debug flag) - witnessFile?: string; // Path to witness file for satisfaction - json?: boolean; // Output in JSON format (--json flag) -} - -// Result of a compilation attempt -export interface CompileResult { - success: boolean; - program?: string; // Base64 encoded Simplicity program - witness?: string; // Base64 encoded witness (if provided) - error?: string; // Error message if compilation failed -} - -// Main compiler class - manages simc invocations -export class SimplicityHLCompiler { - private outputChannel: vscode.OutputChannel; - - constructor() { - // Output channel shows raw compiler output - this.outputChannel = vscode.window.createOutputChannel("SimplicityHL Compiler"); - } - - // Compile a .simf file with optional witness and flags - public async compileFile( - filePath: string, - options: CompileOptions = {} - ): Promise { - const simcPath = getSimcPath(); - const args: string[] = [filePath]; - - // Add optional witness file - if (options.witnessFile) { - args.push("-w"); - args.push(options.witnessFile); - } - // Add optional flags - if (options.debug) { - args.push("--debug"); - } - if (options.json) { - args.push("--json"); - } - - // Show compilation info in output channel - this.outputChannel.clear(); - this.outputChannel.show(true); - this.outputChannel.appendLine(`Compiling: ${filePath}`); - this.outputChannel.appendLine(`Command: ${simcPath} ${args.join(" ")}`); - this.outputChannel.appendLine(""); - - return new Promise((resolve) => { - const proc = cp.spawn(simcPath, args, { - cwd: path.dirname(filePath), - }); - - let stdout = ""; - let stderr = ""; - - proc.stdout?.on("data", (data) => { - stdout += data.toString(); - this.outputChannel.append(data.toString()); - }); - - proc.stderr?.on("data", (data) => { - stderr += data.toString(); - this.outputChannel.append(data.toString()); - }); - - proc.on("close", (code) => { - if (code === 0) { - this.outputChannel.appendLine("\nCompilation successful!"); - - // Parse output based on format - let program: string | undefined; - let witness: string | undefined; - - if (options.json) { - try { - const output = JSON.parse(stdout); - program = output.program; - witness = output.witness; - } catch { - program = stdout; - } - } else { - // Text format: "Program:\n\nWitness:\n" - const programMatch = stdout.match(/Program:\s*\n(.+)/); - const witnessMatch = stdout.match(/Witness:\s*\n(.+)/); - program = programMatch?.[1]?.trim(); - witness = witnessMatch?.[1]?.trim(); - } - - resolve({ - success: true, - program, - witness, - }); - } else { - this.outputChannel.appendLine(`\nCompilation failed with exit code ${code}`); - resolve({ - success: false, - error: stderr || stdout, - }); - } - }); - - proc.on("error", (err) => { - this.outputChannel.appendLine(`\nFailed to start compiler: ${err.message}`); - resolve({ - success: false, - error: err.message, - }); - }); - }); - } - - // Clean up resources - public dispose(): void { - this.outputChannel.dispose(); - } -} - -// Singleton instance for extension lifetime -let compiler: SimplicityHLCompiler | undefined; - -export function getCompiler(): SimplicityHLCompiler { - if (!compiler) { - compiler = new SimplicityHLCompiler(); - } - return compiler; -} - -export function disposeCompiler(): void { - compiler?.dispose(); - compiler = undefined; -} - -// Locate the simc compiler binary -export function getSimcPath(): string { - // Check user-configured path first - const config = vscode.workspace.getConfiguration("simplicityhl"); - const configuredPath = config.get("compiler.path"); - if (configuredPath && configuredPath.trim()) { - return configuredPath; - } - - // Search in PATH and common locations - const simcPath = findExecutable("simc"); - if (simcPath) { - return simcPath; - } - - throw new Error( - "simc compiler not found. See https://github.com/BlockstreamResearch/SimplicityHL#installation " + - "or set simplicityhl.compiler.path in settings." - ); -} diff --git a/vscode/src/compile_commands.ts b/vscode/src/compile_commands.ts deleted file mode 100644 index b5bf2509..00000000 --- a/vscode/src/compile_commands.ts +++ /dev/null @@ -1,185 +0,0 @@ -// Command handlers for SimplicityHL compilation. -// Registers commands accessible via Command Palette and keybindings. - -import * as vscode from "vscode"; -import * as path from "path"; -import { getCompiler } from "./compile"; - -// Validates that the active editor contains a SimplicityHL file -async function getSimplicityHLDocument(): Promise { - const editor = vscode.window.activeTextEditor; - if (!editor) { - vscode.window.showWarningMessage("No active file to compile"); - return undefined; - } - - const document = editor.document; - if (document.languageId !== "simplicityhl") { - vscode.window.showWarningMessage("Current file is not a SimplicityHL file (.simf)"); - return undefined; - } - - // Auto-save before compile if enabled - const config = vscode.workspace.getConfiguration("simplicityhl"); - const autoSave = config.get("build.autoSaveBeforeCompile", true); - if (autoSave && document.isDirty) { - await document.save(); - } - - return document; -} - -// Register all compile-related commands -export function registerCompileCommands(context: vscode.ExtensionContext): void { - // Basic compile - compiles the current .simf file - const compileFileCommand = vscode.commands.registerCommand( - "simplicityhl.compileFile", - async () => { - const document = await getSimplicityHLDocument(); - if (!document) return; - - const compiler = getCompiler(); - const result = await compiler.compileFile(document.uri.fsPath); - - if (result.success) { - // Offer to copy output to clipboard - const action = await vscode.window.showInformationMessage( - "SimplicityHL compiled successfully!", - "Copy Program", - "Dismiss" - ); - - if (action === "Copy Program" && result.program) { - await vscode.env.clipboard.writeText(result.program); - vscode.window.showInformationMessage("Program copied to clipboard"); - } - } else { - vscode.window.showErrorMessage( - "Compilation failed. See Problems panel for details." - ); - } - } - ); - - // Compile with debug symbols - includes debug info in output - const compileDebugCommand = vscode.commands.registerCommand( - "simplicityhl.compileFileDebug", - async () => { - const document = await getSimplicityHLDocument(); - if (!document) return; - - const compiler = getCompiler(); - const result = await compiler.compileFile(document.uri.fsPath, { debug: true }); - - if (result.success) { - vscode.window.showInformationMessage("Compiled with debug symbols!"); - } else { - vscode.window.showErrorMessage( - "Compilation failed. See Problems panel for details." - ); - } - } - ); - - // Compile with witness - satisfies the program with witness data - const compileWithWitnessCommand = vscode.commands.registerCommand( - "simplicityhl.compileWithWitness", - async () => { - const document = await getSimplicityHLDocument(); - if (!document) return; - - const simfPath = document.uri.fsPath; - // Default: look for .wit file with same name - const defaultWitPath = simfPath.replace(/\.simf$/, ".wit"); - - let witnessFile: string | undefined; - try { - await vscode.workspace.fs.stat(vscode.Uri.file(defaultWitPath)); - witnessFile = defaultWitPath; - } catch { - // No default witness file, prompt user to select one - const selected = await vscode.window.showOpenDialog({ - canSelectFiles: true, - canSelectFolders: false, - canSelectMany: false, - filters: { "Witness Files": ["wit", "json"] }, - defaultUri: vscode.Uri.file(path.dirname(simfPath)), - title: "Select Witness File", - }); - - if (selected?.[0]) { - witnessFile = selected[0].fsPath; - } - } - - if (!witnessFile) { - vscode.window.showWarningMessage("No witness file selected"); - return; - } - - const compiler = getCompiler(); - const result = await compiler.compileFile(simfPath, { witnessFile }); - - if (result.success) { - const action = await vscode.window.showInformationMessage( - "Program satisfied with witness!", - "Copy Program", - "Copy Witness", - "Dismiss" - ); - - if (action === "Copy Program" && result.program) { - await vscode.env.clipboard.writeText(result.program); - vscode.window.showInformationMessage("Program copied to clipboard"); - } else if (action === "Copy Witness" && result.witness) { - await vscode.env.clipboard.writeText(result.witness); - vscode.window.showInformationMessage("Witness copied to clipboard"); - } - } else { - vscode.window.showErrorMessage( - "Compilation failed. See Problems panel for details." - ); - } - } - ); - - // Compile to JSON - outputs result in JSON format in a new editor - const compileJsonCommand = vscode.commands.registerCommand( - "simplicityhl.compileJson", - async () => { - const document = await getSimplicityHLDocument(); - if (!document) return; - - const compiler = getCompiler(); - const result = await compiler.compileFile(document.uri.fsPath, { json: true }); - - if (result.success && result.program) { - // Show JSON output in a new untitled document - const jsonOutput = JSON.stringify( - { - program: result.program, - witness: result.witness ?? null, - }, - null, - 2 - ); - const doc = await vscode.workspace.openTextDocument({ - content: jsonOutput, - language: "json", - }); - await vscode.window.showTextDocument(doc); - } else { - vscode.window.showErrorMessage( - "Compilation failed. See Problems panel for details." - ); - } - } - ); - - context.subscriptions.push( - compileFileCommand, - compileDebugCommand, - compileWithWitnessCommand, - compileJsonCommand - ); -} diff --git a/vscode/src/extension.ts b/vscode/src/extension.ts deleted file mode 100644 index c2a53bd7..00000000 --- a/vscode/src/extension.ts +++ /dev/null @@ -1,34 +0,0 @@ -// SimplicityHL VSCode Extension entry point. -// Initializes LSP client and registers all extension features. - -import { LspClient } from "./client"; -import { registerRestartCommand } from "./commands"; -import { registerCompileCommands } from "./compile_commands"; -import { registerTaskProvider } from "./tasks"; -import { disposeCompiler } from "./compile"; -import { disposeStatusBar } from "./statusBar"; -import { ExtensionContext } from "vscode"; - -let client: LspClient; - -export function activate(context: ExtensionContext) { - // Initialize LSP client for language intelligence (also shows status bar) - client = new LspClient(); - void client.start(); - - // Register all commands and providers - registerRestartCommand(context, client); - registerCompileCommands(context); // Compile commands (Cmd+Shift+B, etc.) - registerTaskProvider(context); // Task integration (Tasks: Run Task) -} - -export function deactivate(): Thenable | undefined { - // Clean up all resources - disposeCompiler(); - disposeStatusBar(); - - if (!client) { - return undefined; - } - return client.stop(); -} diff --git a/vscode/src/find_server.ts b/vscode/src/find_server.ts deleted file mode 100644 index 17a1a3ec..00000000 --- a/vscode/src/find_server.ts +++ /dev/null @@ -1,162 +0,0 @@ -import * as os from "os"; -import * as fs from "fs"; -import * as path from "path"; - -import process from "node:process"; -import * as cp from "child_process"; - -import { env, ProgressLocation, Uri, window, workspace } from "vscode"; - -// Searches for an executable in PATH and common installation directories. -// Used by both LSP client and compiler to locate binaries (simplicityhl-lsp, simc). -export function findExecutable(command: string): string | null { - try { - const resolved = cp - .execSync( - process.platform === "win32" ? `where ${command}` : `which ${command}`, - ) - .toString() - .split(/\r?\n/)[0] - .trim(); - if (resolved && fs.existsSync(resolved)) { - return resolved; - } - } catch { - // Not found in PATH - } - - const commonDirs: string[] = []; - - if (process.platform === "win32") { - commonDirs.push( - path.join( - process.env["USERPROFILE"] ?? "C:\\Users\\Default", - ".cargo", - "bin", - ), - ); - } else { - commonDirs.push(path.join(os.homedir(), ".cargo", "bin")); - - commonDirs.push( - "/usr/local/bin", - "/usr/bin", - path.join(os.homedir(), ".local", "bin"), - ); - } - - for (const dir of commonDirs) { - const candidate = path.join(dir, command); - if (fs.existsSync(candidate)) { - return candidate; - } - } - - return null; -} - -async function installServer(command: string) { - const cargoPath = findExecutable("cargo"); - if (!cargoPath) { - throw new Error("Unable to find 'cargo'. Please ensure Rust is installed and in your PATH."); - } - - const action = findExecutable(command) ? "Updating" : "Installing"; - - return window.withProgress({ - location: ProgressLocation.Notification, - title: `${action} ${command}`, - cancellable: true - }, async (progress, token) => { - return new Promise((resolve, reject) => { - const installProcess = cp.spawn(cargoPath!, ["install", "--color", "never", command]); - - token.onCancellationRequested(() => { - installProcess.kill("SIGTERM"); - reject(new Error("Installation canceled")); - }); - - const reportProgress = (data: Buffer) => { - const lines = data.toString() - .split(/\r?\n/) - .map(l => l.trim()) - - for (const line of lines) { - if (line.startsWith("Compiling") && line !== "Compiling") { - progress.report({ message: line }); - } - } - }; - - installProcess.stderr?.on('data', reportProgress); - - installProcess.on('close', (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`Installation failed with exit code ${code}`)); - } - }); - - installProcess.on('error', (err) => { - reject(new Error(`Failed to start cargo process: ${err.message}`)); - }); - }); - }); -} - -export async function ensureExecutable( - command: string, -): Promise { - const cargoPath = findExecutable("cargo"); - const config = workspace.getConfiguration("simplicityhl"); - - let serverPath = findExecutable(command); - - if (!cargoPath && !serverPath) { - const suppressWarning = config.get( - "suppressMissingLspWarning", - false, - ); - if (suppressWarning) { - return null; - } - - const choice = await window.showWarningMessage( - `To use SimplicityHL language server, please install cargo`, - "Learn more", - "Don't show again", - ); - - if (choice === "Learn more") { - const url = "https://rust-lang.org/tools/install"; - await env.openExternal(Uri.parse(url)); - } else if (choice === "Don't show again") { - const config = workspace.getConfiguration("simplicityhl"); - await config.update("suppressMissingLspWarning", true, true); - } - - return null; - } - - if (!cargoPath) { - return serverPath; - } - - const disableAutoupdate = config.get("disableAutoupdate", false); - - if (serverPath && disableAutoupdate) { - return serverPath; - } - - try { - await installServer(command); - - serverPath = findExecutable(command); - } catch (err) { - window.showErrorMessage(err); - return null; - } - - return serverPath; -} diff --git a/vscode/src/statusBar.ts b/vscode/src/statusBar.ts deleted file mode 100644 index c072e24c..00000000 --- a/vscode/src/statusBar.ts +++ /dev/null @@ -1,92 +0,0 @@ -// Status bar integration for SimplicityHL. -// Shows LSP connection status and provides quick access to commands. - -import * as vscode from "vscode"; - -// Connection states for the status bar -export type LspStatus = "starting" | "connected" | "disconnected" | "error"; - -// Manages the status bar item showing LSP state -export class StatusBar { - private statusBarItem: vscode.StatusBarItem; - private status: LspStatus = "disconnected"; - - constructor() { - // Create status bar item on the left side - this.statusBarItem = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Left, - 100 - ); - // Clicking restarts the LSP server - this.statusBarItem.command = "simplicityhl.restartServer"; - this.statusBarItem.tooltip = "SimplicityHL Language Server - Click to restart"; - this.update("disconnected"); - } - - // Update the status bar display based on LSP state - public update(status: LspStatus): void { - this.status = status; - - switch (status) { - case "starting": - this.statusBarItem.text = "$(sync~spin) SimplicityHL"; - this.statusBarItem.backgroundColor = undefined; - this.statusBarItem.tooltip = "SimplicityHL LSP starting..."; - break; - case "connected": - this.statusBarItem.text = "$(check) SimplicityHL"; - this.statusBarItem.backgroundColor = undefined; - this.statusBarItem.tooltip = "SimplicityHL LSP connected - Click to restart"; - break; - case "disconnected": - this.statusBarItem.text = "$(circle-slash) SimplicityHL"; - this.statusBarItem.backgroundColor = new vscode.ThemeColor( - "statusBarItem.warningBackground" - ); - this.statusBarItem.tooltip = "SimplicityHL LSP disconnected - Click to restart"; - break; - case "error": - this.statusBarItem.text = "$(error) SimplicityHL"; - this.statusBarItem.backgroundColor = new vscode.ThemeColor( - "statusBarItem.errorBackground" - ); - this.statusBarItem.tooltip = "SimplicityHL LSP error - Click to restart"; - break; - } - } - - // Show the status bar item - public show(): void { - this.statusBarItem.show(); - } - - // Hide the status bar item - public hide(): void { - this.statusBarItem.hide(); - } - - // Get current status - public getStatus(): LspStatus { - return this.status; - } - - // Clean up resources - public dispose(): void { - this.statusBarItem.dispose(); - } -} - -// Singleton instance -let statusBar: StatusBar | undefined; - -export function getStatusBar(): StatusBar { - if (!statusBar) { - statusBar = new StatusBar(); - } - return statusBar; -} - -export function disposeStatusBar(): void { - statusBar?.dispose(); - statusBar = undefined; -} diff --git a/vscode/src/tasks.ts b/vscode/src/tasks.ts deleted file mode 100644 index 958fdc4b..00000000 --- a/vscode/src/tasks.ts +++ /dev/null @@ -1,122 +0,0 @@ -// Task Provider for SimplicityHL. -// Integrates with VSCode's "Tasks: Run Task" command for build automation. - -import * as vscode from "vscode"; -import { getSimcPath } from "./compile"; - -// Task definition schema - matches taskDefinitions in package.json -export interface SimplicityHLTaskDefinition extends vscode.TaskDefinition { - type: "simplicityhl"; - command: "compile" | "compile-debug" | "compile-with-witness"; - file?: string; // Override file to compile (defaults to ${file}) - witnessFile?: string; // Witness file for compile-with-witness -} - -// Provides tasks to VSCode's task system -export class SimplicityHLTaskProvider implements vscode.TaskProvider { - static TaskType = "simplicityhl"; - private tasks: vscode.Task[] | undefined; - - // Called by VSCode to get list of available tasks - public async provideTasks(): Promise { - if (!this.tasks) { - this.tasks = await this.buildTasks(); - } - return this.tasks; - } - - // Called when user runs a task from tasks.json - public async resolveTask(task: vscode.Task): Promise { - const definition = task.definition as SimplicityHLTaskDefinition; - if (definition.type === SimplicityHLTaskProvider.TaskType) { - return this.createTask(definition); - } - return undefined; - } - - // Build default tasks shown in task picker - private async buildTasks(): Promise { - const tasks: vscode.Task[] = []; - - // Basic compile task - tasks.push(await this.createTask({ - type: "simplicityhl", - command: "compile", - })); - - // Compile with debug symbols - tasks.push(await this.createTask({ - type: "simplicityhl", - command: "compile-debug", - })); - - // Compile with witness - tasks.push(await this.createTask({ - type: "simplicityhl", - command: "compile-with-witness", - })); - - return tasks; - } - - // Create a VSCode task from our definition - private async createTask(definition: SimplicityHLTaskDefinition): Promise { - const simcPath = getSimcPath(); - let args: string[] = []; - let taskName: string; - - // Build command line based on task type - switch (definition.command) { - case "compile": - taskName = "Compile SimplicityHL"; - args = [definition.file || "${file}"]; - break; - case "compile-debug": - taskName = "Compile SimplicityHL (Debug)"; - args = [definition.file || "${file}", "--debug"]; - break; - case "compile-with-witness": - taskName = "Compile with Witness"; - args = [definition.file || "${file}"]; - args.push("-w"); - if (definition.witnessFile) { - args.push(definition.witnessFile); - } else { - // Default: replace .simf with .wit - args.push("${file/.simf/.wit/}"); - } - break; - } - - const execution = new vscode.ShellExecution(simcPath, args); - - const task = new vscode.Task( - definition, - vscode.TaskScope.Workspace, - taskName, - "simplicityhl", - execution, - "$simplicityhl" // Problem matcher name from package.json - ); - - // Mark as build task so it appears in build task list - task.group = vscode.TaskGroup.Build; - task.presentationOptions = { - reveal: vscode.TaskRevealKind.Always, - panel: vscode.TaskPanelKind.Shared, - }; - - return task; - } - -} - -// Register the task provider with VSCode -export function registerTaskProvider(context: vscode.ExtensionContext): void { - const taskProvider = vscode.tasks.registerTaskProvider( - SimplicityHLTaskProvider.TaskType, - new SimplicityHLTaskProvider() - ); - - context.subscriptions.push(taskProvider); -} diff --git a/vscode/syntaxes/simplicityhl.tmLanguage.json b/vscode/syntaxes/simplicityhl.tmLanguage.json deleted file mode 100644 index 48ec4a1c..00000000 --- a/vscode/syntaxes/simplicityhl.tmLanguage.json +++ /dev/null @@ -1,347 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", - "name": "SimplicityHL", - "patterns": [ - { - "include": "#preprocessor" - }, - { - "include": "#comments" - }, - { - "include": "#macros" - }, - { - "include": "#modules" - }, - { - "include": "#keywords" - }, - { - "include": "#functions" - }, - { - "include": "#types" - }, - { - "include": "#literals" - }, - { - "include": "#expressions" - } - ], - "repository": { - "preprocessor": { - "patterns": [ - { - "name": "meta.preprocessor.simplicityhl", - "match": "^\\s*#\\s*(include|define|undef|if|ifdef|ifndef|else|elif|endif|line|error|pragma)\\b", - "captures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - } - } - }, - { - "name": "meta.preprocessor.include.simplicityhl", - "match": "^\\s*#\\s*include\\s+([\"<].*[\">])", - "captures": { - "1": { - "name": "string.quoted.other.lt-gt.include.simplicityhl" - } - } - }, - { - "name": "meta.preprocessor.define.simplicityhl", - "begin": "^\\s*#\\s*(define)\\s+([a-zA-Z_][a-zA-Z0-9_]*)", - "beginCaptures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - }, - "2": { - "name": "entity.name.function.preprocessor.simplicityhl" - } - }, - "end": "(?=(?://|/\\*))|$", - "patterns": [ - { - "include": "#preprocessor-expression" - } - ] - }, - { - "name": "meta.preprocessor.macro.simplicityhl", - "begin": "^\\s*#\\s*(define)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\(", - "beginCaptures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - }, - "2": { - "name": "entity.name.function.preprocessor.simplicityhl" - } - }, - "end": "\\)|(?=(?://|/\\*))|$", - "patterns": [ - { - "name": "variable.parameter.preprocessor.simplicityhl", - "match": "[a-zA-Z_][a-zA-Z0-9_]*" - }, - { - "name": "punctuation.separator.parameters.simplicityhl", - "match": "," - } - ] - }, - { - "name": "meta.preprocessor.conditional.simplicityhl", - "begin": "^\\s*#\\s*(if|ifdef|ifndef|elif)\\b", - "beginCaptures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - } - }, - "end": "(?=(?://|/\\*))|$", - "patterns": [ - { - "include": "#preprocessor-expression" - } - ] - } - ] - }, - "preprocessor-expression": { - "patterns": [ - { - "name": "constant.language.preprocessor.simplicityhl", - "match": "\\b(defined)\\b" - }, - { - "name": "entity.name.function.preprocessor.simplicityhl", - "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" - }, - { - "include": "#literals" - }, - { - "name": "keyword.operator.preprocessor.simplicityhl", - "match": "&&|\\|\\||==|!=|<=|>=|<|>|!|&&|\\|\\||\\+|\\-|\\*|\\/|%|<<|>>|&|\\||\\^|~" - } - ] - }, - "comments": { - "patterns": [ - { - "name": "comment.line.double-slash.simplicityhl", - "match": "//.*$" - }, - { - "name": "comment.block.simplicityhl", - "begin": "/\\*", - "end": "\\*/" - } - ] - }, - "keywords": { - "patterns": [ - { - "name": "storage.type.function.simplicityhl", - "match": "\\bfn\\b" - }, - { - "name": "storage.type.simplicityhl", - "match": "\\btype\\b" - }, - { - "name": "keyword.other.simplicityhl", - "match": "\\b(mod|const|use|as|crate|pub)\\b" - }, - { - "name": "storage.type.simplicityhl", - "match": "\\blet\\b" - }, - { - "name": "keyword.control.simplicityhl", - "match": "\\b(match|if|else|while|for|return)\\b" - }, - { - "name": "keyword.operator.simplicityhl", - "match": "(->|=>|=|:|,|;)" - } - ] - }, - "macros": { - "patterns": [ - { - "match": "\\b(assert|panic)(!)(\\s*\\(|\\s|$)", - "captures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - }, - "2": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - } - } - }, - { - "match": "\\b([a-z][a-zA-Z0-9_]*)(!)(\\s*\\(|\\s|$)", - "captures": { - "1": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - }, - "2": { - "name": "keyword.other.preprocessor.directive.simplicityhl" - } - } - } - ] - }, - "functions": { - "patterns": [ - { - "name": "entity.name.function.simplicityhl", - "match": "\\b(unwrap_left|unwrap_right|for_while|is_none|array_fold|unwrap|into|fold|dbg)\\b" - }, - { - "match": "\\b(fn)\\s+([a-zA-Z][a-zA-Z0-9_]*)\\s*\\(", - "captures": { - "1": { - "name": "storage.type.function.simplicityhl" - }, - "2": { - "name": "entity.name.function.simplicityhl" - } - } - }, - { - "match": "\\b([a-zA-Z][a-zA-Z0-9_]*)(?!!\\s*)\\s*\\(", - "captures": { - "1": { - "name": "entity.name.function.call.simplicityhl" - } - } - } - ] - }, - "types": { - "patterns": [ - { - "name": "entity.name.type.simplicityhl", - "match": "\\b(Either|Option|bool|List|u128|u256|u16|u32|u64|u1|u2|u4|u8)\\b" - }, - { - "name": "entity.name.type.simplicityhl", - "match": "\\b(Ctx8|Pubkey|Message64|Message|Signature|Scalar|Fe|Gej|Ge|Point|Height|Time|Distance|Duration|Lock|Outpoint|Confidential1|ExplicitAsset|Asset1|ExplicitAmount|Amount1|ExplicitNonce|Nonce|TokenAmount1)\\b" - }, - { - "match": "\\b(type)\\s+([A-Z][a-zA-Z0-9_]*)\\s*=", - "captures": { - "1": { - "name": "storage.type.simplicityhl" - }, - "2": { - "name": "entity.name.type.alias.simplicityhl" - } - } - }, - { - "match": "\\b([A-Z][a-zA-Z0-9_]*)\\b", - "captures": { - "1": { - "name": "entity.name.type.simplicityhl" - } - } - }, - { - "match": ":\\s*([a-zA-Z][a-zA-Z0-9_]*|Either<.*>|Option<.*>|\\(.*\\)|\\[.*\\]|List<.*>)", - "captures": { - "1": { - "name": "entity.name.type.simplicityhl" - } - } - } - ] - }, - "literals": { - "patterns": [ - { - "name": "constant.numeric.decimal.simplicityhl", - "match": "\\b[0-9][0-9_]*\\b" - }, - { - "name": "constant.numeric.binary.simplicityhl", - "match": "\\b0b[01_]+\\b" - }, - { - "name": "constant.numeric.hex.simplicityhl", - "match": "\\b0x[0-9a-fA-F_]+\\b" - }, - { - "name": "constant.language.boolean.simplicityhl", - "match": "\\b(true|false)\\b" - }, - { - "name": "constant.language.simplicityhl", - "match": "\\b(None)\\b" - }, - { - "name": "string.quoted.double.simplicityhl", - "begin": "\"", - "end": "\"", - "patterns": [ - { - "name": "constant.character.escape.simplicityhl", - "match": "\\\\." - } - ] - } - ] - }, - "expressions": { - "patterns": [ - { - "match": "\\b(jet|witness|param)::(\\w+)", - "captures": { - "1": { - "name": "entity.name.namespace.simplicityhl" - }, - "2": { - "name": "entity.name.function.simplicityhl" - } - } - }, - { - "name": "variable.other.simplicityhl", - "match": "\\b[a-z][a-zA-Z0-9_]*\\b" - }, - { - "match": "\\b(Left|Right|Some)\\s*\\(", - "captures": { - "1": { - "name": "support.function.simplicityhl" - } - } - } - ] - }, - "modules": { - "patterns": [ - { - "match": "\\b(mod)\\s+(witness|param)\\b", - "captures": { - "1": { - "name": "keyword.other.simplicityhl" - }, - "2": { - "name": "entity.name.namespace.simplicityhl" - } - } - }, - { - "match": "\\b(jet)\\b", - "name": "entity.name.namespace.simplicityhl" - } - ] - } - }, - "scopeName": "source.simplicityhl" -} diff --git a/vscode/syntaxes/witness.tmLanguage.json b/vscode/syntaxes/witness.tmLanguage.json deleted file mode 100644 index a1b3fbaa..00000000 --- a/vscode/syntaxes/witness.tmLanguage.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "Witness", - "scopeName": "source.wit", - "patterns": [ - { "include": "#value" } - ], - "repository": { - "value": { - "patterns": [ - { "include": "#object" }, - { "include": "#array" }, - { "include": "#string" }, - { "include": "#number" }, - { "include": "#constant" } - ] - }, - "object": { - "begin": "\\{", - "beginCaptures": { "0": { "name": "punctuation.definition.object.begin.json" } }, - "end": "\\}", - "endCaptures": { "0": { "name": "punctuation.definition.object.end.json" } }, - "name": "meta.structure.dictionary.json", - "patterns": [ - { - "match": "\"(\\\\.|[^\"])*\"(?=\\s*:)", - "name": "string.quoted.double.json" - }, - { - "match": ":", - "name": "punctuation.separator.dictionary.key-value.json" - }, - { "include": "#value" }, - { - "match": ",", - "name": "punctuation.separator.dictionary.pair.json" - } - ] - }, - "array": { - "begin": "\\[", - "beginCaptures": { "0": { "name": "punctuation.definition.array.begin.json" } }, - "end": "\\]", - "endCaptures": { "0": { "name": "punctuation.definition.array.end.json" } }, - "name": "meta.structure.array.json", - "patterns": [ - { "include": "#value" }, - { - "match": ",", - "name": "punctuation.separator.array.json" - } - ] - }, - "string": { - "match": "\"(\\\\.|[^\"])*\"", - "name": "string.quoted.double.json" - }, - "number": { - "match": "-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?", - "name": "constant.numeric.json" - }, - "constant": { - "match": "\\b(true|false|null)\\b", - "name": "constant.language.json" - } - }, - "fileTypes": ["json", "wit"], - "uuid": "b8b8b8b8-b8b8-4b8b-b8b8" -} diff --git a/vscode/tsconfig.json b/vscode/tsconfig.json deleted file mode 100644 index 0d99a7d8..00000000 --- a/vscode/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "NodeNext", - "target": "ES2024", - "lib": [ - "ES2024" - ], - "outDir": "out", - "rootDir": "src", - "sourceMap": true - }, - "include": [ - "src" - ], - "exclude": [ - "node_modules", - ".vscode-test" - ], -} diff --git a/vscode/witness-configuration.json b/vscode/witness-configuration.json deleted file mode 100644 index 5576fb4f..00000000 --- a/vscode/witness-configuration.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "brackets": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] - ], - "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" }, - { "open": "\"", "close": "\"" } - ], - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""] - ] -}