From a0205d67cfed2c0ecc96cc542a55fdf7e8ebd597 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 23 Jan 2026 15:15:05 +0000 Subject: [PATCH] test cartridge for lua and js --- README.md | 2 +- .../src/backend/emit_bytecode.rs | 35 +- crates/prometeu-compiler/src/compiler.rs | 45 +- .../prometeu-compiler/src/frontends/ts/mod.rs | 31 +- .../src/frontends/ts/to_ir.rs | 42 +- crates/prometeu-compiler/src/ir/instr.rs | 85 +- crates/prometeu-compiler/src/ir/module.rs | 27 + crates/prometeu-compiler/src/lib.rs | 38 +- test-cartridges/README.md | 2 +- .../cartridge/assets.pa | Bin .../cartridge/manifest.json | 0 .../prometeu-sdk | 0 test-cartridges/color-square-lua/run.sh | 7 + test-cartridges/color-square-lua/src/main.lua | 16 + .../color-square-lua/src/my_fs.lua | 15 + .../color-square-lua/src/my_gfx.lua | 17 + .../color-square-lua/src/my_input.lua | 21 + .../color-square-ts/cartridge/assets.pa | Bin 0 -> 90504 bytes .../color-square-ts/cartridge/manifest.json | 41 + .../cartridge/program.disasm.txt | 0 .../cartridge}/program.pbc | Bin .../cartridge/symbols.json | 0 .../eslint.config.js | 0 .../package-lock.json | 0 .../package.json | 0 test-cartridges/color-square-ts/prometeu-sdk | 1 + .../{color-square => color-square-ts}/run.sh | 0 .../src/main.ts | 0 .../src/my_fs.ts | 0 .../src/my_gfx.ts | 0 .../src/my_input.ts | 0 .../tsconfig.json | 0 .../color-square/build/program.disasm.txt | 191 --- .../color-square/build/symbols.json | 986 ----------- .../color-square/cartridge/program.pbc | Bin 1290 -> 0 bytes .../node_modules/.package-lock.json | 1510 ----------------- .../color-square/node_modules/@prometeu/sdk | 1 - 37 files changed, 400 insertions(+), 2713 deletions(-) rename test-cartridges/{color-square => color-square-lua}/cartridge/assets.pa (100%) rename test-cartridges/{color-square => color-square-lua}/cartridge/manifest.json (100%) rename test-cartridges/{color-square => color-square-lua}/prometeu-sdk (100%) create mode 100644 test-cartridges/color-square-lua/run.sh create mode 100644 test-cartridges/color-square-lua/src/main.lua create mode 100644 test-cartridges/color-square-lua/src/my_fs.lua create mode 100644 test-cartridges/color-square-lua/src/my_gfx.lua create mode 100644 test-cartridges/color-square-lua/src/my_input.lua create mode 100644 test-cartridges/color-square-ts/cartridge/assets.pa create mode 100644 test-cartridges/color-square-ts/cartridge/manifest.json rename test-cartridges/{color-square => color-square-ts}/cartridge/program.disasm.txt (100%) rename test-cartridges/{color-square/build => color-square-ts/cartridge}/program.pbc (100%) rename test-cartridges/{color-square => color-square-ts}/cartridge/symbols.json (100%) rename test-cartridges/{color-square => color-square-ts}/eslint.config.js (100%) rename test-cartridges/{color-square => color-square-ts}/package-lock.json (100%) rename test-cartridges/{color-square => color-square-ts}/package.json (100%) create mode 120000 test-cartridges/color-square-ts/prometeu-sdk rename test-cartridges/{color-square => color-square-ts}/run.sh (100%) rename test-cartridges/{color-square => color-square-ts}/src/main.ts (100%) rename test-cartridges/{color-square => color-square-ts}/src/my_fs.ts (100%) rename test-cartridges/{color-square => color-square-ts}/src/my_gfx.ts (100%) rename test-cartridges/{color-square => color-square-ts}/src/my_input.ts (100%) rename test-cartridges/{color-square => color-square-ts}/tsconfig.json (100%) delete mode 100644 test-cartridges/color-square/build/program.disasm.txt delete mode 100644 test-cartridges/color-square/build/symbols.json delete mode 100644 test-cartridges/color-square/cartridge/program.pbc delete mode 100644 test-cartridges/color-square/node_modules/.package-lock.json delete mode 120000 test-cartridges/color-square/node_modules/@prometeu/sdk diff --git a/README.md b/README.md index 50c7b8ab..376ea476 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ cargo build To run an example cartridge: ```bash -./target/debug/prometeu run test-cartridges/color-square +./target/debug/prometeu run test-cartridges/color-square-ts ``` For more details on how to use the CLI, see the **[prometeu](./crates/prometeu)** README. diff --git a/crates/prometeu-compiler/src/backend/emit_bytecode.rs b/crates/prometeu-compiler/src/backend/emit_bytecode.rs index fa0daeac..7d109ada 100644 --- a/crates/prometeu-compiler/src/backend/emit_bytecode.rs +++ b/crates/prometeu-compiler/src/backend/emit_bytecode.rs @@ -1,3 +1,12 @@ +//! # Bytecode Emitter +//! +//! This module is responsible for the final stage of the compilation process: +//! converting the Intermediate Representation (IR) into the binary Prometeu ByteCode (PBC) format. +//! +//! It performs two main tasks: +//! 1. **Instruction Lowering**: Translates `ir::Instruction` into `prometeu_bytecode::asm::Asm` ops. +//! 2. **Symbol Mapping**: Associates bytecode offsets (Program Counter) with source code locations. + use crate::common::files::FileManager; use crate::common::symbols::Symbol; use crate::ir; @@ -7,29 +16,38 @@ use prometeu_bytecode::asm::{assemble, update_pc_by_operand, Asm, Operand}; use prometeu_bytecode::opcode::OpCode; use prometeu_bytecode::pbc::{write_pbc, ConstantPoolEntry, PbcFile}; +/// The final output of the code generation phase. pub struct EmitResult { + /// The serialized binary data of the PBC file. pub rom: Vec, + /// Metadata mapping bytecode offsets to source code positions. pub symbols: Vec, } +/// Entry point for emitting a bytecode module from the IR. pub fn emit_module(module: &ir::Module, file_manager: &FileManager) -> Result { let mut emitter = BytecodeEmitter::new(file_manager); emitter.emit(module) } +/// Internal helper for managing the bytecode emission state. struct BytecodeEmitter<'a> { + /// Stores constant values (like strings) that are referenced by instructions. constant_pool: Vec, + /// Used to look up source code positions for symbol generation. file_manager: &'a FileManager, } impl<'a> BytecodeEmitter<'a> { fn new(file_manager: &'a FileManager) -> Self { Self { + // Index 0 is traditionally reserved for Null in many VMs constant_pool: vec![ConstantPoolEntry::Null], file_manager, } } + /// Adds a value to the constant pool if it doesn't exist, returning its unique index. fn add_constant(&mut self, entry: ConstantPoolEntry) -> u32 { if let Some(pos) = self.constant_pool.iter().position(|e| e == &entry) { pos as u32 @@ -40,16 +58,22 @@ impl<'a> BytecodeEmitter<'a> { } } + /// Transforms an IR module into a binary PBC file. fn emit(&mut self, module: &ir::Module) -> Result { let mut asm_instrs = Vec::new(); let mut ir_instr_map = Vec::new(); // Maps Asm index to IR instruction (for symbols) + // --- PHASE 1: Lowering IR to Assembly-like structures --- for function in &module.functions { + // Each function starts with a label for its entry point. asm_instrs.push(Asm::Label(function.name.clone())); ir_instr_map.push(None); for instr in &function.body { let start_idx = asm_instrs.len(); + + // Translate each IR instruction to its equivalent Bytecode OpCode. + // Note: IR instructions are high-level, while Bytecode is low-level. match &instr.kind { InstrKind::Nop => asm_instrs.push(Asm::Op(OpCode::Nop, vec![])), InstrKind::Halt => asm_instrs.push(Asm::Op(OpCode::Halt, vec![])), @@ -63,6 +87,7 @@ impl<'a> BytecodeEmitter<'a> { asm_instrs.push(Asm::Op(OpCode::PushBool, vec![Operand::Bool(*v)])); } InstrKind::PushString(s) => { + // Strings are stored in the constant pool. let id = self.add_constant(ConstantPoolEntry::String(s.clone())); asm_instrs.push(Asm::Op(OpCode::PushConst, vec![Operand::U32(id)])); } @@ -131,9 +156,12 @@ impl<'a> BytecodeEmitter<'a> { } } + // --- PHASE 2: Assembly (Label Resolution) --- + // Converts the list of Ops and Labels into raw bytes, calculating jump offsets. let bytecode = assemble(&asm_instrs).map_err(|e| anyhow!(e))?; - // Resolve symbols + // --- PHASE 3: Symbol Generation --- + // Associates each bytecode offset with a line/column in the source file. let mut symbols = Vec::new(); let mut current_pc = 0u32; for (i, asm) in asm_instrs.iter().enumerate() { @@ -153,15 +181,20 @@ impl<'a> BytecodeEmitter<'a> { } } + // Track the Program Counter (PC) as we iterate through instructions. match asm { Asm::Label(_) => {} Asm::Op(_opcode, operands) => { + // Each OpCode takes 2 bytes (1 for opcode, 1 for padding/metadata) current_pc += 2; + // Operands take additional space depending on their type. current_pc = update_pc_by_operand(current_pc, operands); } } } + // --- PHASE 4: Serialization --- + // Packages the constant pool and bytecode into the final PBC format. let pbc = PbcFile { cp: self.constant_pool.clone(), rom: bytecode, diff --git a/crates/prometeu-compiler/src/compiler.rs b/crates/prometeu-compiler/src/compiler.rs index 95b0e66f..599202fc 100644 --- a/crates/prometeu-compiler/src/compiler.rs +++ b/crates/prometeu-compiler/src/compiler.rs @@ -1,3 +1,8 @@ +//! # Compiler Orchestration +//! +//! This module provides the high-level API for triggering the compilation process. +//! It handles the transition between different compiler phases: Frontend -> IR -> Backend. + use crate::backend; use crate::common::files::FileManager; use crate::common::symbols::Symbol; @@ -10,14 +15,22 @@ use std::path::Path; /// The result of a successful compilation process. /// It contains the final binary and the metadata needed for debugging. pub struct CompilationUnit { - /// The raw binary data (PBC format). + /// The raw binary data formatted as Prometeu ByteCode (PBC). + /// This is what gets written to a `.pbc` file. pub rom: Vec, - /// The list of debug symbols for source mapping. + + /// The list of debug symbols discovered during compilation. + /// These are used to map bytecode offsets back to source code locations. pub symbols: Vec, } impl CompilationUnit { - /// Writes the compilation results to the disk. + /// Writes the compilation results (PBC binary, disassembly, and symbols) to the disk. + /// + /// # Arguments + /// * `out` - The base path for the output `.pbc` file. + /// * `emit_disasm` - If true, a `.disasm` file will be created next to the output. + /// * `emit_symbols` - If true, a `.json` symbols file will be created next to the output. pub fn export(&self, out: &Path, emit_disasm: bool, emit_symbols: bool) -> Result<()> { let artifacts = backend::artifacts::Artifacts::new(self.rom.clone(), self.symbols.clone()); artifacts.export(out, emit_disasm, emit_symbols) @@ -25,21 +38,45 @@ impl CompilationUnit { } /// Orchestrates the compilation of a Prometeu project starting from an entry file. +/// +/// This function executes the full compiler pipeline: +/// 1. **Frontend**: Loads and parses the entry file (and its dependencies). +/// Currently, it uses the `TypescriptFrontend`. +/// 2. **IR Generation**: The frontend produces a high-level Intermediate Representation (IR). +/// 3. **Validation**: Checks the IR for consistency and VM compatibility. +/// 4. **Backend**: Lowers the IR into final Prometeu ByteCode. +/// +/// # Errors +/// Returns an error if parsing fails, validation finds issues, or code generation fails. +/// +/// # Example +/// ```no_run +/// use std::path::Path; +/// let entry = Path::new("src/main.ts"); +/// let unit = prometeu_compiler::compiler::compile(entry).expect("Failed to compile"); +/// unit.export(Path::new("build/program.pbc"), true, true).unwrap(); +/// ``` pub fn compile(entry: &Path) -> Result { let mut file_manager = FileManager::new(); // 1. Select Frontend (Currently only TS is supported) + // The frontend is responsible for parsing source code and producing the IR. let frontend = TypescriptFrontend; - // 2. Compile to IR + // 2. Compile to IR (Intermediate Representation) + // This step abstracts away source-specific syntax (like TypeScript) into a + // generic set of instructions that the backend can understand. let ir_module = frontend.compile_to_ir(entry, &mut file_manager) .map_err(|bundle| anyhow::anyhow!("Compilation failed with {} errors", bundle.diagnostics.len()))?; // 3. IR Validation + // Ensures the generated IR is sound and doesn't violate any VM constraints + // before we spend time generating bytecode. ir::validate::validate_module(&ir_module) .map_err(|bundle| anyhow::anyhow!("IR Validation failed: {:?}", bundle))?; // 4. Emit Bytecode + // The backend takes the validated IR and produces the final binary executable. let result = backend::emit_module(&ir_module, &file_manager)?; Ok(CompilationUnit { diff --git a/crates/prometeu-compiler/src/frontends/ts/mod.rs b/crates/prometeu-compiler/src/frontends/ts/mod.rs index ee9ca1b1..52be255c 100644 --- a/crates/prometeu-compiler/src/frontends/ts/mod.rs +++ b/crates/prometeu-compiler/src/frontends/ts/mod.rs @@ -1,3 +1,12 @@ +//! # TypeScript Frontend +//! +//! This module implements the TypeScript/JavaScript frontend for the Prometeu Compiler. +//! It is responsible for: +//! 1. Parsing `.ts` files into an Abstract Syntax Tree (AST). +//! 2. Resolving imports and building a dependency graph. +//! 3. Validating that the source code uses only supported VM features. +//! 4. Lowering the high-level AST into the generic Intermediate Representation (IR). + pub mod parse; pub mod resolve; pub mod validate; @@ -14,6 +23,7 @@ use std::collections::{HashMap, VecDeque}; use std::fs; use std::path::Path; +/// The main entry point for the TypeScript compiler frontend. pub struct TypescriptFrontend; impl Frontend for TypescriptFrontend { @@ -21,6 +31,21 @@ impl Frontend for TypescriptFrontend { "typescript" } + /// Compiles a TypeScript entry file (and all its dependencies) into an IR Module. + /// + /// # The Compilation Pipeline: + /// + /// 1. **Discovery & Parsing**: + /// Starting from the `entry` file, it reads, parses, and discovers imports recursively. + /// It uses the `oxc` parser for high-performance AST generation. + /// + /// 2. **Semantic Validation**: + /// Each parsed module is checked against the `Validator`. Since Prometeu is a + /// specialized VM, it doesn't support the full range of TS/JS features (e.g., no `try/catch` yet). + /// + /// 3. **IR Lowering**: + /// Once all modules are parsed and validated, the `ToIR` engine traverses the ASTs + /// and emits equivalent IR instructions. fn compile_to_ir( &self, entry: &Path, @@ -35,6 +60,7 @@ impl Frontend for TypescriptFrontend { queue.push_back(entry_abs.clone()); // --- PHASE 1: Dependency Resolution and Parsing --- + // We traverse the dependency graph breadth-first to ensure all files are loaded. while let Some(path) = queue.pop_front() { let path_str: String = path.to_string_lossy().into_owned(); if modules.contains_key(&path_str) { @@ -45,12 +71,14 @@ impl Frontend for TypescriptFrontend { let file_id = file_manager.add(path.clone(), source_text.clone()); let source_text_ptr = allocator.alloc_str(&source_text); + // Parse the source into an AST let program = parse::parse_file(&allocator, &path).map_err(|e| DiagnosticBundle::error(format!("Failed to parse module: {}", e), None))?; // --- PHASE 2: Individual Module Validation --- + // Ensure the code adheres to Prometeu's restricted subset of TypeScript. validate::Validator::validate(&program).map_err(|e| DiagnosticBundle::error(format!("Validation error: {}", e), None))?; - // Discover new imports + // Discover new imports and add them to the queue for item in &program.body { if let oxc_ast::ast::Statement::ImportDeclaration(decl) = item { let import_path = decl.source.value.as_str(); @@ -63,6 +91,7 @@ impl Frontend for TypescriptFrontend { } // --- PHASE 3: To IR --- + // Collect all parsed modules and feed them into the IR generator. let entry_str = entry_abs.to_string_lossy().to_string(); let mut program_list = Vec::new(); diff --git a/crates/prometeu-compiler/src/frontends/ts/to_ir.rs b/crates/prometeu-compiler/src/frontends/ts/to_ir.rs index b031c7a9..7be2c9bf 100644 --- a/crates/prometeu-compiler/src/frontends/ts/to_ir.rs +++ b/crates/prometeu-compiler/src/frontends/ts/to_ir.rs @@ -1,3 +1,34 @@ +//! # To IR Lowering +//! +//! This module implements the core translation logic from the TypeScript AST (Abstract Syntax Tree) +//! into the Prometeu Intermediate Representation (IR). +//! +//! ## How it works: +//! +//! The `ToIR` engine traverses the AST and for each node (expression, statement, etc.), +//! it emits equivalent stack-based IR instructions. +//! +//! ### Symbol Resolution +//! It maintains a scoped symbol table to track local variables and their assigned slots. +//! It also manages global variables, which are mapped to permanent memory slots in the VM. +//! +//! ### Control Flow +//! High-level control flow (like `if`, `while`, `for`) is lowered into jumps and labels. +//! Unique labels are generated for each branch to avoid collisions. +//! +//! ### Example Translation: +//! **TS Source:** +//! ```typescript +//! let x = 10 + 20; +//! ``` +//! **Generated IR:** +//! ```text +//! PushInt(10) +//! PushInt(20) +//! Add +//! SetLocal(0) +//! ``` + use crate::frontends::ts::syscall_map; use crate::common::spans::Span as IRSpan; use crate::frontends::ts::ast_util; @@ -14,11 +45,15 @@ use prometeu_core::model::Color; use std::collections::HashMap; /// Helper to count local variables and hoisted functions in a function body. +/// +/// This is used to determine how many slots need to be reserved on the stack frame +/// before executing a function. struct LocalCounter { count: u32, } impl<'a> Visit<'a> for LocalCounter { + /// Discovers function declarations which also occupy a slot in the current frame. fn visit_statement(&mut self, stmt: &Statement<'a>) { match stmt { Statement::FunctionDeclaration(f) => { @@ -28,6 +63,7 @@ impl<'a> Visit<'a> for LocalCounter { } } + /// Discovers variable declarations (let/const/var) and increments the local count. fn visit_variable_declaration(&mut self, decl: &VariableDeclaration<'a>) { self.count += decl.declarations.len() as u32; walk::walk_variable_declaration(self, decl); @@ -43,8 +79,11 @@ impl<'a> Visit<'a> for LocalCounter { /// Metadata for a symbol (variable or function) in the symbol table. struct SymbolEntry { + /// The unique index assigned to this variable in the current frame or global memory. slot_index: u32, + /// Whether the variable was declared with `const`. is_const: bool, + /// Tracks if the variable has been assigned a value (used for Temporal Dead Zone checks). is_initialized: bool, } @@ -59,12 +98,13 @@ pub struct ToIR { /// The stream of generated IR instructions. pub instructions: Vec, /// Scoped symbol table. Each element is a scope level containing a map of symbols. + /// This allows for variable shadowing and block scope resolution. symbol_table: Vec>, /// Current depth of the scope (0 is global/function top-level). scope_depth: usize, /// Mapping of global variable names to their slots in the VM's global memory. globals: HashMap, - /// Counter for the next available local variable ID. + /// Counter for the next available local variable ID in the current function. next_local: u32, /// Counter for the next available global variable ID. next_global: u32, diff --git a/crates/prometeu-compiler/src/ir/instr.rs b/crates/prometeu-compiler/src/ir/instr.rs index 31bfa798..2b2b4a61 100644 --- a/crates/prometeu-compiler/src/ir/instr.rs +++ b/crates/prometeu-compiler/src/ir/instr.rs @@ -1,78 +1,147 @@ +//! # IR Instructions +//! +//! This module defines the set of instructions used in the Intermediate Representation (IR). +//! These instructions are designed to be easy to generate from a high-level AST and +//! easy to lower into VM-specific bytecode. + use crate::common::spans::Span; +/// An `Instruction` combines an instruction's behavior (`kind`) with its +/// source code location (`span`) for debugging and error reporting. #[derive(Debug, Clone)] pub struct Instruction { pub kind: InstrKind, + /// The location in the original source code that generated this instruction. pub span: Option, } impl Instruction { + /// Creates a new instruction with an optional source span. pub fn new(kind: InstrKind, span: Option) -> Self { Self { kind, span } } } +/// A `Label` represents a destination for a jump instruction. +/// During the assembly phase, labels are resolved into actual memory offsets. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Label(pub String); +/// The various types of operations that can be performed in the IR. +/// +/// The IR uses a stack-based model, similar to the final Prometeu ByteCode. #[derive(Debug, Clone)] pub enum InstrKind { + /// Does nothing. Nop, + /// Terminates program execution. Halt, - // Literals + // --- Literals --- + // These instructions push a constant value onto the stack. + + /// Pushes a 64-bit integer onto the stack. PushInt(i64), + /// Pushes a 64-bit float onto the stack. PushFloat(f64), + /// Pushes a boolean onto the stack. PushBool(bool), + /// Pushes a string literal onto the stack. PushString(String), + /// Pushes a `null` value onto the stack. PushNull, - // Stack Ops + // --- Stack Operations --- + + /// Removes the top value from the stack. Pop, + /// Duplicates the top value on the stack. Dup, + /// Swaps the top two values on the stack. Swap, - // Arithmetic + // --- Arithmetic --- + // These take two values from the stack and push the result. + + /// Addition: `a + b` Add, + /// Subtraction: `a - b` Sub, + /// Multiplication: `a * b` Mul, + /// Division: `a / b` Div, + /// Negation: `-a` (takes one value) Neg, - // Logical/Comparison + // --- Logical/Comparison --- + + /// Equality: `a == b` Eq, + /// Inequality: `a != b` Neq, + /// Less than: `a < b` Lt, + /// Greater than: `a > b` Gt, + /// Less than or equal: `a <= b` Lte, + /// Greater than or equal: `a >= b` Gte, + /// Logical AND: `a && b` And, + /// Logical OR: `a || b` Or, + /// Logical NOT: `!a` Not, - // Bitwise + // --- Bitwise Operations --- + + /// Bitwise AND: `a & b` BitAnd, + /// Bitwise OR: `a | b` BitOr, + /// Bitwise XOR: `a ^ b` BitXor, + /// Shift Left: `a << b` Shl, + /// Shift Right: `a >> b` Shr, - // Variables + // --- Variable Access --- + + /// Retrieves a value from a local variable slot and pushes it onto the stack. GetLocal(u32), + /// Pops a value from the stack and stores it in a local variable slot. SetLocal(u32), + /// Retrieves a value from a global variable slot and pushes it onto the stack. GetGlobal(u32), + /// Pops a value from the stack and stores it in a global variable slot. SetGlobal(u32), - // Control Flow + // --- Control Flow --- + + /// Unconditionally jumps to the specified label. Jmp(Label), + /// Pops a boolean from the stack. If false, jumps to the specified label. JmpIfFalse(Label), + /// Defines a location that can be jumped to. Does not emit code by itself. Label(Label), + /// Calls a function by name with the specified number of arguments. + /// Arguments should be pushed onto the stack before calling. Call { name: String, arg_count: u32 }, + /// Returns from the current function. The return value (if any) should be on top of the stack. Ret, - // OS / System + // --- OS / System --- + + /// Triggers a system call (e.g., drawing to the screen, reading input). Syscall(u32), + /// Special instruction to synchronize with the hardware frame clock. FrameSync, + + /// Internal: Pushes a new lexical scope (used for variable resolution). PushScope, + /// Internal: Pops the current lexical scope. PopScope, } diff --git a/crates/prometeu-compiler/src/ir/module.rs b/crates/prometeu-compiler/src/ir/module.rs index ac038980..2784b078 100644 --- a/crates/prometeu-compiler/src/ir/module.rs +++ b/crates/prometeu-compiler/src/ir/module.rs @@ -1,35 +1,62 @@ +//! # IR Module Structure +//! +//! This module defines the structure of the Intermediate Representation (IR). +//! The IR is a higher-level representation of the program than bytecode, but lower +//! than the source code AST. It is organized into Modules, Functions, and Globals. + use crate::ir::instr::Instruction; use crate::ir::types::Type; +/// A `Module` is the top-level container for a compiled program or library. +/// It contains a collection of global variables and functions. #[derive(Debug, Clone)] pub struct Module { + /// The name of the module (usually derived from the project name). pub name: String, + /// List of all functions defined in this module. pub functions: Vec, + /// List of all global variables available in this module. pub globals: Vec, } +/// Represents a function in the IR. +/// +/// Functions consist of a signature (name, parameters, return type) and a body +/// which is a flat list of IR instructions. #[derive(Debug, Clone)] pub struct Function { + /// The unique name of the function. pub name: String, + /// The list of input parameters. pub params: Vec, + /// The type of value this function returns. pub return_type: Type, + /// The sequence of instructions that make up the function's logic. pub body: Vec, } +/// A parameter passed to a function. #[derive(Debug, Clone)] pub struct Param { + /// The name of the parameter (useful for debugging and symbols). pub name: String, + /// The data type of the parameter. pub r#type: Type, } +/// A global variable accessible by any function in the module. #[derive(Debug, Clone)] pub struct Global { + /// The name of the global variable. pub name: String, + /// The data type of the variable. pub r#type: Type, + /// The unique memory slot index assigned to this global variable. pub slot: u32, } impl Module { + /// Creates a new, empty module with the given name. pub fn new(name: String) -> Self { Self { name, diff --git a/crates/prometeu-compiler/src/lib.rs b/crates/prometeu-compiler/src/lib.rs index 75a82391..e5839697 100644 --- a/crates/prometeu-compiler/src/lib.rs +++ b/crates/prometeu-compiler/src/lib.rs @@ -1,19 +1,41 @@ //! # Prometeu Compiler //! //! This crate provides the official compiler for the Prometeu ecosystem. -//! It translates TypeScript/JavaScript source code into Prometeu ByteCode (.pbc). +//! It translates high-level source code (primarily TypeScript/JavaScript) into +//! Prometeu ByteCode (.pbc), which runs on the Prometeu Virtual Machine. //! -//! ## Workflow: -//! 1. **Parsing**: Uses the `oxc` parser to generate an Abstract Syntax Tree (AST). -//! 2. **Validation**: Checks for unsupported features and ensures ABI compliance. -//! 3. **Codegen**: Traverses the AST and emits `prometeu-bytecode` instructions. -//! 4. **Assembly**: Resolves labels and serializes the program into the binary PBC format. +//! ## Architecture Overview: +//! +//! The compiler follows a multi-stage pipeline: +//! +//! 1. **Frontend (Parsing & Analysis)**: +//! - Uses the `oxc` parser to generate an Abstract Syntax Tree (AST). +//! - Performs semantic analysis and validation (e.g., ensuring only supported TS features are used). +//! - Lowers the AST into the **Intermediate Representation (IR)**. +//! - *Example*: Converting a `a + b` expression into IR instructions like `Push(a)`, `Push(b)`, `Add`. +//! +//! 2. **IR Optimization (Optional/Planned)**: +//! - Simplifies the IR to improve performance or reduce bytecode size. +//! +//! 3. **Backend (Code Generation)**: +//! - **Lowering**: Converts the high-level IR into a flat list of ByteCode instructions. +//! - **Assembly**: Resolves branch labels into actual memory offsets. +//! - **Serialization**: Encodes the instructions into the binary PBC format. +//! +//! 4. **Artifact Export**: +//! - Generates the `.pbc` binary file. +//! - Optionally produces `.disasm` (disassembly for debugging) and `.json` (symbol maps). +//! +//! ## Example Usage (CLI): //! -//! ## Example Usage: //! ```bash -//! # Build a project +//! # Build a project from a directory //! prometeu-compiler build ./my-game --entry ./src/main.ts --out ./game.pbc //! ``` +//! +//! ## Programmatic Entry Point: +//! +//! See the [`compiler`] module for the main entry point to trigger a compilation programmatically. pub mod common; pub mod ir; diff --git a/test-cartridges/README.md b/test-cartridges/README.md index 597dd17e..a6b98316 100644 --- a/test-cartridges/README.md +++ b/test-cartridges/README.md @@ -4,7 +4,7 @@ This directory contains example cartridges and test suites to validate the behav ## Available Cartridges -### 🟩 [color-square](./color-square) +### 🟩 [color-square-ts](color-square-ts) A simple cartridge that demonstrates: - System initialization. - Rendering a colored square in the framebuffer. diff --git a/test-cartridges/color-square/cartridge/assets.pa b/test-cartridges/color-square-lua/cartridge/assets.pa similarity index 100% rename from test-cartridges/color-square/cartridge/assets.pa rename to test-cartridges/color-square-lua/cartridge/assets.pa diff --git a/test-cartridges/color-square/cartridge/manifest.json b/test-cartridges/color-square-lua/cartridge/manifest.json similarity index 100% rename from test-cartridges/color-square/cartridge/manifest.json rename to test-cartridges/color-square-lua/cartridge/manifest.json diff --git a/test-cartridges/color-square/prometeu-sdk b/test-cartridges/color-square-lua/prometeu-sdk similarity index 100% rename from test-cartridges/color-square/prometeu-sdk rename to test-cartridges/color-square-lua/prometeu-sdk diff --git a/test-cartridges/color-square-lua/run.sh b/test-cartridges/color-square-lua/run.sh new file mode 100644 index 00000000..e4e9fd7e --- /dev/null +++ b/test-cartridges/color-square-lua/run.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail + +prometeu build . --lang lua +prometeu run cartridge + +echo "Lua project scaffold ok. (Build step depends on Lua frontend in prometeu-compiler)" diff --git a/test-cartridges/color-square-lua/src/main.lua b/test-cartridges/color-square-lua/src/main.lua new file mode 100644 index 00000000..2976310c --- /dev/null +++ b/test-cartridges/color-square-lua/src/main.lua @@ -0,0 +1,16 @@ +local my_gfx = require("my_gfx") +local my_input = require("my_input") +local my_fs = require("my_fs") + +function frame() + my_gfx.do_init_gfx() + my_input.do_pad() + my_input.do_touch() + my_fs.do_fs() + my_gfx.print_orange() + + do + local x = 10 + gfx.drawText(120, 100, "1. value of " .. x, color.white) + end +end diff --git a/test-cartridges/color-square-lua/src/my_fs.lua b/test-cartridges/color-square-lua/src/my_fs.lua new file mode 100644 index 00000000..95035a97 --- /dev/null +++ b/test-cartridges/color-square-lua/src/my_fs.lua @@ -0,0 +1,15 @@ +local M = {} + +function M.do_fs() + local h = fs.open("test.txt") + if h >= 0 then + fs.write(h, "Hello Prometeu!") + local content = fs.read(h) + if content and content ~= "" then + log.writeTag(2, 101, content) + end + fs.close(h) + end +end + +return M diff --git a/test-cartridges/color-square-lua/src/my_gfx.lua b/test-cartridges/color-square-lua/src/my_gfx.lua new file mode 100644 index 00000000..01f36b5a --- /dev/null +++ b/test-cartridges/color-square-lua/src/my_gfx.lua @@ -0,0 +1,17 @@ +local M = {} + +function M.do_init_gfx() + gfx.clear(color.indigo) + gfx.fillRect(10, 10, 50, 50, color.red) + gfx.drawLine(0, 0, 128, 128, color.white) + gfx.drawCircle(64, 64, 20, color.blue) + gfx.drawDisc(100, 100, 10, color.green, color.yellow) + gfx.drawSquare(20, 100, 30, 30, color.cyan, color.color_key) +end + +function M.print_orange() + local c = color.rgb(255, 128, 0) + gfx.fillRect(0, 0, 5, 5, c) +end + +return M diff --git a/test-cartridges/color-square-lua/src/my_input.lua b/test-cartridges/color-square-lua/src/my_input.lua new file mode 100644 index 00000000..af9cee58 --- /dev/null +++ b/test-cartridges/color-square-lua/src/my_input.lua @@ -0,0 +1,21 @@ +local M = {} + +function M.do_pad() + if pad.up.down then + log.write(2, "Up is down") + end + + if pad.a.pressed then + audio.play("bgm_music", 0, 0, 128, 127, 1.0, 1) + end +end + +function M.do_touch() + gfx.setSprite("mouse_cursor", 0, touch.x, touch.y, 0, 0, true, false, false, 4) + + if touch.button.down then + gfx.drawCircle(touch.x, touch.y, 10, color.white) + end +end + +return M diff --git a/test-cartridges/color-square-ts/cartridge/assets.pa b/test-cartridges/color-square-ts/cartridge/assets.pa new file mode 100644 index 0000000000000000000000000000000000000000..1062286afd4a4e1b15d0efd7209f6e6a021c790c GIT binary patch literal 90504 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.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "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.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "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.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "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.1", - "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/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/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.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "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.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "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.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.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/@prometeu/sdk": { - "resolved": "prometeu-sdk/typescript-sdk", - "link": true - }, - "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/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", - "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.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.53.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", - "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3" - }, - "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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", - "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", - "debug": "^4.4.3" - }, - "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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", - "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", - "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", - "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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", - "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", - "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", - "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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", - "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", - "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.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.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", - "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.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/@typescript-eslint/visitor-keys/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/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-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/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/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/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/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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/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/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/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/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/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/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/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.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "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-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": "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/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/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/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/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/espree/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/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "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/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-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/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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/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/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/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/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/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/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-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/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/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "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-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/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/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/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/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.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/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/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/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/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/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/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/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/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/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/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/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/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/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/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "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/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", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "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/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/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" - } - }, - "prometeu-sdk": { - "name": "@prometeu/sdk", - "version": "0.1.0" - }, - "prometeu-sdk/typescript-sdk": { - "name": "@prometeu/sdk", - "version": "0.1.0" - } - } -} diff --git a/test-cartridges/color-square/node_modules/@prometeu/sdk b/test-cartridges/color-square/node_modules/@prometeu/sdk deleted file mode 120000 index 50ebc22a..00000000 --- a/test-cartridges/color-square/node_modules/@prometeu/sdk +++ /dev/null @@ -1 +0,0 @@ -../../prometeu-sdk/typescript-sdk \ No newline at end of file