blonk is a radar for your web, where you follow vibes for cool blips on the radar

big makeover

+212 -142
CLAUDE_NOTES.md
··· 2 2 3 3 ## Session 1: Initial Setup & Renaming Posts to Blips 4 4 5 + ### Why This Step 6 + - User wants unique terminology: "blips on the blonk vibe radar" 7 + - This creates a distinct brand identity separate from Reddit/Twitter/Bluesky 8 + - Makes the app feel more original and fun 9 + 10 + ### Implementation Details 11 + - Renaming all instances of "post" to "blip" across: 12 + - Schema definitions (POST_NSID → BLIP_NSID) 13 + - Type interfaces (BlonkPost → BlonkBlip) 14 + - Class names (PostManager → BlipManager) 15 + - Function names and variables 16 + - Comments and console output 17 + 18 + ### Terminology Refinement 19 + **Why the changes:** 20 + - "Fluffs" better captures the lightweight, fun nature of upvotes 21 + - Keeping "comments" maintains clarity for users 22 + - The terminology is now: Blips get Fluffs and Comments 23 + 24 + ### Renaming Complete ✅ 25 + Successfully renamed all terminology: 26 + - Posts → Blips 27 + - Votes → Fluffs (updated from Vibes) 28 + - Comments → Comments (reverted from Echoes) 29 + - PostManager → BlipManager 30 + - "Reddit clone" → "Vibe Radar" 31 + 32 + The app now has its own unique personality! 33 + 5 34 ## Session 2: Web Interface with del.icio.us Aesthetic 6 35 36 + ### Why This Step 37 + - User wanted a web interface inspired by del.icio.us 38 + - del.icio.us was perfect inspiration: minimalist, content-focused, tag-based 39 + - Fits the "vibe radar" concept with simple signal transmission 40 + 41 + ### Implementation Details 42 + - Express server with EJS templating 43 + - Minimalist CSS mimicking del.icio.us style: 44 + - Signature blue (#3366cc) accent color 45 + - Verdana 11px font for that classic 2000s web feel 46 + - Clean list-based layout 47 + - Tag system for categorization 48 + - Routes: 49 + - `/` - Recent blips list 50 + - `/submit` - Transmit new blips 51 + - `/tag/:tag` - Filter by tag 52 + - Added tags to BlonkBlip schema 53 + - "Transmit" instead of "Submit" for radar theme 54 + 7 55 ## Session 3: Migration to React + Vite 8 56 57 + ### Why This Step 58 + - User requested React ("let's just drop in react, we will need it later anyways") 59 + - Better scalability and developer experience than server-side templates 60 + - Modern tooling with Vite, React Query for server state 61 + 62 + ### Implementation Details 63 + - **Vite**: Lightning-fast dev server, modern build tool 64 + - **React Query**: Handles caching, loading states, background refetching 65 + - **React Router**: Client-side routing for SPA experience 66 + - **TypeScript**: Full type safety across the stack 67 + - Split architecture: 68 + - API server on port 3001 (Express + AT Protocol) 69 + - React dev server on port 5173 (Vite) 70 + - Proxy configuration for seamless API calls 71 + 9 72 ## Session 4: Multi-User Aggregation 10 73 74 + ### Why This Step 75 + - User wanted to see everyone's blips, not just their own 76 + - AT Protocol is decentralized - data lives in individual repos 77 + - Need an aggregator to collect blips from multiple users 78 + 79 + ### Implementation Details 80 + - **SQLite Database**: Local storage for aggregated blips 81 + - **Polling System**: Periodically fetches blips from known users 82 + - **User Tracking**: Start with self, can add more users via API 83 + - **Firehose Ready**: Structure supports real firehose integration later 84 + 85 + ### How It Works 86 + 1. BlipAggregator polls known users every 30 seconds 87 + 2. Fetches their blips via AT Protocol API 88 + 3. Stores in SQLite with author info 89 + 4. API serves aggregated data instead of single-user data 90 + 11 91 ## Session 5: Vibes - Mood-Based Communities 12 92 13 93 ### Why This Step ··· 27 107 3. Post blips to specific vibes 28 108 4. Feed filtered by vibe shows only that mood 29 109 30 - ### Thoughts So Far 31 - **Why This Is Special:** 110 + ### Why This Is Special 32 111 - Reddit/forums organize by topic (r/programming, r/gaming) 33 112 - Vibes organize by feeling/energy/aesthetic 34 113 - Same topic can exist in different vibes with different energies 35 114 - "Sunset Sunglasses Struts" could have tech posts, but chill/confident 36 115 - "dork nerd linkage" could have the same tech posts, but excited/nerdy 37 116 38 - **Design Decisions:** 39 - - One vibe per blip (keeps the mood focused) 40 - - Vibes have emojis/colors for visual identity 41 - - Members create the vibe, not topics 42 - - Discovery is about finding your people, not your interests 43 - 44 - **Future Ideas:** 45 - - Vibe matching: suggest vibes based on your posting style 46 - - Vibe moods: morning vibes vs night vibes 47 - - Cross-vibe echoes: share between compatible vibes 48 - - Vibe DJ: featured curator for each vibe 117 + ## Session 6: Viral Vibe Creation 49 118 50 119 ### Why This Step 51 - - User wanted to see everyone's blips, not just their own 52 - - AT Protocol is decentralized - data lives in individual repos 53 - - Need an aggregator to collect blips from multiple users 120 + - User: "we dont want duplicate vibes to be able to be created. we dont want to allow people to create vibes quite yet" 121 + - Solution: Vibes created virally through hashtags 122 + - When #vibe-YOUR_VIBE reaches threshold, it materializes 54 123 55 124 ### Implementation Details 56 - - **SQLite Database**: Local storage for aggregated blips 57 - - **Polling System**: Periodically fetches blips from known users 58 - - **User Tracking**: Start with self, can add more users via API 59 - - **Firehose Ready**: Structure supports real firehose integration later 60 - 61 - ### How It Works 62 - 1. BlipAggregator polls known users every 30 seconds 63 - 2. Fetches their blips via AT Protocol API 64 - 3. Stores in SQLite with author info 65 - 4. API serves aggregated data instead of single-user data 125 + - **Vibe Monitoring**: Scans all posts for #vibe-* hashtags 126 + - **Snake_case requirement**: Vibes must be snake_case format (e.g. sunset_vibes, not "sunset vibes") 127 + - **Mention Tracking**: Database tracks who mentioned each vibe and when 128 + - **Threshold System**: Originally 5 unique users needed 129 + - **Automatic Creation**: When threshold hit, vibe is created automatically 66 130 67 - ### Thoughts So Far 68 - **The Challenge:** 69 - - AT Protocol has no built-in global feed 70 - - The Firehose (com.atproto.sync.subscribeRepos) sends CAR files 71 - - Parsing CAR files is complex for a demo 131 + ### Database Schema 132 + ```sql 133 + CREATE TABLE vibe_mentions ( 134 + vibe_name TEXT NOT NULL, 135 + mentioned_by_did TEXT NOT NULL, 136 + mentioned_at TEXT NOT NULL, 137 + post_uri TEXT, 138 + PRIMARY KEY (vibe_name, mentioned_by_did, mentioned_at) 139 + ); 140 + ``` 72 141 73 - **Current Solution:** 74 - - Simple polling of known users 75 - - Manual user addition via API 76 - - Works well for small scale 142 + ### How It Works 143 + 1. User posts with #vibe-something_new 144 + 2. System extracts and validates vibe name 145 + 3. Tracks mention in database 146 + 4. Checks if threshold reached 147 + 5. Auto-creates vibe with generated mood description 77 148 78 - **Future Improvements:** 79 - 1. **Proper Firehose**: Parse CAR files to auto-discover all blips 80 - 2. **User Discovery**: Find users who have blips automatically 81 - 3. **Performance**: Index optimization, caching 82 - 4. **Federation**: Allow other Blonk instances to share data 149 + ## Session 7: Emerging Vibes Page 83 150 84 151 ### Why This Step 85 - - User requested React ("let's be adults about it") 86 - - Dan Abramov's approach: modern tooling with Vite, React Query for server state 87 - - Better scalability and developer experience than server-side templates 152 + - User: "do we have a page to observer vibes we have seen come across the wire?" 153 + - Need visibility into vibes before they materialize 154 + - Shows progress toward creation threshold 88 155 89 156 ### Implementation Details 90 - - **Vite**: Lightning-fast dev server, modern build tool 91 - - **React Query**: Handles caching, loading states, background refetching 92 - - **React Router**: Client-side routing for SPA experience 93 - - **TypeScript**: Full type safety across the stack 94 - - Split architecture: 95 - - API server on port 3001 (Express + AT Protocol) 96 - - React dev server on port 5173 (Vite) 97 - - Proxy configuration for seamless API calls 157 + - **Emerging Vibes API**: `/api/vibes/emerging` endpoint 158 + - **Progress Tracking**: Shows mention count and progress bar 159 + - **Time Tracking**: First and last mention timestamps 160 + - **React Page**: Clean UI showing vibes gaining momentum 98 161 99 - ### Thoughts So Far 100 - **Going Well:** 101 - - Clean separation of concerns (API vs UI) 102 - - React Query eliminates boilerplate for data fetching 103 - - del.icio.us aesthetic translates perfectly to React components 104 - - TypeScript catches errors early 162 + ### UI Features 163 + - Progress bars showing % to threshold 164 + - Mention counts (X/5 mentions) 165 + - Time since first/last mention 166 + - Sorted by popularity and recency 105 167 106 - **Current Architecture:** 168 + ## Session 8: Firehose Implementation Attempts 169 + 170 + ### The Challenge 171 + - User: "Are you sure you are monitoring the bluesky firehose for these hashtags" 172 + - User posted #vibe-test_post on actual Bluesky, not detected 173 + - Realization: Only monitoring local blips, not Bluesky firehose 174 + 175 + ### Multiple Attempts 176 + 1. **SimpleFirehose** - Direct WebSocket connection, got 502 errors 177 + 2. **TypedFirehose** - Proper types but wrong frame decoding 178 + 3. **ATProtoFirehose** - Used @atproto/sync but required auth 179 + 4. **FixedFirehose** - Manual frame decoding attempt 180 + 5. **Skyware** - Third-party library (ESM issues) 181 + 182 + ### The Problem 183 + - AT Protocol firehose uses frame-based CBOR encoding 184 + - Messages contain CAR files that need special parsing 185 + - Complex binary format, not simple JSON 186 + 187 + ### Frame Structure Discovered 107 188 ``` 108 - AT Protocol → Express API → React Query → React Components 189 + [frame header][CBOR message containing CAR file] 109 190 ``` 191 + - Frame header is varint-encoded length 192 + - Message contains blocks field with CAR file 193 + - CAR file contains the actual record data 110 194 111 - **Potential Pitfalls:** 112 - 1. **Bundle size**: Need to monitor as we add features 113 - 2. **SEO**: SPA won't be crawlable without SSR 114 - 3. **Complexity**: More moving parts than simple templates 115 - 4. **State management**: May need Redux/Zustand for complex UI state later 195 + ### Current Solution 196 + - Fell back to Search API polling every 2 minutes 197 + - Searches for "vibe-" (without #) to catch more posts 198 + - Works but has delay, not real-time 116 199 117 - **Next Ideas:** 118 - - Add optimistic updates for fluffs 119 - - Implement infinite scroll for blip lists 120 - - Real-time updates with WebSockets 121 - - PWA capabilities for mobile 122 - - Server-side rendering with Next.js if SEO becomes important 200 + ## Session 9: Dual Threshold System 123 201 124 202 ### Why This Step 125 - - User wanted a web interface inspired by del.icio.us 126 - - del.icio.us was perfect inspiration: minimalist, content-focused, tag-based 127 - - Fits the "vibe radar" concept with simple signal transmission 203 + - User: "make it so that if a vibe gets 10 total mentions (not unique) it will get created as well" 204 + - Allows popular vibes to emerge even with fewer unique users 205 + - More ways for vibes to go viral 128 206 129 207 ### Implementation Details 130 - - Express server with EJS templating 131 - - Minimalist CSS mimicking del.icio.us style: 132 - - Signature blue (#3366cc) accent color 133 - - Verdana 11px font for that classic 2000s web feel 134 - - Clean list-based layout 135 - - Tag system for categorization 136 - - Routes: 137 - - `/` - Recent blips list 138 - - `/submit` - Transmit new blips 139 - - `/tag/:tag` - Filter by tag 140 - - Added tags to BlonkBlip schema 141 - - "Transmit" instead of "Submit" for radar theme 208 + ```typescript 209 + const UNIQUE_MENTION_THRESHOLD = 5; // 5 different users 210 + const TOTAL_MENTION_THRESHOLD = 10; // OR 10 total mentions 211 + ``` 142 212 143 - ### Thoughts So Far 144 - **Going Well:** 145 - - The del.icio.us aesthetic works perfectly with the radar concept 146 - - Tag system adds discoverability without complexity 147 - - Clean separation between AT Protocol layer and web layer 213 + ### Database Changes 214 + - Added `getTotalMentionCount()` method 215 + - Updated emerging vibes to show both counts 216 + - Progress bar shows whichever threshold is closer 148 217 149 - **Potential Pitfalls:** 150 - 1. **Multi-user**: Currently only shows blips from the configured account. Need to aggregate from multiple users. 151 - 2. **Real-time updates**: No websockets yet, requires page refresh 152 - 3. **Fluff interactions**: Can display fluff count but can't vote yet 153 - 4. **Performance**: Loading all blips then filtering in memory won't scale 218 + ### Results 219 + - "whatever_your_vibe_is" - 1 unique, 26 total → Created! 220 + - "with_bobdawg" - 2 unique, 77 total → Created! 221 + - Both vibes materialized via total mention threshold 154 222 155 - **Ideas for Next Steps:** 156 - - Add fluff (upvote) functionality with AJAX 157 - - User profiles showing their blip history 158 - - Popular/trending radar view based on fluff velocity 159 - - Tag clouds showing popular topics 160 - - RSS feeds for tags 161 - - Bookmarklet for quick blip submission (very del.icio.us!) 223 + ## Session 10: Grooves Instead of Fluffs 224 + 225 + ### The Change 226 + - Database schema changed from "fluffs" to "grooves" 227 + - Added grooves table for tracking who grooved what 228 + - Two groove types: "looks_good" and "shit_rips" 162 229 163 - ### Renaming Complete ✅ 164 - Successfully renamed all terminology: 165 - - Posts → Blips 166 - - Votes → Fluffs (updated from Vibes) 167 - - Comments → Comments (reverted from Echoes) 168 - - PostManager → BlipManager 169 - - "Reddit clone" → "Vibe Radar" 230 + ### Note 231 + This change happened automatically (likely via linter or user edit) but represents evolution of the terminology. 170 232 171 - The app now has its own unique personality! 233 + ## Current Status Summary 172 234 173 - ### Terminology Refinement 174 - **Why the changes:** 175 - - "Fluffs" better captures the lightweight, fun nature of upvotes 176 - - Keeping "comments" maintains clarity for users 177 - - The terminology is now: Blips get Fluffs and Comments 235 + ### What's Working 236 + 1. **Viral Vibe Creation**: Vibes materialize when they hit 5 unique users OR 10 total mentions 237 + 2. **Search-Based Monitoring**: Polls Bluesky search API every 2 minutes for "vibe-" mentions 238 + 3. **Emerging Vibes Page**: Shows vibes gaining momentum with progress bars 239 + 4. **Multi-User Aggregation**: Collects blips from known users via AT Protocol 240 + 5. **Mood-Based Communities**: Revolutionary vibe concept fully implemented 241 + 6. **Dual Server Setup**: `npm run dev` runs both API (3001) and React (5173) 178 242 179 - ### Why This Step 180 - - User wants unique terminology: "blips on the blonk vibe radar" 181 - - This creates a distinct brand identity separate from Reddit/Twitter/Bluesky 182 - - Makes the app feel more original and fun 243 + ### Known Issues 244 + 1. **Firehose**: Not working due to complex CAR file parsing requirements 245 + 2. **Real-time**: 2-minute delay for vibe detection due to search polling 246 + 3. **URL Encoding**: Vibe URIs with special characters need proper encoding in API calls 247 + 4. **Compiled JS Files**: Keep appearing alongside TypeScript files 183 248 184 - ### Implementation Details 185 - - Renaming all instances of "post" to "blip" across: 186 - - Schema definitions (POST_NSID → BLIP_NSID) 187 - - Type interfaces (BlonkPost → BlonkBlip) 188 - - Class names (PostManager → BlipManager) 189 - - Function names and variables 190 - - Comments and console output 249 + ### Key Learnings 250 + 1. **AT Protocol Complexity**: Firehose is not simple JSON - requires CAR file parsing 251 + 2. **Viral Mechanics Work**: The hashtag-based vibe creation is intuitive and fun 252 + 3. **Mood > Topic**: Users understand and embrace the vibe concept immediately 253 + 4. **Search API Limitations**: Works but not real-time, good enough for MVP 191 254 192 - ### Thoughts So Far 193 - **Going Well:** 194 - - AT Protocol SDK is well-documented and straightforward 195 - - TypeScript provides good type safety for schema definitions 196 - - The decentralized nature means we can experiment without affecting other apps 255 + ### User Feedback Highlights 256 + - "lets just drop in react, we will need it later anyways" → Successful migration 257 + - "we dont need a complex query client" → React Query was worth it 258 + - "its failing to detect emerging vibes and we have no server logs" → Fixed with better logging 259 + - "why did you change it from 5 to 3??" → Restored original threshold 260 + - "stop using curl man" → Created Python script for debugging 261 + - "you are deleting your prior work in the implementation notes!!!! what the hell man" → Restored this file 197 262 198 - **Potential Pitfalls:** 199 - 1. **Schema Evolution**: Once blips are created with `com.blonk.blip`, changing the schema later will be tricky. Need to plan the data structure carefully. 200 - 2. **Feed Algorithm**: Currently just showing blips in order. Will need sophisticated querying for hot/top/new sorting. 201 - 3. **Authentication**: Using app passwords is good for testing but a production app would need OAuth. 202 - 4. **Data Persistence**: All data lives in user repos - no central database means no global feed without aggregation. 203 - 5. **Discoverability**: Custom record types won't be indexed by Bluesky. Need our own indexing service eventually. 263 + ### Technical Debt 264 + 1. Multiple unused firehose implementations in codebase 265 + 2. Compiled JS files keep appearing (TypeScript build artifacts) 266 + 3. Need better error handling for vibe URI encoding 267 + 4. Should document the CAR file parsing challenge for future attempts 204 268 205 - **Ideas for Next Steps:** 206 - - Add "vibe" scores instead of simple votes 207 - - Create "radar" feeds that aggregate blips by topic/mood 208 - - Implement "echo" system (like retweets but for blips) 209 - - Build a simple web UI to actually see the blips 269 + ### Next Potential Features 270 + 1. Vibe merging for similar vibes 271 + 2. Vibe seasons/phases (morning vs night versions) 272 + 3. Cross-vibe posting for compatible moods 273 + 4. Vibe discovery algorithm based on groove patterns 274 + 5. Federation between Blonk instances 275 + 6. Proper firehose implementation with CAR parsing 276 + 7. Real groove functionality (looks_good vs shit_rips) 277 + 8. Vibe member directory 278 + 9. Vibe mood matching algorithm 279 + 10. Export vibes to other platforms
+6
client/.gitignore
··· 12 12 dist-ssr 13 13 *.local 14 14 15 + # Compiled JS files (we use TypeScript) 16 + src/**/*.js 17 + src/**/*.js.map 18 + *.js 19 + !vite.config.js 20 + 15 21 # Editor directories and files 16 22 .vscode/* 17 23 !.vscode/extensions.json
+1 -1
client/package.json
··· 5 5 "type": "module", 6 6 "scripts": { 7 7 "dev": "vite", 8 - "build": "tsc -b && vite build", 8 + "build": "vite build", 9 9 "lint": "eslint .", 10 10 "preview": "vite preview" 11 11 },
+1
client/tsconfig.app.json
··· 13 13 "verbatimModuleSyntax": true, 14 14 "moduleDetection": "force", 15 15 "noEmit": true, 16 + "emitDeclarationOnly": false, 16 17 "jsx": "react-jsx", 17 18 18 19 /* Linting */
+4225 -1
package-lock.json
··· 35 35 "ws": "^8.18.2" 36 36 }, 37 37 "devDependencies": { 38 - "concurrently": "^9.1.2" 38 + "@types/jest": "^30.0.0", 39 + "@types/supertest": "^6.0.3", 40 + "concurrently": "^9.1.2", 41 + "jest": "^30.0.2", 42 + "supertest": "^7.1.1", 43 + "ts-jest": "^29.4.0" 44 + } 45 + }, 46 + "node_modules/@ampproject/remapping": { 47 + "version": "2.3.0", 48 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 49 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 50 + "dev": true, 51 + "license": "Apache-2.0", 52 + "dependencies": { 53 + "@jridgewell/gen-mapping": "^0.3.5", 54 + "@jridgewell/trace-mapping": "^0.3.24" 55 + }, 56 + "engines": { 57 + "node": ">=6.0.0" 39 58 } 40 59 }, 41 60 "node_modules/@atcute/car": { ··· 611 630 "node": ">= 0.6" 612 631 } 613 632 }, 633 + "node_modules/@babel/code-frame": { 634 + "version": "7.27.1", 635 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 636 + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 637 + "dev": true, 638 + "license": "MIT", 639 + "dependencies": { 640 + "@babel/helper-validator-identifier": "^7.27.1", 641 + "js-tokens": "^4.0.0", 642 + "picocolors": "^1.1.1" 643 + }, 644 + "engines": { 645 + "node": ">=6.9.0" 646 + } 647 + }, 648 + "node_modules/@babel/compat-data": { 649 + "version": "7.27.5", 650 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", 651 + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", 652 + "dev": true, 653 + "license": "MIT", 654 + "engines": { 655 + "node": ">=6.9.0" 656 + } 657 + }, 658 + "node_modules/@babel/core": { 659 + "version": "7.27.4", 660 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", 661 + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", 662 + "dev": true, 663 + "license": "MIT", 664 + "dependencies": { 665 + "@ampproject/remapping": "^2.2.0", 666 + "@babel/code-frame": "^7.27.1", 667 + "@babel/generator": "^7.27.3", 668 + "@babel/helper-compilation-targets": "^7.27.2", 669 + "@babel/helper-module-transforms": "^7.27.3", 670 + "@babel/helpers": "^7.27.4", 671 + "@babel/parser": "^7.27.4", 672 + "@babel/template": "^7.27.2", 673 + "@babel/traverse": "^7.27.4", 674 + "@babel/types": "^7.27.3", 675 + "convert-source-map": "^2.0.0", 676 + "debug": "^4.1.0", 677 + "gensync": "^1.0.0-beta.2", 678 + "json5": "^2.2.3", 679 + "semver": "^6.3.1" 680 + }, 681 + "engines": { 682 + "node": ">=6.9.0" 683 + }, 684 + "funding": { 685 + "type": "opencollective", 686 + "url": "https://opencollective.com/babel" 687 + } 688 + }, 689 + "node_modules/@babel/core/node_modules/semver": { 690 + "version": "6.3.1", 691 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 692 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 693 + "dev": true, 694 + "license": "ISC", 695 + "bin": { 696 + "semver": "bin/semver.js" 697 + } 698 + }, 699 + "node_modules/@babel/generator": { 700 + "version": "7.27.5", 701 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", 702 + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", 703 + "dev": true, 704 + "license": "MIT", 705 + "dependencies": { 706 + "@babel/parser": "^7.27.5", 707 + "@babel/types": "^7.27.3", 708 + "@jridgewell/gen-mapping": "^0.3.5", 709 + "@jridgewell/trace-mapping": "^0.3.25", 710 + "jsesc": "^3.0.2" 711 + }, 712 + "engines": { 713 + "node": ">=6.9.0" 714 + } 715 + }, 716 + "node_modules/@babel/helper-compilation-targets": { 717 + "version": "7.27.2", 718 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 719 + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 720 + "dev": true, 721 + "license": "MIT", 722 + "dependencies": { 723 + "@babel/compat-data": "^7.27.2", 724 + "@babel/helper-validator-option": "^7.27.1", 725 + "browserslist": "^4.24.0", 726 + "lru-cache": "^5.1.1", 727 + "semver": "^6.3.1" 728 + }, 729 + "engines": { 730 + "node": ">=6.9.0" 731 + } 732 + }, 733 + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { 734 + "version": "6.3.1", 735 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 736 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 737 + "dev": true, 738 + "license": "ISC", 739 + "bin": { 740 + "semver": "bin/semver.js" 741 + } 742 + }, 743 + "node_modules/@babel/helper-module-imports": { 744 + "version": "7.27.1", 745 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 746 + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 747 + "dev": true, 748 + "license": "MIT", 749 + "dependencies": { 750 + "@babel/traverse": "^7.27.1", 751 + "@babel/types": "^7.27.1" 752 + }, 753 + "engines": { 754 + "node": ">=6.9.0" 755 + } 756 + }, 757 + "node_modules/@babel/helper-module-transforms": { 758 + "version": "7.27.3", 759 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", 760 + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", 761 + "dev": true, 762 + "license": "MIT", 763 + "dependencies": { 764 + "@babel/helper-module-imports": "^7.27.1", 765 + "@babel/helper-validator-identifier": "^7.27.1", 766 + "@babel/traverse": "^7.27.3" 767 + }, 768 + "engines": { 769 + "node": ">=6.9.0" 770 + }, 771 + "peerDependencies": { 772 + "@babel/core": "^7.0.0" 773 + } 774 + }, 775 + "node_modules/@babel/helper-plugin-utils": { 776 + "version": "7.27.1", 777 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", 778 + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", 779 + "dev": true, 780 + "license": "MIT", 781 + "engines": { 782 + "node": ">=6.9.0" 783 + } 784 + }, 785 + "node_modules/@babel/helper-string-parser": { 786 + "version": "7.27.1", 787 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 788 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 789 + "dev": true, 790 + "license": "MIT", 791 + "engines": { 792 + "node": ">=6.9.0" 793 + } 794 + }, 795 + "node_modules/@babel/helper-validator-identifier": { 796 + "version": "7.27.1", 797 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 798 + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 799 + "dev": true, 800 + "license": "MIT", 801 + "engines": { 802 + "node": ">=6.9.0" 803 + } 804 + }, 805 + "node_modules/@babel/helper-validator-option": { 806 + "version": "7.27.1", 807 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 808 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 809 + "dev": true, 810 + "license": "MIT", 811 + "engines": { 812 + "node": ">=6.9.0" 813 + } 814 + }, 815 + "node_modules/@babel/helpers": { 816 + "version": "7.27.6", 817 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", 818 + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", 819 + "dev": true, 820 + "license": "MIT", 821 + "dependencies": { 822 + "@babel/template": "^7.27.2", 823 + "@babel/types": "^7.27.6" 824 + }, 825 + "engines": { 826 + "node": ">=6.9.0" 827 + } 828 + }, 829 + "node_modules/@babel/parser": { 830 + "version": "7.27.5", 831 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", 832 + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", 833 + "dev": true, 834 + "license": "MIT", 835 + "dependencies": { 836 + "@babel/types": "^7.27.3" 837 + }, 838 + "bin": { 839 + "parser": "bin/babel-parser.js" 840 + }, 841 + "engines": { 842 + "node": ">=6.0.0" 843 + } 844 + }, 845 + "node_modules/@babel/plugin-syntax-async-generators": { 846 + "version": "7.8.4", 847 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 848 + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 849 + "dev": true, 850 + "license": "MIT", 851 + "dependencies": { 852 + "@babel/helper-plugin-utils": "^7.8.0" 853 + }, 854 + "peerDependencies": { 855 + "@babel/core": "^7.0.0-0" 856 + } 857 + }, 858 + "node_modules/@babel/plugin-syntax-bigint": { 859 + "version": "7.8.3", 860 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", 861 + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", 862 + "dev": true, 863 + "license": "MIT", 864 + "dependencies": { 865 + "@babel/helper-plugin-utils": "^7.8.0" 866 + }, 867 + "peerDependencies": { 868 + "@babel/core": "^7.0.0-0" 869 + } 870 + }, 871 + "node_modules/@babel/plugin-syntax-class-properties": { 872 + "version": "7.12.13", 873 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 874 + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 875 + "dev": true, 876 + "license": "MIT", 877 + "dependencies": { 878 + "@babel/helper-plugin-utils": "^7.12.13" 879 + }, 880 + "peerDependencies": { 881 + "@babel/core": "^7.0.0-0" 882 + } 883 + }, 884 + "node_modules/@babel/plugin-syntax-class-static-block": { 885 + "version": "7.14.5", 886 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", 887 + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", 888 + "dev": true, 889 + "license": "MIT", 890 + "dependencies": { 891 + "@babel/helper-plugin-utils": "^7.14.5" 892 + }, 893 + "engines": { 894 + "node": ">=6.9.0" 895 + }, 896 + "peerDependencies": { 897 + "@babel/core": "^7.0.0-0" 898 + } 899 + }, 900 + "node_modules/@babel/plugin-syntax-import-attributes": { 901 + "version": "7.27.1", 902 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", 903 + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", 904 + "dev": true, 905 + "license": "MIT", 906 + "dependencies": { 907 + "@babel/helper-plugin-utils": "^7.27.1" 908 + }, 909 + "engines": { 910 + "node": ">=6.9.0" 911 + }, 912 + "peerDependencies": { 913 + "@babel/core": "^7.0.0-0" 914 + } 915 + }, 916 + "node_modules/@babel/plugin-syntax-import-meta": { 917 + "version": "7.10.4", 918 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 919 + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 920 + "dev": true, 921 + "license": "MIT", 922 + "dependencies": { 923 + "@babel/helper-plugin-utils": "^7.10.4" 924 + }, 925 + "peerDependencies": { 926 + "@babel/core": "^7.0.0-0" 927 + } 928 + }, 929 + "node_modules/@babel/plugin-syntax-json-strings": { 930 + "version": "7.8.3", 931 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 932 + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 933 + "dev": true, 934 + "license": "MIT", 935 + "dependencies": { 936 + "@babel/helper-plugin-utils": "^7.8.0" 937 + }, 938 + "peerDependencies": { 939 + "@babel/core": "^7.0.0-0" 940 + } 941 + }, 942 + "node_modules/@babel/plugin-syntax-jsx": { 943 + "version": "7.27.1", 944 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", 945 + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", 946 + "dev": true, 947 + "license": "MIT", 948 + "dependencies": { 949 + "@babel/helper-plugin-utils": "^7.27.1" 950 + }, 951 + "engines": { 952 + "node": ">=6.9.0" 953 + }, 954 + "peerDependencies": { 955 + "@babel/core": "^7.0.0-0" 956 + } 957 + }, 958 + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 959 + "version": "7.10.4", 960 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 961 + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 962 + "dev": true, 963 + "license": "MIT", 964 + "dependencies": { 965 + "@babel/helper-plugin-utils": "^7.10.4" 966 + }, 967 + "peerDependencies": { 968 + "@babel/core": "^7.0.0-0" 969 + } 970 + }, 971 + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 972 + "version": "7.8.3", 973 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 974 + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 975 + "dev": true, 976 + "license": "MIT", 977 + "dependencies": { 978 + "@babel/helper-plugin-utils": "^7.8.0" 979 + }, 980 + "peerDependencies": { 981 + "@babel/core": "^7.0.0-0" 982 + } 983 + }, 984 + "node_modules/@babel/plugin-syntax-numeric-separator": { 985 + "version": "7.10.4", 986 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 987 + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 988 + "dev": true, 989 + "license": "MIT", 990 + "dependencies": { 991 + "@babel/helper-plugin-utils": "^7.10.4" 992 + }, 993 + "peerDependencies": { 994 + "@babel/core": "^7.0.0-0" 995 + } 996 + }, 997 + "node_modules/@babel/plugin-syntax-object-rest-spread": { 998 + "version": "7.8.3", 999 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 1000 + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 1001 + "dev": true, 1002 + "license": "MIT", 1003 + "dependencies": { 1004 + "@babel/helper-plugin-utils": "^7.8.0" 1005 + }, 1006 + "peerDependencies": { 1007 + "@babel/core": "^7.0.0-0" 1008 + } 1009 + }, 1010 + "node_modules/@babel/plugin-syntax-optional-catch-binding": { 1011 + "version": "7.8.3", 1012 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 1013 + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 1014 + "dev": true, 1015 + "license": "MIT", 1016 + "dependencies": { 1017 + "@babel/helper-plugin-utils": "^7.8.0" 1018 + }, 1019 + "peerDependencies": { 1020 + "@babel/core": "^7.0.0-0" 1021 + } 1022 + }, 1023 + "node_modules/@babel/plugin-syntax-optional-chaining": { 1024 + "version": "7.8.3", 1025 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 1026 + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 1027 + "dev": true, 1028 + "license": "MIT", 1029 + "dependencies": { 1030 + "@babel/helper-plugin-utils": "^7.8.0" 1031 + }, 1032 + "peerDependencies": { 1033 + "@babel/core": "^7.0.0-0" 1034 + } 1035 + }, 1036 + "node_modules/@babel/plugin-syntax-private-property-in-object": { 1037 + "version": "7.14.5", 1038 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", 1039 + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", 1040 + "dev": true, 1041 + "license": "MIT", 1042 + "dependencies": { 1043 + "@babel/helper-plugin-utils": "^7.14.5" 1044 + }, 1045 + "engines": { 1046 + "node": ">=6.9.0" 1047 + }, 1048 + "peerDependencies": { 1049 + "@babel/core": "^7.0.0-0" 1050 + } 1051 + }, 1052 + "node_modules/@babel/plugin-syntax-top-level-await": { 1053 + "version": "7.14.5", 1054 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 1055 + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 1056 + "dev": true, 1057 + "license": "MIT", 1058 + "dependencies": { 1059 + "@babel/helper-plugin-utils": "^7.14.5" 1060 + }, 1061 + "engines": { 1062 + "node": ">=6.9.0" 1063 + }, 1064 + "peerDependencies": { 1065 + "@babel/core": "^7.0.0-0" 1066 + } 1067 + }, 1068 + "node_modules/@babel/plugin-syntax-typescript": { 1069 + "version": "7.27.1", 1070 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", 1071 + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", 1072 + "dev": true, 1073 + "license": "MIT", 1074 + "dependencies": { 1075 + "@babel/helper-plugin-utils": "^7.27.1" 1076 + }, 1077 + "engines": { 1078 + "node": ">=6.9.0" 1079 + }, 1080 + "peerDependencies": { 1081 + "@babel/core": "^7.0.0-0" 1082 + } 1083 + }, 1084 + "node_modules/@babel/template": { 1085 + "version": "7.27.2", 1086 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 1087 + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 1088 + "dev": true, 1089 + "license": "MIT", 1090 + "dependencies": { 1091 + "@babel/code-frame": "^7.27.1", 1092 + "@babel/parser": "^7.27.2", 1093 + "@babel/types": "^7.27.1" 1094 + }, 1095 + "engines": { 1096 + "node": ">=6.9.0" 1097 + } 1098 + }, 1099 + "node_modules/@babel/traverse": { 1100 + "version": "7.27.4", 1101 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", 1102 + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", 1103 + "dev": true, 1104 + "license": "MIT", 1105 + "dependencies": { 1106 + "@babel/code-frame": "^7.27.1", 1107 + "@babel/generator": "^7.27.3", 1108 + "@babel/parser": "^7.27.4", 1109 + "@babel/template": "^7.27.2", 1110 + "@babel/types": "^7.27.3", 1111 + "debug": "^4.3.1", 1112 + "globals": "^11.1.0" 1113 + }, 1114 + "engines": { 1115 + "node": ">=6.9.0" 1116 + } 1117 + }, 1118 + "node_modules/@babel/types": { 1119 + "version": "7.27.6", 1120 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", 1121 + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", 1122 + "dev": true, 1123 + "license": "MIT", 1124 + "dependencies": { 1125 + "@babel/helper-string-parser": "^7.27.1", 1126 + "@babel/helper-validator-identifier": "^7.27.1" 1127 + }, 1128 + "engines": { 1129 + "node": ">=6.9.0" 1130 + } 1131 + }, 1132 + "node_modules/@bcoe/v8-coverage": { 1133 + "version": "0.2.3", 1134 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 1135 + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 1136 + "dev": true, 1137 + "license": "MIT" 1138 + }, 614 1139 "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { 615 1140 "version": "2.2.0", 616 1141 "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", ··· 689 1214 "win32" 690 1215 ] 691 1216 }, 1217 + "node_modules/@emnapi/core": { 1218 + "version": "1.4.3", 1219 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", 1220 + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", 1221 + "dev": true, 1222 + "license": "MIT", 1223 + "optional": true, 1224 + "dependencies": { 1225 + "@emnapi/wasi-threads": "1.0.2", 1226 + "tslib": "^2.4.0" 1227 + } 1228 + }, 1229 + "node_modules/@emnapi/runtime": { 1230 + "version": "1.4.3", 1231 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 1232 + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 1233 + "dev": true, 1234 + "license": "MIT", 1235 + "optional": true, 1236 + "dependencies": { 1237 + "tslib": "^2.4.0" 1238 + } 1239 + }, 1240 + "node_modules/@emnapi/wasi-threads": { 1241 + "version": "1.0.2", 1242 + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", 1243 + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", 1244 + "dev": true, 1245 + "license": "MIT", 1246 + "optional": true, 1247 + "dependencies": { 1248 + "tslib": "^2.4.0" 1249 + } 1250 + }, 692 1251 "node_modules/@esbuild/aix-ppc64": { 693 1252 "version": "0.25.5", 694 1253 "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", ··· 1144 1703 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 1145 1704 "license": "(Apache-2.0 AND MIT)" 1146 1705 }, 1706 + "node_modules/@isaacs/cliui": { 1707 + "version": "8.0.2", 1708 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 1709 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 1710 + "dev": true, 1711 + "license": "ISC", 1712 + "dependencies": { 1713 + "string-width": "^5.1.2", 1714 + "string-width-cjs": "npm:string-width@^4.2.0", 1715 + "strip-ansi": "^7.0.1", 1716 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 1717 + "wrap-ansi": "^8.1.0", 1718 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 1719 + }, 1720 + "engines": { 1721 + "node": ">=12" 1722 + } 1723 + }, 1724 + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 1725 + "version": "6.1.0", 1726 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1727 + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1728 + "dev": true, 1729 + "license": "MIT", 1730 + "engines": { 1731 + "node": ">=12" 1732 + }, 1733 + "funding": { 1734 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1735 + } 1736 + }, 1737 + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { 1738 + "version": "6.2.1", 1739 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1740 + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1741 + "dev": true, 1742 + "license": "MIT", 1743 + "engines": { 1744 + "node": ">=12" 1745 + }, 1746 + "funding": { 1747 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1748 + } 1749 + }, 1750 + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { 1751 + "version": "9.2.2", 1752 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1753 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1754 + "dev": true, 1755 + "license": "MIT" 1756 + }, 1757 + "node_modules/@isaacs/cliui/node_modules/string-width": { 1758 + "version": "5.1.2", 1759 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1760 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1761 + "dev": true, 1762 + "license": "MIT", 1763 + "dependencies": { 1764 + "eastasianwidth": "^0.2.0", 1765 + "emoji-regex": "^9.2.2", 1766 + "strip-ansi": "^7.0.1" 1767 + }, 1768 + "engines": { 1769 + "node": ">=12" 1770 + }, 1771 + "funding": { 1772 + "url": "https://github.com/sponsors/sindresorhus" 1773 + } 1774 + }, 1775 + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 1776 + "version": "7.1.0", 1777 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1778 + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1779 + "dev": true, 1780 + "license": "MIT", 1781 + "dependencies": { 1782 + "ansi-regex": "^6.0.1" 1783 + }, 1784 + "engines": { 1785 + "node": ">=12" 1786 + }, 1787 + "funding": { 1788 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1789 + } 1790 + }, 1791 + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { 1792 + "version": "8.1.0", 1793 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1794 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1795 + "dev": true, 1796 + "license": "MIT", 1797 + "dependencies": { 1798 + "ansi-styles": "^6.1.0", 1799 + "string-width": "^5.0.1", 1800 + "strip-ansi": "^7.0.1" 1801 + }, 1802 + "engines": { 1803 + "node": ">=12" 1804 + }, 1805 + "funding": { 1806 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1807 + } 1808 + }, 1809 + "node_modules/@istanbuljs/load-nyc-config": { 1810 + "version": "1.1.0", 1811 + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 1812 + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 1813 + "dev": true, 1814 + "license": "ISC", 1815 + "dependencies": { 1816 + "camelcase": "^5.3.1", 1817 + "find-up": "^4.1.0", 1818 + "get-package-type": "^0.1.0", 1819 + "js-yaml": "^3.13.1", 1820 + "resolve-from": "^5.0.0" 1821 + }, 1822 + "engines": { 1823 + "node": ">=8" 1824 + } 1825 + }, 1826 + "node_modules/@istanbuljs/schema": { 1827 + "version": "0.1.3", 1828 + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 1829 + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 1830 + "dev": true, 1831 + "license": "MIT", 1832 + "engines": { 1833 + "node": ">=8" 1834 + } 1835 + }, 1836 + "node_modules/@jest/console": { 1837 + "version": "30.0.2", 1838 + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.2.tgz", 1839 + "integrity": "sha512-krGElPU0FipAqpVZ/BRZOy0MZh/ARdJ0Nj+PiH1ykFY1+VpBlYNLjdjVA5CFKxnKR6PFqFutO4Z7cdK9BlGiDA==", 1840 + "dev": true, 1841 + "license": "MIT", 1842 + "dependencies": { 1843 + "@jest/types": "30.0.1", 1844 + "@types/node": "*", 1845 + "chalk": "^4.1.2", 1846 + "jest-message-util": "30.0.2", 1847 + "jest-util": "30.0.2", 1848 + "slash": "^3.0.0" 1849 + }, 1850 + "engines": { 1851 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1852 + } 1853 + }, 1854 + "node_modules/@jest/core": { 1855 + "version": "30.0.2", 1856 + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.2.tgz", 1857 + "integrity": "sha512-mUMFdDtYWu7la63NxlyNIhgnzynszxunXWrtryR7bV24jV9hmi7XCZTzZHaLJjcBU66MeUAPZ81HjwASVpYhYQ==", 1858 + "dev": true, 1859 + "license": "MIT", 1860 + "dependencies": { 1861 + "@jest/console": "30.0.2", 1862 + "@jest/pattern": "30.0.1", 1863 + "@jest/reporters": "30.0.2", 1864 + "@jest/test-result": "30.0.2", 1865 + "@jest/transform": "30.0.2", 1866 + "@jest/types": "30.0.1", 1867 + "@types/node": "*", 1868 + "ansi-escapes": "^4.3.2", 1869 + "chalk": "^4.1.2", 1870 + "ci-info": "^4.2.0", 1871 + "exit-x": "^0.2.2", 1872 + "graceful-fs": "^4.2.11", 1873 + "jest-changed-files": "30.0.2", 1874 + "jest-config": "30.0.2", 1875 + "jest-haste-map": "30.0.2", 1876 + "jest-message-util": "30.0.2", 1877 + "jest-regex-util": "30.0.1", 1878 + "jest-resolve": "30.0.2", 1879 + "jest-resolve-dependencies": "30.0.2", 1880 + "jest-runner": "30.0.2", 1881 + "jest-runtime": "30.0.2", 1882 + "jest-snapshot": "30.0.2", 1883 + "jest-util": "30.0.2", 1884 + "jest-validate": "30.0.2", 1885 + "jest-watcher": "30.0.2", 1886 + "micromatch": "^4.0.8", 1887 + "pretty-format": "30.0.2", 1888 + "slash": "^3.0.0" 1889 + }, 1890 + "engines": { 1891 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1892 + }, 1893 + "peerDependencies": { 1894 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 1895 + }, 1896 + "peerDependenciesMeta": { 1897 + "node-notifier": { 1898 + "optional": true 1899 + } 1900 + } 1901 + }, 1902 + "node_modules/@jest/diff-sequences": { 1903 + "version": "30.0.1", 1904 + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", 1905 + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", 1906 + "dev": true, 1907 + "license": "MIT", 1908 + "engines": { 1909 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1910 + } 1911 + }, 1912 + "node_modules/@jest/environment": { 1913 + "version": "30.0.2", 1914 + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.2.tgz", 1915 + "integrity": "sha512-hRLhZRJNxBiOhxIKSq2UkrlhMt3/zVFQOAi5lvS8T9I03+kxsbflwHJEF+eXEYXCrRGRhHwECT7CDk6DyngsRA==", 1916 + "dev": true, 1917 + "license": "MIT", 1918 + "dependencies": { 1919 + "@jest/fake-timers": "30.0.2", 1920 + "@jest/types": "30.0.1", 1921 + "@types/node": "*", 1922 + "jest-mock": "30.0.2" 1923 + }, 1924 + "engines": { 1925 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1926 + } 1927 + }, 1928 + "node_modules/@jest/expect": { 1929 + "version": "30.0.2", 1930 + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.2.tgz", 1931 + "integrity": "sha512-blWRFPjv2cVfh42nLG6L3xIEbw+bnuiZYZDl/BZlsNG/i3wKV6FpPZ2EPHguk7t5QpLaouIu+7JmYO4uBR6AOg==", 1932 + "dev": true, 1933 + "license": "MIT", 1934 + "dependencies": { 1935 + "expect": "30.0.2", 1936 + "jest-snapshot": "30.0.2" 1937 + }, 1938 + "engines": { 1939 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1940 + } 1941 + }, 1942 + "node_modules/@jest/expect-utils": { 1943 + "version": "30.0.2", 1944 + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.2.tgz", 1945 + "integrity": "sha512-FHF2YdtFBUQOo0/qdgt+6UdBFcNPF/TkVzcc+4vvf8uaBzUlONytGBeeudufIHHW1khRfM1sBbRT1VCK7n/0dQ==", 1946 + "dev": true, 1947 + "license": "MIT", 1948 + "dependencies": { 1949 + "@jest/get-type": "30.0.1" 1950 + }, 1951 + "engines": { 1952 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1953 + } 1954 + }, 1955 + "node_modules/@jest/fake-timers": { 1956 + "version": "30.0.2", 1957 + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.2.tgz", 1958 + "integrity": "sha512-jfx0Xg7l0gmphTY9UKm5RtH12BlLYj/2Plj6wXjVW5Era4FZKfXeIvwC67WX+4q8UCFxYS20IgnMcFBcEU0DtA==", 1959 + "dev": true, 1960 + "license": "MIT", 1961 + "dependencies": { 1962 + "@jest/types": "30.0.1", 1963 + "@sinonjs/fake-timers": "^13.0.0", 1964 + "@types/node": "*", 1965 + "jest-message-util": "30.0.2", 1966 + "jest-mock": "30.0.2", 1967 + "jest-util": "30.0.2" 1968 + }, 1969 + "engines": { 1970 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1971 + } 1972 + }, 1973 + "node_modules/@jest/get-type": { 1974 + "version": "30.0.1", 1975 + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", 1976 + "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", 1977 + "dev": true, 1978 + "license": "MIT", 1979 + "engines": { 1980 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1981 + } 1982 + }, 1983 + "node_modules/@jest/globals": { 1984 + "version": "30.0.2", 1985 + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.2.tgz", 1986 + "integrity": "sha512-DwTtus9jjbG7b6jUdkcVdptf0wtD1v153A+PVwWB/zFwXhqu6hhtSd+uq88jofMhmYPtkmPmVGUBRNCZEKXn+w==", 1987 + "dev": true, 1988 + "license": "MIT", 1989 + "dependencies": { 1990 + "@jest/environment": "30.0.2", 1991 + "@jest/expect": "30.0.2", 1992 + "@jest/types": "30.0.1", 1993 + "jest-mock": "30.0.2" 1994 + }, 1995 + "engines": { 1996 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 1997 + } 1998 + }, 1999 + "node_modules/@jest/pattern": { 2000 + "version": "30.0.1", 2001 + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", 2002 + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", 2003 + "dev": true, 2004 + "license": "MIT", 2005 + "dependencies": { 2006 + "@types/node": "*", 2007 + "jest-regex-util": "30.0.1" 2008 + }, 2009 + "engines": { 2010 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2011 + } 2012 + }, 2013 + "node_modules/@jest/reporters": { 2014 + "version": "30.0.2", 2015 + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.2.tgz", 2016 + "integrity": "sha512-l4QzS/oKf57F8WtPZK+vvF4Io6ukplc6XgNFu4Hd/QxaLEO9f+8dSFzUua62Oe0HKlCUjKHpltKErAgDiMJKsA==", 2017 + "dev": true, 2018 + "license": "MIT", 2019 + "dependencies": { 2020 + "@bcoe/v8-coverage": "^0.2.3", 2021 + "@jest/console": "30.0.2", 2022 + "@jest/test-result": "30.0.2", 2023 + "@jest/transform": "30.0.2", 2024 + "@jest/types": "30.0.1", 2025 + "@jridgewell/trace-mapping": "^0.3.25", 2026 + "@types/node": "*", 2027 + "chalk": "^4.1.2", 2028 + "collect-v8-coverage": "^1.0.2", 2029 + "exit-x": "^0.2.2", 2030 + "glob": "^10.3.10", 2031 + "graceful-fs": "^4.2.11", 2032 + "istanbul-lib-coverage": "^3.0.0", 2033 + "istanbul-lib-instrument": "^6.0.0", 2034 + "istanbul-lib-report": "^3.0.0", 2035 + "istanbul-lib-source-maps": "^5.0.0", 2036 + "istanbul-reports": "^3.1.3", 2037 + "jest-message-util": "30.0.2", 2038 + "jest-util": "30.0.2", 2039 + "jest-worker": "30.0.2", 2040 + "slash": "^3.0.0", 2041 + "string-length": "^4.0.2", 2042 + "v8-to-istanbul": "^9.0.1" 2043 + }, 2044 + "engines": { 2045 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2046 + }, 2047 + "peerDependencies": { 2048 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2049 + }, 2050 + "peerDependenciesMeta": { 2051 + "node-notifier": { 2052 + "optional": true 2053 + } 2054 + } 2055 + }, 2056 + "node_modules/@jest/schemas": { 2057 + "version": "30.0.1", 2058 + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", 2059 + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", 2060 + "dev": true, 2061 + "license": "MIT", 2062 + "dependencies": { 2063 + "@sinclair/typebox": "^0.34.0" 2064 + }, 2065 + "engines": { 2066 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2067 + } 2068 + }, 2069 + "node_modules/@jest/snapshot-utils": { 2070 + "version": "30.0.1", 2071 + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.1.tgz", 2072 + "integrity": "sha512-6Dpv7vdtoRiISEFwYF8/c7LIvqXD7xDXtLPNzC2xqAfBznKip0MQM+rkseKwUPUpv2PJ7KW/YsnwWXrIL2xF+A==", 2073 + "dev": true, 2074 + "license": "MIT", 2075 + "dependencies": { 2076 + "@jest/types": "30.0.1", 2077 + "chalk": "^4.1.2", 2078 + "graceful-fs": "^4.2.11", 2079 + "natural-compare": "^1.4.0" 2080 + }, 2081 + "engines": { 2082 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2083 + } 2084 + }, 2085 + "node_modules/@jest/source-map": { 2086 + "version": "30.0.1", 2087 + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", 2088 + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", 2089 + "dev": true, 2090 + "license": "MIT", 2091 + "dependencies": { 2092 + "@jridgewell/trace-mapping": "^0.3.25", 2093 + "callsites": "^3.1.0", 2094 + "graceful-fs": "^4.2.11" 2095 + }, 2096 + "engines": { 2097 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2098 + } 2099 + }, 2100 + "node_modules/@jest/test-result": { 2101 + "version": "30.0.2", 2102 + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.2.tgz", 2103 + "integrity": "sha512-KKMuBKkkZYP/GfHMhI+cH2/P3+taMZS3qnqqiPC1UXZTJskkCS+YU/ILCtw5anw1+YsTulDHFpDo70mmCedW8w==", 2104 + "dev": true, 2105 + "license": "MIT", 2106 + "dependencies": { 2107 + "@jest/console": "30.0.2", 2108 + "@jest/types": "30.0.1", 2109 + "@types/istanbul-lib-coverage": "^2.0.6", 2110 + "collect-v8-coverage": "^1.0.2" 2111 + }, 2112 + "engines": { 2113 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2114 + } 2115 + }, 2116 + "node_modules/@jest/test-sequencer": { 2117 + "version": "30.0.2", 2118 + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.2.tgz", 2119 + "integrity": "sha512-fbyU5HPka0rkalZ3MXVvq0hwZY8dx3Y6SCqR64zRmh+xXlDeFl0IdL4l9e7vp4gxEXTYHbwLFA1D+WW5CucaSw==", 2120 + "dev": true, 2121 + "license": "MIT", 2122 + "dependencies": { 2123 + "@jest/test-result": "30.0.2", 2124 + "graceful-fs": "^4.2.11", 2125 + "jest-haste-map": "30.0.2", 2126 + "slash": "^3.0.0" 2127 + }, 2128 + "engines": { 2129 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2130 + } 2131 + }, 2132 + "node_modules/@jest/transform": { 2133 + "version": "30.0.2", 2134 + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.2.tgz", 2135 + "integrity": "sha512-kJIuhLMTxRF7sc0gPzPtCDib/V9KwW3I2U25b+lYCYMVqHHSrcZopS8J8H+znx9yixuFv+Iozl8raLt/4MoxrA==", 2136 + "dev": true, 2137 + "license": "MIT", 2138 + "dependencies": { 2139 + "@babel/core": "^7.27.4", 2140 + "@jest/types": "30.0.1", 2141 + "@jridgewell/trace-mapping": "^0.3.25", 2142 + "babel-plugin-istanbul": "^7.0.0", 2143 + "chalk": "^4.1.2", 2144 + "convert-source-map": "^2.0.0", 2145 + "fast-json-stable-stringify": "^2.1.0", 2146 + "graceful-fs": "^4.2.11", 2147 + "jest-haste-map": "30.0.2", 2148 + "jest-regex-util": "30.0.1", 2149 + "jest-util": "30.0.2", 2150 + "micromatch": "^4.0.8", 2151 + "pirates": "^4.0.7", 2152 + "slash": "^3.0.0", 2153 + "write-file-atomic": "^5.0.1" 2154 + }, 2155 + "engines": { 2156 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2157 + } 2158 + }, 2159 + "node_modules/@jest/types": { 2160 + "version": "30.0.1", 2161 + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.1.tgz", 2162 + "integrity": "sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==", 2163 + "dev": true, 2164 + "license": "MIT", 2165 + "dependencies": { 2166 + "@jest/pattern": "30.0.1", 2167 + "@jest/schemas": "30.0.1", 2168 + "@types/istanbul-lib-coverage": "^2.0.6", 2169 + "@types/istanbul-reports": "^3.0.4", 2170 + "@types/node": "*", 2171 + "@types/yargs": "^17.0.33", 2172 + "chalk": "^4.1.2" 2173 + }, 2174 + "engines": { 2175 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2176 + } 2177 + }, 2178 + "node_modules/@jridgewell/gen-mapping": { 2179 + "version": "0.3.8", 2180 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 2181 + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 2182 + "dev": true, 2183 + "license": "MIT", 2184 + "dependencies": { 2185 + "@jridgewell/set-array": "^1.2.1", 2186 + "@jridgewell/sourcemap-codec": "^1.4.10", 2187 + "@jridgewell/trace-mapping": "^0.3.24" 2188 + }, 2189 + "engines": { 2190 + "node": ">=6.0.0" 2191 + } 2192 + }, 2193 + "node_modules/@jridgewell/resolve-uri": { 2194 + "version": "3.1.2", 2195 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 2196 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 2197 + "dev": true, 2198 + "license": "MIT", 2199 + "engines": { 2200 + "node": ">=6.0.0" 2201 + } 2202 + }, 2203 + "node_modules/@jridgewell/set-array": { 2204 + "version": "1.2.1", 2205 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 2206 + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 2207 + "dev": true, 2208 + "license": "MIT", 2209 + "engines": { 2210 + "node": ">=6.0.0" 2211 + } 2212 + }, 2213 + "node_modules/@jridgewell/sourcemap-codec": { 2214 + "version": "1.5.0", 2215 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 2216 + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 2217 + "dev": true, 2218 + "license": "MIT" 2219 + }, 2220 + "node_modules/@jridgewell/trace-mapping": { 2221 + "version": "0.3.25", 2222 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 2223 + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 2224 + "dev": true, 2225 + "license": "MIT", 2226 + "dependencies": { 2227 + "@jridgewell/resolve-uri": "^3.1.0", 2228 + "@jridgewell/sourcemap-codec": "^1.4.14" 2229 + } 2230 + }, 2231 + "node_modules/@napi-rs/wasm-runtime": { 2232 + "version": "0.2.11", 2233 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", 2234 + "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", 2235 + "dev": true, 2236 + "license": "MIT", 2237 + "optional": true, 2238 + "dependencies": { 2239 + "@emnapi/core": "^1.4.3", 2240 + "@emnapi/runtime": "^1.4.3", 2241 + "@tybys/wasm-util": "^0.9.0" 2242 + } 2243 + }, 1147 2244 "node_modules/@noble/curves": { 1148 2245 "version": "1.9.2", 1149 2246 "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", ··· 1171 2268 "url": "https://paulmillr.com/funding/" 1172 2269 } 1173 2270 }, 2271 + "node_modules/@paralleldrive/cuid2": { 2272 + "version": "2.2.2", 2273 + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", 2274 + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", 2275 + "dev": true, 2276 + "license": "MIT", 2277 + "dependencies": { 2278 + "@noble/hashes": "^1.1.5" 2279 + } 2280 + }, 2281 + "node_modules/@pkgjs/parseargs": { 2282 + "version": "0.11.0", 2283 + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 2284 + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 2285 + "dev": true, 2286 + "license": "MIT", 2287 + "optional": true, 2288 + "engines": { 2289 + "node": ">=14" 2290 + } 2291 + }, 2292 + "node_modules/@pkgr/core": { 2293 + "version": "0.2.7", 2294 + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", 2295 + "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", 2296 + "dev": true, 2297 + "license": "MIT", 2298 + "engines": { 2299 + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 2300 + }, 2301 + "funding": { 2302 + "url": "https://opencollective.com/pkgr" 2303 + } 2304 + }, 2305 + "node_modules/@sinclair/typebox": { 2306 + "version": "0.34.35", 2307 + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.35.tgz", 2308 + "integrity": "sha512-C6ypdODf2VZkgRT6sFM8E1F8vR+HcffniX0Kp8MsU8PIfrlXbNCBz0jzj17GjdmjTx1OtZzdH8+iALL21UjF5A==", 2309 + "dev": true, 2310 + "license": "MIT" 2311 + }, 2312 + "node_modules/@sinonjs/commons": { 2313 + "version": "3.0.1", 2314 + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", 2315 + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", 2316 + "dev": true, 2317 + "license": "BSD-3-Clause", 2318 + "dependencies": { 2319 + "type-detect": "4.0.8" 2320 + } 2321 + }, 2322 + "node_modules/@sinonjs/fake-timers": { 2323 + "version": "13.0.5", 2324 + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", 2325 + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", 2326 + "dev": true, 2327 + "license": "BSD-3-Clause", 2328 + "dependencies": { 2329 + "@sinonjs/commons": "^3.0.1" 2330 + } 2331 + }, 1174 2332 "node_modules/@skyware/firehose": { 1175 2333 "version": "0.5.1", 1176 2334 "resolved": "https://registry.npmjs.org/@skyware/firehose/-/firehose-0.5.1.tgz", ··· 1182 2340 "nanoevents": "^9.1.0" 1183 2341 } 1184 2342 }, 2343 + "node_modules/@tybys/wasm-util": { 2344 + "version": "0.9.0", 2345 + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", 2346 + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", 2347 + "dev": true, 2348 + "license": "MIT", 2349 + "optional": true, 2350 + "dependencies": { 2351 + "tslib": "^2.4.0" 2352 + } 2353 + }, 2354 + "node_modules/@types/babel__core": { 2355 + "version": "7.20.5", 2356 + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 2357 + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 2358 + "dev": true, 2359 + "license": "MIT", 2360 + "dependencies": { 2361 + "@babel/parser": "^7.20.7", 2362 + "@babel/types": "^7.20.7", 2363 + "@types/babel__generator": "*", 2364 + "@types/babel__template": "*", 2365 + "@types/babel__traverse": "*" 2366 + } 2367 + }, 2368 + "node_modules/@types/babel__generator": { 2369 + "version": "7.27.0", 2370 + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 2371 + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 2372 + "dev": true, 2373 + "license": "MIT", 2374 + "dependencies": { 2375 + "@babel/types": "^7.0.0" 2376 + } 2377 + }, 2378 + "node_modules/@types/babel__template": { 2379 + "version": "7.4.4", 2380 + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 2381 + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 2382 + "dev": true, 2383 + "license": "MIT", 2384 + "dependencies": { 2385 + "@babel/parser": "^7.1.0", 2386 + "@babel/types": "^7.0.0" 2387 + } 2388 + }, 2389 + "node_modules/@types/babel__traverse": { 2390 + "version": "7.20.7", 2391 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", 2392 + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", 2393 + "dev": true, 2394 + "license": "MIT", 2395 + "dependencies": { 2396 + "@babel/types": "^7.20.7" 2397 + } 2398 + }, 1185 2399 "node_modules/@types/better-sqlite3": { 1186 2400 "version": "7.6.13", 1187 2401 "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", ··· 1210 2424 "@types/node": "*" 1211 2425 } 1212 2426 }, 2427 + "node_modules/@types/cookiejar": { 2428 + "version": "2.1.5", 2429 + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", 2430 + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", 2431 + "dev": true, 2432 + "license": "MIT" 2433 + }, 1213 2434 "node_modules/@types/cors": { 1214 2435 "version": "2.8.19", 1215 2436 "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", ··· 1257 2478 "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", 1258 2479 "license": "MIT" 1259 2480 }, 2481 + "node_modules/@types/istanbul-lib-coverage": { 2482 + "version": "2.0.6", 2483 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", 2484 + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", 2485 + "dev": true, 2486 + "license": "MIT" 2487 + }, 2488 + "node_modules/@types/istanbul-lib-report": { 2489 + "version": "3.0.3", 2490 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", 2491 + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", 2492 + "dev": true, 2493 + "license": "MIT", 2494 + "dependencies": { 2495 + "@types/istanbul-lib-coverage": "*" 2496 + } 2497 + }, 2498 + "node_modules/@types/istanbul-reports": { 2499 + "version": "3.0.4", 2500 + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", 2501 + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", 2502 + "dev": true, 2503 + "license": "MIT", 2504 + "dependencies": { 2505 + "@types/istanbul-lib-report": "*" 2506 + } 2507 + }, 2508 + "node_modules/@types/jest": { 2509 + "version": "30.0.0", 2510 + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", 2511 + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", 2512 + "dev": true, 2513 + "license": "MIT", 2514 + "dependencies": { 2515 + "expect": "^30.0.0", 2516 + "pretty-format": "^30.0.0" 2517 + } 2518 + }, 2519 + "node_modules/@types/methods": { 2520 + "version": "1.1.4", 2521 + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", 2522 + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", 2523 + "dev": true, 2524 + "license": "MIT" 2525 + }, 1260 2526 "node_modules/@types/mime": { 1261 2527 "version": "1.3.5", 1262 2528 "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", ··· 1305 2571 "@types/send": "*" 1306 2572 } 1307 2573 }, 2574 + "node_modules/@types/stack-utils": { 2575 + "version": "2.0.3", 2576 + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", 2577 + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", 2578 + "dev": true, 2579 + "license": "MIT" 2580 + }, 2581 + "node_modules/@types/superagent": { 2582 + "version": "8.1.9", 2583 + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", 2584 + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", 2585 + "dev": true, 2586 + "license": "MIT", 2587 + "dependencies": { 2588 + "@types/cookiejar": "^2.1.5", 2589 + "@types/methods": "^1.1.4", 2590 + "@types/node": "*", 2591 + "form-data": "^4.0.0" 2592 + } 2593 + }, 2594 + "node_modules/@types/supertest": { 2595 + "version": "6.0.3", 2596 + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", 2597 + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", 2598 + "dev": true, 2599 + "license": "MIT", 2600 + "dependencies": { 2601 + "@types/methods": "^1.1.4", 2602 + "@types/superagent": "^8.1.0" 2603 + } 2604 + }, 1308 2605 "node_modules/@types/ws": { 1309 2606 "version": "8.18.1", 1310 2607 "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", ··· 1314 2611 "@types/node": "*" 1315 2612 } 1316 2613 }, 2614 + "node_modules/@types/yargs": { 2615 + "version": "17.0.33", 2616 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", 2617 + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", 2618 + "dev": true, 2619 + "license": "MIT", 2620 + "dependencies": { 2621 + "@types/yargs-parser": "*" 2622 + } 2623 + }, 2624 + "node_modules/@types/yargs-parser": { 2625 + "version": "21.0.3", 2626 + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", 2627 + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", 2628 + "dev": true, 2629 + "license": "MIT" 2630 + }, 2631 + "node_modules/@ungap/structured-clone": { 2632 + "version": "1.3.0", 2633 + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 2634 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 2635 + "dev": true, 2636 + "license": "ISC" 2637 + }, 2638 + "node_modules/@unrs/resolver-binding-android-arm-eabi": { 2639 + "version": "1.9.0", 2640 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", 2641 + "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", 2642 + "cpu": [ 2643 + "arm" 2644 + ], 2645 + "dev": true, 2646 + "license": "MIT", 2647 + "optional": true, 2648 + "os": [ 2649 + "android" 2650 + ] 2651 + }, 2652 + "node_modules/@unrs/resolver-binding-android-arm64": { 2653 + "version": "1.9.0", 2654 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", 2655 + "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", 2656 + "cpu": [ 2657 + "arm64" 2658 + ], 2659 + "dev": true, 2660 + "license": "MIT", 2661 + "optional": true, 2662 + "os": [ 2663 + "android" 2664 + ] 2665 + }, 2666 + "node_modules/@unrs/resolver-binding-darwin-arm64": { 2667 + "version": "1.9.0", 2668 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz", 2669 + "integrity": "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==", 2670 + "cpu": [ 2671 + "arm64" 2672 + ], 2673 + "dev": true, 2674 + "license": "MIT", 2675 + "optional": true, 2676 + "os": [ 2677 + "darwin" 2678 + ] 2679 + }, 2680 + "node_modules/@unrs/resolver-binding-darwin-x64": { 2681 + "version": "1.9.0", 2682 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", 2683 + "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", 2684 + "cpu": [ 2685 + "x64" 2686 + ], 2687 + "dev": true, 2688 + "license": "MIT", 2689 + "optional": true, 2690 + "os": [ 2691 + "darwin" 2692 + ] 2693 + }, 2694 + "node_modules/@unrs/resolver-binding-freebsd-x64": { 2695 + "version": "1.9.0", 2696 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", 2697 + "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", 2698 + "cpu": [ 2699 + "x64" 2700 + ], 2701 + "dev": true, 2702 + "license": "MIT", 2703 + "optional": true, 2704 + "os": [ 2705 + "freebsd" 2706 + ] 2707 + }, 2708 + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { 2709 + "version": "1.9.0", 2710 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", 2711 + "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", 2712 + "cpu": [ 2713 + "arm" 2714 + ], 2715 + "dev": true, 2716 + "license": "MIT", 2717 + "optional": true, 2718 + "os": [ 2719 + "linux" 2720 + ] 2721 + }, 2722 + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { 2723 + "version": "1.9.0", 2724 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.0.tgz", 2725 + "integrity": "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==", 2726 + "cpu": [ 2727 + "arm" 2728 + ], 2729 + "dev": true, 2730 + "license": "MIT", 2731 + "optional": true, 2732 + "os": [ 2733 + "linux" 2734 + ] 2735 + }, 2736 + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { 2737 + "version": "1.9.0", 2738 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.0.tgz", 2739 + "integrity": "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==", 2740 + "cpu": [ 2741 + "arm64" 2742 + ], 2743 + "dev": true, 2744 + "license": "MIT", 2745 + "optional": true, 2746 + "os": [ 2747 + "linux" 2748 + ] 2749 + }, 2750 + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { 2751 + "version": "1.9.0", 2752 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.0.tgz", 2753 + "integrity": "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==", 2754 + "cpu": [ 2755 + "arm64" 2756 + ], 2757 + "dev": true, 2758 + "license": "MIT", 2759 + "optional": true, 2760 + "os": [ 2761 + "linux" 2762 + ] 2763 + }, 2764 + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { 2765 + "version": "1.9.0", 2766 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.0.tgz", 2767 + "integrity": "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==", 2768 + "cpu": [ 2769 + "ppc64" 2770 + ], 2771 + "dev": true, 2772 + "license": "MIT", 2773 + "optional": true, 2774 + "os": [ 2775 + "linux" 2776 + ] 2777 + }, 2778 + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { 2779 + "version": "1.9.0", 2780 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.0.tgz", 2781 + "integrity": "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==", 2782 + "cpu": [ 2783 + "riscv64" 2784 + ], 2785 + "dev": true, 2786 + "license": "MIT", 2787 + "optional": true, 2788 + "os": [ 2789 + "linux" 2790 + ] 2791 + }, 2792 + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { 2793 + "version": "1.9.0", 2794 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.0.tgz", 2795 + "integrity": "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==", 2796 + "cpu": [ 2797 + "riscv64" 2798 + ], 2799 + "dev": true, 2800 + "license": "MIT", 2801 + "optional": true, 2802 + "os": [ 2803 + "linux" 2804 + ] 2805 + }, 2806 + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { 2807 + "version": "1.9.0", 2808 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.0.tgz", 2809 + "integrity": "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==", 2810 + "cpu": [ 2811 + "s390x" 2812 + ], 2813 + "dev": true, 2814 + "license": "MIT", 2815 + "optional": true, 2816 + "os": [ 2817 + "linux" 2818 + ] 2819 + }, 2820 + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { 2821 + "version": "1.9.0", 2822 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.0.tgz", 2823 + "integrity": "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==", 2824 + "cpu": [ 2825 + "x64" 2826 + ], 2827 + "dev": true, 2828 + "license": "MIT", 2829 + "optional": true, 2830 + "os": [ 2831 + "linux" 2832 + ] 2833 + }, 2834 + "node_modules/@unrs/resolver-binding-linux-x64-musl": { 2835 + "version": "1.9.0", 2836 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.0.tgz", 2837 + "integrity": "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==", 2838 + "cpu": [ 2839 + "x64" 2840 + ], 2841 + "dev": true, 2842 + "license": "MIT", 2843 + "optional": true, 2844 + "os": [ 2845 + "linux" 2846 + ] 2847 + }, 2848 + "node_modules/@unrs/resolver-binding-wasm32-wasi": { 2849 + "version": "1.9.0", 2850 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.0.tgz", 2851 + "integrity": "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==", 2852 + "cpu": [ 2853 + "wasm32" 2854 + ], 2855 + "dev": true, 2856 + "license": "MIT", 2857 + "optional": true, 2858 + "dependencies": { 2859 + "@napi-rs/wasm-runtime": "^0.2.11" 2860 + }, 2861 + "engines": { 2862 + "node": ">=14.0.0" 2863 + } 2864 + }, 2865 + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { 2866 + "version": "1.9.0", 2867 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.0.tgz", 2868 + "integrity": "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==", 2869 + "cpu": [ 2870 + "arm64" 2871 + ], 2872 + "dev": true, 2873 + "license": "MIT", 2874 + "optional": true, 2875 + "os": [ 2876 + "win32" 2877 + ] 2878 + }, 2879 + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { 2880 + "version": "1.9.0", 2881 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.0.tgz", 2882 + "integrity": "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==", 2883 + "cpu": [ 2884 + "ia32" 2885 + ], 2886 + "dev": true, 2887 + "license": "MIT", 2888 + "optional": true, 2889 + "os": [ 2890 + "win32" 2891 + ] 2892 + }, 2893 + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { 2894 + "version": "1.9.0", 2895 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz", 2896 + "integrity": "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==", 2897 + "cpu": [ 2898 + "x64" 2899 + ], 2900 + "dev": true, 2901 + "license": "MIT", 2902 + "optional": true, 2903 + "os": [ 2904 + "win32" 2905 + ] 2906 + }, 1317 2907 "node_modules/abort-controller": { 1318 2908 "version": "3.0.0", 1319 2909 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", ··· 1339 2929 "node": ">= 0.6" 1340 2930 } 1341 2931 }, 2932 + "node_modules/ansi-escapes": { 2933 + "version": "4.3.2", 2934 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 2935 + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 2936 + "dev": true, 2937 + "license": "MIT", 2938 + "dependencies": { 2939 + "type-fest": "^0.21.3" 2940 + }, 2941 + "engines": { 2942 + "node": ">=8" 2943 + }, 2944 + "funding": { 2945 + "url": "https://github.com/sponsors/sindresorhus" 2946 + } 2947 + }, 1342 2948 "node_modules/ansi-regex": { 1343 2949 "version": "5.0.1", 1344 2950 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", ··· 1364 2970 "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1365 2971 } 1366 2972 }, 2973 + "node_modules/anymatch": { 2974 + "version": "3.1.3", 2975 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 2976 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 2977 + "dev": true, 2978 + "license": "ISC", 2979 + "dependencies": { 2980 + "normalize-path": "^3.0.0", 2981 + "picomatch": "^2.0.4" 2982 + }, 2983 + "engines": { 2984 + "node": ">= 8" 2985 + } 2986 + }, 2987 + "node_modules/argparse": { 2988 + "version": "1.0.10", 2989 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 2990 + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 2991 + "dev": true, 2992 + "license": "MIT", 2993 + "dependencies": { 2994 + "sprintf-js": "~1.0.2" 2995 + } 2996 + }, 1367 2997 "node_modules/array-flatten": { 1368 2998 "version": "1.1.1", 1369 2999 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1370 3000 "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 1371 3001 "license": "MIT" 1372 3002 }, 3003 + "node_modules/asap": { 3004 + "version": "2.0.6", 3005 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 3006 + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", 3007 + "dev": true, 3008 + "license": "MIT" 3009 + }, 1373 3010 "node_modules/async": { 1374 3011 "version": "3.2.6", 1375 3012 "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", 1376 3013 "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", 1377 3014 "license": "MIT" 1378 3015 }, 3016 + "node_modules/asynckit": { 3017 + "version": "0.4.0", 3018 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 3019 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 3020 + "dev": true, 3021 + "license": "MIT" 3022 + }, 1379 3023 "node_modules/atomic-sleep": { 1380 3024 "version": "1.0.0", 1381 3025 "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", ··· 1391 3035 "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 1392 3036 "license": "MIT" 1393 3037 }, 3038 + "node_modules/babel-jest": { 3039 + "version": "30.0.2", 3040 + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.2.tgz", 3041 + "integrity": "sha512-A5kqR1/EUTidM2YC2YMEUDP2+19ppgOwK0IAd9Swc3q2KqFb5f9PtRUXVeZcngu0z5mDMyZ9zH2huJZSOMLiTQ==", 3042 + "dev": true, 3043 + "license": "MIT", 3044 + "dependencies": { 3045 + "@jest/transform": "30.0.2", 3046 + "@types/babel__core": "^7.20.5", 3047 + "babel-plugin-istanbul": "^7.0.0", 3048 + "babel-preset-jest": "30.0.1", 3049 + "chalk": "^4.1.2", 3050 + "graceful-fs": "^4.2.11", 3051 + "slash": "^3.0.0" 3052 + }, 3053 + "engines": { 3054 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 3055 + }, 3056 + "peerDependencies": { 3057 + "@babel/core": "^7.11.0" 3058 + } 3059 + }, 3060 + "node_modules/babel-plugin-istanbul": { 3061 + "version": "7.0.0", 3062 + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", 3063 + "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", 3064 + "dev": true, 3065 + "license": "BSD-3-Clause", 3066 + "dependencies": { 3067 + "@babel/helper-plugin-utils": "^7.0.0", 3068 + "@istanbuljs/load-nyc-config": "^1.0.0", 3069 + "@istanbuljs/schema": "^0.1.3", 3070 + "istanbul-lib-instrument": "^6.0.2", 3071 + "test-exclude": "^6.0.0" 3072 + }, 3073 + "engines": { 3074 + "node": ">=12" 3075 + } 3076 + }, 3077 + "node_modules/babel-plugin-jest-hoist": { 3078 + "version": "30.0.1", 3079 + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", 3080 + "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", 3081 + "dev": true, 3082 + "license": "MIT", 3083 + "dependencies": { 3084 + "@babel/template": "^7.27.2", 3085 + "@babel/types": "^7.27.3", 3086 + "@types/babel__core": "^7.20.5" 3087 + }, 3088 + "engines": { 3089 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 3090 + } 3091 + }, 3092 + "node_modules/babel-preset-current-node-syntax": { 3093 + "version": "1.1.0", 3094 + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", 3095 + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", 3096 + "dev": true, 3097 + "license": "MIT", 3098 + "dependencies": { 3099 + "@babel/plugin-syntax-async-generators": "^7.8.4", 3100 + "@babel/plugin-syntax-bigint": "^7.8.3", 3101 + "@babel/plugin-syntax-class-properties": "^7.12.13", 3102 + "@babel/plugin-syntax-class-static-block": "^7.14.5", 3103 + "@babel/plugin-syntax-import-attributes": "^7.24.7", 3104 + "@babel/plugin-syntax-import-meta": "^7.10.4", 3105 + "@babel/plugin-syntax-json-strings": "^7.8.3", 3106 + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 3107 + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 3108 + "@babel/plugin-syntax-numeric-separator": "^7.10.4", 3109 + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 3110 + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 3111 + "@babel/plugin-syntax-optional-chaining": "^7.8.3", 3112 + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", 3113 + "@babel/plugin-syntax-top-level-await": "^7.14.5" 3114 + }, 3115 + "peerDependencies": { 3116 + "@babel/core": "^7.0.0" 3117 + } 3118 + }, 3119 + "node_modules/babel-preset-jest": { 3120 + "version": "30.0.1", 3121 + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", 3122 + "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", 3123 + "dev": true, 3124 + "license": "MIT", 3125 + "dependencies": { 3126 + "babel-plugin-jest-hoist": "30.0.1", 3127 + "babel-preset-current-node-syntax": "^1.1.0" 3128 + }, 3129 + "engines": { 3130 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 3131 + }, 3132 + "peerDependencies": { 3133 + "@babel/core": "^7.11.0" 3134 + } 3135 + }, 1394 3136 "node_modules/balanced-match": { 1395 3137 "version": "1.0.2", 1396 3138 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ··· 1478 3220 "concat-map": "0.0.1" 1479 3221 } 1480 3222 }, 3223 + "node_modules/braces": { 3224 + "version": "3.0.3", 3225 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 3226 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 3227 + "dev": true, 3228 + "license": "MIT", 3229 + "dependencies": { 3230 + "fill-range": "^7.1.1" 3231 + }, 3232 + "engines": { 3233 + "node": ">=8" 3234 + } 3235 + }, 3236 + "node_modules/browserslist": { 3237 + "version": "4.25.0", 3238 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", 3239 + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", 3240 + "dev": true, 3241 + "funding": [ 3242 + { 3243 + "type": "opencollective", 3244 + "url": "https://opencollective.com/browserslist" 3245 + }, 3246 + { 3247 + "type": "tidelift", 3248 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3249 + }, 3250 + { 3251 + "type": "github", 3252 + "url": "https://github.com/sponsors/ai" 3253 + } 3254 + ], 3255 + "license": "MIT", 3256 + "dependencies": { 3257 + "caniuse-lite": "^1.0.30001718", 3258 + "electron-to-chromium": "^1.5.160", 3259 + "node-releases": "^2.0.19", 3260 + "update-browserslist-db": "^1.1.3" 3261 + }, 3262 + "bin": { 3263 + "browserslist": "cli.js" 3264 + }, 3265 + "engines": { 3266 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 3267 + } 3268 + }, 3269 + "node_modules/bs-logger": { 3270 + "version": "0.2.6", 3271 + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", 3272 + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", 3273 + "dev": true, 3274 + "license": "MIT", 3275 + "dependencies": { 3276 + "fast-json-stable-stringify": "2.x" 3277 + }, 3278 + "engines": { 3279 + "node": ">= 6" 3280 + } 3281 + }, 3282 + "node_modules/bser": { 3283 + "version": "2.1.1", 3284 + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 3285 + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 3286 + "dev": true, 3287 + "license": "Apache-2.0", 3288 + "dependencies": { 3289 + "node-int64": "^0.4.0" 3290 + } 3291 + }, 1481 3292 "node_modules/buffer": { 1482 3293 "version": "5.7.1", 1483 3294 "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", ··· 1502 3313 "ieee754": "^1.1.13" 1503 3314 } 1504 3315 }, 3316 + "node_modules/buffer-from": { 3317 + "version": "1.1.2", 3318 + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 3319 + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 3320 + "dev": true, 3321 + "license": "MIT" 3322 + }, 1505 3323 "node_modules/bytes": { 1506 3324 "version": "3.1.2", 1507 3325 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", ··· 1540 3358 "url": "https://github.com/sponsors/ljharb" 1541 3359 } 1542 3360 }, 3361 + "node_modules/callsites": { 3362 + "version": "3.1.0", 3363 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 3364 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 3365 + "dev": true, 3366 + "license": "MIT", 3367 + "engines": { 3368 + "node": ">=6" 3369 + } 3370 + }, 3371 + "node_modules/camelcase": { 3372 + "version": "5.3.1", 3373 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 3374 + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 3375 + "dev": true, 3376 + "license": "MIT", 3377 + "engines": { 3378 + "node": ">=6" 3379 + } 3380 + }, 3381 + "node_modules/caniuse-lite": { 3382 + "version": "1.0.30001723", 3383 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", 3384 + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", 3385 + "dev": true, 3386 + "funding": [ 3387 + { 3388 + "type": "opencollective", 3389 + "url": "https://opencollective.com/browserslist" 3390 + }, 3391 + { 3392 + "type": "tidelift", 3393 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 3394 + }, 3395 + { 3396 + "type": "github", 3397 + "url": "https://github.com/sponsors/ai" 3398 + } 3399 + ], 3400 + "license": "CC-BY-4.0" 3401 + }, 1543 3402 "node_modules/cbor-extract": { 1544 3403 "version": "2.2.0", 1545 3404 "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", ··· 1596 3455 "url": "https://github.com/chalk/chalk?sponsor=1" 1597 3456 } 1598 3457 }, 3458 + "node_modules/char-regex": { 3459 + "version": "1.0.2", 3460 + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 3461 + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 3462 + "dev": true, 3463 + "license": "MIT", 3464 + "engines": { 3465 + "node": ">=10" 3466 + } 3467 + }, 1599 3468 "node_modules/chownr": { 1600 3469 "version": "1.1.4", 1601 3470 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1602 3471 "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 1603 3472 "license": "ISC" 1604 3473 }, 3474 + "node_modules/ci-info": { 3475 + "version": "4.2.0", 3476 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", 3477 + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", 3478 + "dev": true, 3479 + "funding": [ 3480 + { 3481 + "type": "github", 3482 + "url": "https://github.com/sponsors/sibiraj-s" 3483 + } 3484 + ], 3485 + "license": "MIT", 3486 + "engines": { 3487 + "node": ">=8" 3488 + } 3489 + }, 3490 + "node_modules/cjs-module-lexer": { 3491 + "version": "2.1.0", 3492 + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", 3493 + "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", 3494 + "dev": true, 3495 + "license": "MIT" 3496 + }, 1605 3497 "node_modules/cliui": { 1606 3498 "version": "8.0.1", 1607 3499 "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", ··· 1617 3509 "node": ">=12" 1618 3510 } 1619 3511 }, 3512 + "node_modules/co": { 3513 + "version": "4.6.0", 3514 + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 3515 + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 3516 + "dev": true, 3517 + "license": "MIT", 3518 + "engines": { 3519 + "iojs": ">= 1.0.0", 3520 + "node": ">= 0.12.0" 3521 + } 3522 + }, 3523 + "node_modules/collect-v8-coverage": { 3524 + "version": "1.0.2", 3525 + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", 3526 + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", 3527 + "dev": true, 3528 + "license": "MIT" 3529 + }, 1620 3530 "node_modules/color-convert": { 1621 3531 "version": "2.0.1", 1622 3532 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ··· 1635 3545 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1636 3546 "license": "MIT" 1637 3547 }, 3548 + "node_modules/combined-stream": { 3549 + "version": "1.0.8", 3550 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 3551 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 3552 + "dev": true, 3553 + "license": "MIT", 3554 + "dependencies": { 3555 + "delayed-stream": "~1.0.0" 3556 + }, 3557 + "engines": { 3558 + "node": ">= 0.8" 3559 + } 3560 + }, 3561 + "node_modules/component-emitter": { 3562 + "version": "1.3.1", 3563 + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", 3564 + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", 3565 + "dev": true, 3566 + "license": "MIT", 3567 + "funding": { 3568 + "url": "https://github.com/sponsors/sindresorhus" 3569 + } 3570 + }, 1638 3571 "node_modules/concat-map": { 1639 3572 "version": "0.0.1", 1640 3573 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", ··· 1704 3637 "node": ">= 0.6" 1705 3638 } 1706 3639 }, 3640 + "node_modules/convert-source-map": { 3641 + "version": "2.0.0", 3642 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 3643 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 3644 + "dev": true, 3645 + "license": "MIT" 3646 + }, 1707 3647 "node_modules/cookie": { 1708 3648 "version": "0.7.2", 1709 3649 "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", ··· 1722 3662 "node": ">=6.6.0" 1723 3663 } 1724 3664 }, 3665 + "node_modules/cookiejar": { 3666 + "version": "2.1.4", 3667 + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", 3668 + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", 3669 + "dev": true, 3670 + "license": "MIT" 3671 + }, 1725 3672 "node_modules/cors": { 1726 3673 "version": "2.8.5", 1727 3674 "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", ··· 1733 3680 }, 1734 3681 "engines": { 1735 3682 "node": ">= 0.10" 3683 + } 3684 + }, 3685 + "node_modules/cross-spawn": { 3686 + "version": "7.0.6", 3687 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 3688 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 3689 + "dev": true, 3690 + "license": "MIT", 3691 + "dependencies": { 3692 + "path-key": "^3.1.0", 3693 + "shebang-command": "^2.0.0", 3694 + "which": "^2.0.1" 3695 + }, 3696 + "engines": { 3697 + "node": ">= 8" 1736 3698 } 1737 3699 }, 1738 3700 "node_modules/debug": { ··· 1767 3729 "url": "https://github.com/sponsors/sindresorhus" 1768 3730 } 1769 3731 }, 3732 + "node_modules/dedent": { 3733 + "version": "1.6.0", 3734 + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", 3735 + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", 3736 + "dev": true, 3737 + "license": "MIT", 3738 + "peerDependencies": { 3739 + "babel-plugin-macros": "^3.1.0" 3740 + }, 3741 + "peerDependenciesMeta": { 3742 + "babel-plugin-macros": { 3743 + "optional": true 3744 + } 3745 + } 3746 + }, 1770 3747 "node_modules/deep-extend": { 1771 3748 "version": "0.6.0", 1772 3749 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", ··· 1776 3753 "node": ">=4.0.0" 1777 3754 } 1778 3755 }, 3756 + "node_modules/deepmerge": { 3757 + "version": "4.3.1", 3758 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 3759 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 3760 + "dev": true, 3761 + "license": "MIT", 3762 + "engines": { 3763 + "node": ">=0.10.0" 3764 + } 3765 + }, 3766 + "node_modules/delayed-stream": { 3767 + "version": "1.0.0", 3768 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 3769 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 3770 + "dev": true, 3771 + "license": "MIT", 3772 + "engines": { 3773 + "node": ">=0.4.0" 3774 + } 3775 + }, 1779 3776 "node_modules/depd": { 1780 3777 "version": "2.0.0", 1781 3778 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", ··· 1804 3801 "node": ">=8" 1805 3802 } 1806 3803 }, 3804 + "node_modules/detect-newline": { 3805 + "version": "3.1.0", 3806 + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", 3807 + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", 3808 + "dev": true, 3809 + "license": "MIT", 3810 + "engines": { 3811 + "node": ">=8" 3812 + } 3813 + }, 3814 + "node_modules/dezalgo": { 3815 + "version": "1.0.4", 3816 + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", 3817 + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", 3818 + "dev": true, 3819 + "license": "ISC", 3820 + "dependencies": { 3821 + "asap": "^2.0.0", 3822 + "wrappy": "1" 3823 + } 3824 + }, 1807 3825 "node_modules/dotenv": { 1808 3826 "version": "16.5.0", 1809 3827 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", ··· 1830 3848 "node": ">= 0.4" 1831 3849 } 1832 3850 }, 3851 + "node_modules/eastasianwidth": { 3852 + "version": "0.2.0", 3853 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 3854 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 3855 + "dev": true, 3856 + "license": "MIT" 3857 + }, 1833 3858 "node_modules/ee-first": { 1834 3859 "version": "1.1.1", 1835 3860 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", ··· 1849 3874 }, 1850 3875 "engines": { 1851 3876 "node": ">=0.10.0" 3877 + } 3878 + }, 3879 + "node_modules/electron-to-chromium": { 3880 + "version": "1.5.171", 3881 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", 3882 + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", 3883 + "dev": true, 3884 + "license": "ISC" 3885 + }, 3886 + "node_modules/emittery": { 3887 + "version": "0.13.1", 3888 + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", 3889 + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", 3890 + "dev": true, 3891 + "license": "MIT", 3892 + "engines": { 3893 + "node": ">=12" 3894 + }, 3895 + "funding": { 3896 + "url": "https://github.com/sindresorhus/emittery?sponsor=1" 1852 3897 } 1853 3898 }, 1854 3899 "node_modules/emoji-regex": { ··· 1876 3921 "once": "^1.4.0" 1877 3922 } 1878 3923 }, 3924 + "node_modules/error-ex": { 3925 + "version": "1.3.2", 3926 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 3927 + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 3928 + "dev": true, 3929 + "license": "MIT", 3930 + "dependencies": { 3931 + "is-arrayish": "^0.2.1" 3932 + } 3933 + }, 1879 3934 "node_modules/es-define-property": { 1880 3935 "version": "1.0.1", 1881 3936 "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ··· 1901 3956 "license": "MIT", 1902 3957 "dependencies": { 1903 3958 "es-errors": "^1.3.0" 3959 + }, 3960 + "engines": { 3961 + "node": ">= 0.4" 3962 + } 3963 + }, 3964 + "node_modules/es-set-tostringtag": { 3965 + "version": "2.1.0", 3966 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 3967 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 3968 + "dev": true, 3969 + "license": "MIT", 3970 + "dependencies": { 3971 + "es-errors": "^1.3.0", 3972 + "get-intrinsic": "^1.2.6", 3973 + "has-tostringtag": "^1.0.2", 3974 + "hasown": "^2.0.2" 1904 3975 }, 1905 3976 "engines": { 1906 3977 "node": ">= 0.4" ··· 1962 4033 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 1963 4034 "license": "MIT" 1964 4035 }, 4036 + "node_modules/escape-string-regexp": { 4037 + "version": "2.0.0", 4038 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 4039 + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 4040 + "dev": true, 4041 + "license": "MIT", 4042 + "engines": { 4043 + "node": ">=8" 4044 + } 4045 + }, 4046 + "node_modules/esprima": { 4047 + "version": "4.0.1", 4048 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 4049 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 4050 + "dev": true, 4051 + "license": "BSD-2-Clause", 4052 + "bin": { 4053 + "esparse": "bin/esparse.js", 4054 + "esvalidate": "bin/esvalidate.js" 4055 + }, 4056 + "engines": { 4057 + "node": ">=4" 4058 + } 4059 + }, 1965 4060 "node_modules/etag": { 1966 4061 "version": "1.8.1", 1967 4062 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", ··· 1995 4090 "node": ">=0.8.x" 1996 4091 } 1997 4092 }, 4093 + "node_modules/execa": { 4094 + "version": "5.1.1", 4095 + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 4096 + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 4097 + "dev": true, 4098 + "license": "MIT", 4099 + "dependencies": { 4100 + "cross-spawn": "^7.0.3", 4101 + "get-stream": "^6.0.0", 4102 + "human-signals": "^2.1.0", 4103 + "is-stream": "^2.0.0", 4104 + "merge-stream": "^2.0.0", 4105 + "npm-run-path": "^4.0.1", 4106 + "onetime": "^5.1.2", 4107 + "signal-exit": "^3.0.3", 4108 + "strip-final-newline": "^2.0.0" 4109 + }, 4110 + "engines": { 4111 + "node": ">=10" 4112 + }, 4113 + "funding": { 4114 + "url": "https://github.com/sindresorhus/execa?sponsor=1" 4115 + } 4116 + }, 4117 + "node_modules/execa/node_modules/signal-exit": { 4118 + "version": "3.0.7", 4119 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 4120 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 4121 + "dev": true, 4122 + "license": "ISC" 4123 + }, 4124 + "node_modules/exit-x": { 4125 + "version": "0.2.2", 4126 + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", 4127 + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", 4128 + "dev": true, 4129 + "license": "MIT", 4130 + "engines": { 4131 + "node": ">= 0.8.0" 4132 + } 4133 + }, 1998 4134 "node_modules/expand-template": { 1999 4135 "version": "2.0.3", 2000 4136 "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", ··· 2002 4138 "license": "(MIT OR WTFPL)", 2003 4139 "engines": { 2004 4140 "node": ">=6" 4141 + } 4142 + }, 4143 + "node_modules/expect": { 4144 + "version": "30.0.2", 4145 + "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.2.tgz", 4146 + "integrity": "sha512-YN9Mgv2mtTWXVmifQq3QT+ixCL/uLuLJw+fdp8MOjKqu8K3XQh3o5aulMM1tn+O2DdrWNxLZTeJsCY/VofUA0A==", 4147 + "dev": true, 4148 + "license": "MIT", 4149 + "dependencies": { 4150 + "@jest/expect-utils": "30.0.2", 4151 + "@jest/get-type": "30.0.1", 4152 + "jest-matcher-utils": "30.0.2", 4153 + "jest-message-util": "30.0.2", 4154 + "jest-mock": "30.0.2", 4155 + "jest-util": "30.0.2" 4156 + }, 4157 + "engines": { 4158 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2005 4159 } 2006 4160 }, 2007 4161 "node_modules/express": { ··· 2091 4245 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2092 4246 "license": "MIT" 2093 4247 }, 4248 + "node_modules/fast-json-stable-stringify": { 4249 + "version": "2.1.0", 4250 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 4251 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 4252 + "dev": true, 4253 + "license": "MIT" 4254 + }, 2094 4255 "node_modules/fast-redact": { 2095 4256 "version": "3.5.0", 2096 4257 "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", ··· 2098 4259 "license": "MIT", 2099 4260 "engines": { 2100 4261 "node": ">=6" 4262 + } 4263 + }, 4264 + "node_modules/fast-safe-stringify": { 4265 + "version": "2.1.1", 4266 + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 4267 + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", 4268 + "dev": true, 4269 + "license": "MIT" 4270 + }, 4271 + "node_modules/fb-watchman": { 4272 + "version": "2.0.2", 4273 + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", 4274 + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", 4275 + "dev": true, 4276 + "license": "Apache-2.0", 4277 + "dependencies": { 4278 + "bser": "2.1.1" 2101 4279 } 2102 4280 }, 2103 4281 "node_modules/file-uri-to-path": { ··· 2136 4314 "node": ">=10" 2137 4315 } 2138 4316 }, 4317 + "node_modules/fill-range": { 4318 + "version": "7.1.1", 4319 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 4320 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 4321 + "dev": true, 4322 + "license": "MIT", 4323 + "dependencies": { 4324 + "to-regex-range": "^5.0.1" 4325 + }, 4326 + "engines": { 4327 + "node": ">=8" 4328 + } 4329 + }, 2139 4330 "node_modules/finalhandler": { 2140 4331 "version": "2.1.0", 2141 4332 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", ··· 2153 4344 "node": ">= 0.8" 2154 4345 } 2155 4346 }, 4347 + "node_modules/find-up": { 4348 + "version": "4.1.0", 4349 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 4350 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 4351 + "dev": true, 4352 + "license": "MIT", 4353 + "dependencies": { 4354 + "locate-path": "^5.0.0", 4355 + "path-exists": "^4.0.0" 4356 + }, 4357 + "engines": { 4358 + "node": ">=8" 4359 + } 4360 + }, 4361 + "node_modules/foreground-child": { 4362 + "version": "3.3.1", 4363 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 4364 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 4365 + "dev": true, 4366 + "license": "ISC", 4367 + "dependencies": { 4368 + "cross-spawn": "^7.0.6", 4369 + "signal-exit": "^4.0.1" 4370 + }, 4371 + "engines": { 4372 + "node": ">=14" 4373 + }, 4374 + "funding": { 4375 + "url": "https://github.com/sponsors/isaacs" 4376 + } 4377 + }, 4378 + "node_modules/form-data": { 4379 + "version": "4.0.3", 4380 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", 4381 + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", 4382 + "dev": true, 4383 + "license": "MIT", 4384 + "dependencies": { 4385 + "asynckit": "^0.4.0", 4386 + "combined-stream": "^1.0.8", 4387 + "es-set-tostringtag": "^2.1.0", 4388 + "hasown": "^2.0.2", 4389 + "mime-types": "^2.1.12" 4390 + }, 4391 + "engines": { 4392 + "node": ">= 6" 4393 + } 4394 + }, 4395 + "node_modules/form-data/node_modules/mime-db": { 4396 + "version": "1.52.0", 4397 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 4398 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 4399 + "dev": true, 4400 + "license": "MIT", 4401 + "engines": { 4402 + "node": ">= 0.6" 4403 + } 4404 + }, 4405 + "node_modules/form-data/node_modules/mime-types": { 4406 + "version": "2.1.35", 4407 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 4408 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 4409 + "dev": true, 4410 + "license": "MIT", 4411 + "dependencies": { 4412 + "mime-db": "1.52.0" 4413 + }, 4414 + "engines": { 4415 + "node": ">= 0.6" 4416 + } 4417 + }, 4418 + "node_modules/formidable": { 4419 + "version": "3.5.4", 4420 + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", 4421 + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", 4422 + "dev": true, 4423 + "license": "MIT", 4424 + "dependencies": { 4425 + "@paralleldrive/cuid2": "^2.2.2", 4426 + "dezalgo": "^1.0.4", 4427 + "once": "^1.4.0" 4428 + }, 4429 + "engines": { 4430 + "node": ">=14.0.0" 4431 + }, 4432 + "funding": { 4433 + "url": "https://ko-fi.com/tunnckoCore/commissions" 4434 + } 4435 + }, 2156 4436 "node_modules/forwarded": { 2157 4437 "version": "0.2.0", 2158 4438 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", ··· 2177 4457 "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 2178 4458 "license": "MIT" 2179 4459 }, 4460 + "node_modules/fs.realpath": { 4461 + "version": "1.0.0", 4462 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 4463 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 4464 + "dev": true, 4465 + "license": "ISC" 4466 + }, 2180 4467 "node_modules/fsevents": { 2181 4468 "version": "2.3.3", 2182 4469 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ··· 2200 4487 "url": "https://github.com/sponsors/ljharb" 2201 4488 } 2202 4489 }, 4490 + "node_modules/gensync": { 4491 + "version": "1.0.0-beta.2", 4492 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 4493 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 4494 + "dev": true, 4495 + "license": "MIT", 4496 + "engines": { 4497 + "node": ">=6.9.0" 4498 + } 4499 + }, 2203 4500 "node_modules/get-caller-file": { 2204 4501 "version": "2.0.5", 2205 4502 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", ··· 2234 4531 "url": "https://github.com/sponsors/ljharb" 2235 4532 } 2236 4533 }, 4534 + "node_modules/get-package-type": { 4535 + "version": "0.1.0", 4536 + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 4537 + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 4538 + "dev": true, 4539 + "license": "MIT", 4540 + "engines": { 4541 + "node": ">=8.0.0" 4542 + } 4543 + }, 2237 4544 "node_modules/get-proto": { 2238 4545 "version": "1.0.1", 2239 4546 "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", ··· 2247 4554 "node": ">= 0.4" 2248 4555 } 2249 4556 }, 4557 + "node_modules/get-stream": { 4558 + "version": "6.0.1", 4559 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 4560 + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 4561 + "dev": true, 4562 + "license": "MIT", 4563 + "engines": { 4564 + "node": ">=10" 4565 + }, 4566 + "funding": { 4567 + "url": "https://github.com/sponsors/sindresorhus" 4568 + } 4569 + }, 2250 4570 "node_modules/get-tsconfig": { 2251 4571 "version": "4.10.1", 2252 4572 "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", ··· 2265 4585 "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 2266 4586 "license": "MIT" 2267 4587 }, 4588 + "node_modules/glob": { 4589 + "version": "10.4.5", 4590 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 4591 + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 4592 + "dev": true, 4593 + "license": "ISC", 4594 + "dependencies": { 4595 + "foreground-child": "^3.1.0", 4596 + "jackspeak": "^3.1.2", 4597 + "minimatch": "^9.0.4", 4598 + "minipass": "^7.1.2", 4599 + "package-json-from-dist": "^1.0.0", 4600 + "path-scurry": "^1.11.1" 4601 + }, 4602 + "bin": { 4603 + "glob": "dist/esm/bin.mjs" 4604 + }, 4605 + "funding": { 4606 + "url": "https://github.com/sponsors/isaacs" 4607 + } 4608 + }, 4609 + "node_modules/glob/node_modules/brace-expansion": { 4610 + "version": "2.0.2", 4611 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 4612 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 4613 + "dev": true, 4614 + "license": "MIT", 4615 + "dependencies": { 4616 + "balanced-match": "^1.0.0" 4617 + } 4618 + }, 4619 + "node_modules/glob/node_modules/minimatch": { 4620 + "version": "9.0.5", 4621 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 4622 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 4623 + "dev": true, 4624 + "license": "ISC", 4625 + "dependencies": { 4626 + "brace-expansion": "^2.0.1" 4627 + }, 4628 + "engines": { 4629 + "node": ">=16 || 14 >=14.17" 4630 + }, 4631 + "funding": { 4632 + "url": "https://github.com/sponsors/isaacs" 4633 + } 4634 + }, 4635 + "node_modules/globals": { 4636 + "version": "11.12.0", 4637 + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 4638 + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 4639 + "dev": true, 4640 + "license": "MIT", 4641 + "engines": { 4642 + "node": ">=4" 4643 + } 4644 + }, 2268 4645 "node_modules/gopd": { 2269 4646 "version": "1.2.0", 2270 4647 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ··· 2276 4653 "funding": { 2277 4654 "url": "https://github.com/sponsors/ljharb" 2278 4655 } 4656 + }, 4657 + "node_modules/graceful-fs": { 4658 + "version": "4.2.11", 4659 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 4660 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 4661 + "dev": true, 4662 + "license": "ISC" 2279 4663 }, 2280 4664 "node_modules/graphemer": { 2281 4665 "version": "1.4.0", ··· 2304 4688 "url": "https://github.com/sponsors/ljharb" 2305 4689 } 2306 4690 }, 4691 + "node_modules/has-tostringtag": { 4692 + "version": "1.0.2", 4693 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 4694 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 4695 + "dev": true, 4696 + "license": "MIT", 4697 + "dependencies": { 4698 + "has-symbols": "^1.0.3" 4699 + }, 4700 + "engines": { 4701 + "node": ">= 0.4" 4702 + }, 4703 + "funding": { 4704 + "url": "https://github.com/sponsors/ljharb" 4705 + } 4706 + }, 2307 4707 "node_modules/hasown": { 2308 4708 "version": "2.0.2", 2309 4709 "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", ··· 2316 4716 "node": ">= 0.4" 2317 4717 } 2318 4718 }, 4719 + "node_modules/html-escaper": { 4720 + "version": "2.0.2", 4721 + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 4722 + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 4723 + "dev": true, 4724 + "license": "MIT" 4725 + }, 2319 4726 "node_modules/http-errors": { 2320 4727 "version": "2.0.0", 2321 4728 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", ··· 2341 4748 "node": ">= 0.8" 2342 4749 } 2343 4750 }, 4751 + "node_modules/human-signals": { 4752 + "version": "2.1.0", 4753 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 4754 + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 4755 + "dev": true, 4756 + "license": "Apache-2.0", 4757 + "engines": { 4758 + "node": ">=10.17.0" 4759 + } 4760 + }, 2344 4761 "node_modules/iconv-lite": { 2345 4762 "version": "0.6.3", 2346 4763 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", ··· 2373 4790 ], 2374 4791 "license": "BSD-3-Clause" 2375 4792 }, 4793 + "node_modules/import-local": { 4794 + "version": "3.2.0", 4795 + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", 4796 + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", 4797 + "dev": true, 4798 + "license": "MIT", 4799 + "dependencies": { 4800 + "pkg-dir": "^4.2.0", 4801 + "resolve-cwd": "^3.0.0" 4802 + }, 4803 + "bin": { 4804 + "import-local-fixture": "fixtures/cli.js" 4805 + }, 4806 + "engines": { 4807 + "node": ">=8" 4808 + }, 4809 + "funding": { 4810 + "url": "https://github.com/sponsors/sindresorhus" 4811 + } 4812 + }, 4813 + "node_modules/imurmurhash": { 4814 + "version": "0.1.4", 4815 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 4816 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 4817 + "dev": true, 4818 + "license": "MIT", 4819 + "engines": { 4820 + "node": ">=0.8.19" 4821 + } 4822 + }, 4823 + "node_modules/inflight": { 4824 + "version": "1.0.6", 4825 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 4826 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 4827 + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 4828 + "dev": true, 4829 + "license": "ISC", 4830 + "dependencies": { 4831 + "once": "^1.3.0", 4832 + "wrappy": "1" 4833 + } 4834 + }, 2376 4835 "node_modules/inherits": { 2377 4836 "version": "2.0.4", 2378 4837 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", ··· 2394 4853 "node": ">= 0.10" 2395 4854 } 2396 4855 }, 4856 + "node_modules/is-arrayish": { 4857 + "version": "0.2.1", 4858 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 4859 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 4860 + "dev": true, 4861 + "license": "MIT" 4862 + }, 2397 4863 "node_modules/is-fullwidth-code-point": { 2398 4864 "version": "3.0.0", 2399 4865 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", ··· 2404 4870 "node": ">=8" 2405 4871 } 2406 4872 }, 4873 + "node_modules/is-generator-fn": { 4874 + "version": "2.1.0", 4875 + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", 4876 + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", 4877 + "dev": true, 4878 + "license": "MIT", 4879 + "engines": { 4880 + "node": ">=6" 4881 + } 4882 + }, 4883 + "node_modules/is-number": { 4884 + "version": "7.0.0", 4885 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 4886 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 4887 + "dev": true, 4888 + "license": "MIT", 4889 + "engines": { 4890 + "node": ">=0.12.0" 4891 + } 4892 + }, 2407 4893 "node_modules/is-promise": { 2408 4894 "version": "4.0.0", 2409 4895 "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 2410 4896 "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 2411 4897 "license": "MIT" 2412 4898 }, 4899 + "node_modules/is-stream": { 4900 + "version": "2.0.1", 4901 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 4902 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 4903 + "dev": true, 4904 + "license": "MIT", 4905 + "engines": { 4906 + "node": ">=8" 4907 + }, 4908 + "funding": { 4909 + "url": "https://github.com/sponsors/sindresorhus" 4910 + } 4911 + }, 4912 + "node_modules/isexe": { 4913 + "version": "2.0.0", 4914 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 4915 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 4916 + "dev": true, 4917 + "license": "ISC" 4918 + }, 2413 4919 "node_modules/iso-datestring-validator": { 2414 4920 "version": "2.2.2", 2415 4921 "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 2416 4922 "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 2417 4923 "license": "MIT" 2418 4924 }, 4925 + "node_modules/istanbul-lib-coverage": { 4926 + "version": "3.2.2", 4927 + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 4928 + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 4929 + "dev": true, 4930 + "license": "BSD-3-Clause", 4931 + "engines": { 4932 + "node": ">=8" 4933 + } 4934 + }, 4935 + "node_modules/istanbul-lib-instrument": { 4936 + "version": "6.0.3", 4937 + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", 4938 + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", 4939 + "dev": true, 4940 + "license": "BSD-3-Clause", 4941 + "dependencies": { 4942 + "@babel/core": "^7.23.9", 4943 + "@babel/parser": "^7.23.9", 4944 + "@istanbuljs/schema": "^0.1.3", 4945 + "istanbul-lib-coverage": "^3.2.0", 4946 + "semver": "^7.5.4" 4947 + }, 4948 + "engines": { 4949 + "node": ">=10" 4950 + } 4951 + }, 4952 + "node_modules/istanbul-lib-report": { 4953 + "version": "3.0.1", 4954 + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 4955 + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 4956 + "dev": true, 4957 + "license": "BSD-3-Clause", 4958 + "dependencies": { 4959 + "istanbul-lib-coverage": "^3.0.0", 4960 + "make-dir": "^4.0.0", 4961 + "supports-color": "^7.1.0" 4962 + }, 4963 + "engines": { 4964 + "node": ">=10" 4965 + } 4966 + }, 4967 + "node_modules/istanbul-lib-source-maps": { 4968 + "version": "5.0.6", 4969 + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", 4970 + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", 4971 + "dev": true, 4972 + "license": "BSD-3-Clause", 4973 + "dependencies": { 4974 + "@jridgewell/trace-mapping": "^0.3.23", 4975 + "debug": "^4.1.1", 4976 + "istanbul-lib-coverage": "^3.0.0" 4977 + }, 4978 + "engines": { 4979 + "node": ">=10" 4980 + } 4981 + }, 4982 + "node_modules/istanbul-reports": { 4983 + "version": "3.1.7", 4984 + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 4985 + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 4986 + "dev": true, 4987 + "license": "BSD-3-Clause", 4988 + "dependencies": { 4989 + "html-escaper": "^2.0.0", 4990 + "istanbul-lib-report": "^3.0.0" 4991 + }, 4992 + "engines": { 4993 + "node": ">=8" 4994 + } 4995 + }, 4996 + "node_modules/jackspeak": { 4997 + "version": "3.4.3", 4998 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 4999 + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 5000 + "dev": true, 5001 + "license": "BlueOak-1.0.0", 5002 + "dependencies": { 5003 + "@isaacs/cliui": "^8.0.2" 5004 + }, 5005 + "funding": { 5006 + "url": "https://github.com/sponsors/isaacs" 5007 + }, 5008 + "optionalDependencies": { 5009 + "@pkgjs/parseargs": "^0.11.0" 5010 + } 5011 + }, 2419 5012 "node_modules/jake": { 2420 5013 "version": "10.9.2", 2421 5014 "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", ··· 2434 5027 "node": ">=10" 2435 5028 } 2436 5029 }, 5030 + "node_modules/jest": { 5031 + "version": "30.0.2", 5032 + "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.2.tgz", 5033 + "integrity": "sha512-HlSEiHRcmTuGwNyeawLTEzpQUMFn+f741FfoNg7RXG2h0WLJKozVCpcQLT0GW17H6kNCqRwGf+Ii/I1YVNvEGQ==", 5034 + "dev": true, 5035 + "license": "MIT", 5036 + "dependencies": { 5037 + "@jest/core": "30.0.2", 5038 + "@jest/types": "30.0.1", 5039 + "import-local": "^3.2.0", 5040 + "jest-cli": "30.0.2" 5041 + }, 5042 + "bin": { 5043 + "jest": "bin/jest.js" 5044 + }, 5045 + "engines": { 5046 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5047 + }, 5048 + "peerDependencies": { 5049 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 5050 + }, 5051 + "peerDependenciesMeta": { 5052 + "node-notifier": { 5053 + "optional": true 5054 + } 5055 + } 5056 + }, 5057 + "node_modules/jest-changed-files": { 5058 + "version": "30.0.2", 5059 + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.2.tgz", 5060 + "integrity": "sha512-Ius/iRST9FKfJI+I+kpiDh8JuUlAISnRszF9ixZDIqJF17FckH5sOzKC8a0wd0+D+8em5ADRHA5V5MnfeDk2WA==", 5061 + "dev": true, 5062 + "license": "MIT", 5063 + "dependencies": { 5064 + "execa": "^5.1.1", 5065 + "jest-util": "30.0.2", 5066 + "p-limit": "^3.1.0" 5067 + }, 5068 + "engines": { 5069 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5070 + } 5071 + }, 5072 + "node_modules/jest-circus": { 5073 + "version": "30.0.2", 5074 + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.2.tgz", 5075 + "integrity": "sha512-NRozwx4DaFHcCUtwdEd/0jBLL1imyMrCbla3vF//wdsB2g6jIicMbjx9VhqE/BYU4dwsOQld+06ODX0oZ9xOLg==", 5076 + "dev": true, 5077 + "license": "MIT", 5078 + "dependencies": { 5079 + "@jest/environment": "30.0.2", 5080 + "@jest/expect": "30.0.2", 5081 + "@jest/test-result": "30.0.2", 5082 + "@jest/types": "30.0.1", 5083 + "@types/node": "*", 5084 + "chalk": "^4.1.2", 5085 + "co": "^4.6.0", 5086 + "dedent": "^1.6.0", 5087 + "is-generator-fn": "^2.1.0", 5088 + "jest-each": "30.0.2", 5089 + "jest-matcher-utils": "30.0.2", 5090 + "jest-message-util": "30.0.2", 5091 + "jest-runtime": "30.0.2", 5092 + "jest-snapshot": "30.0.2", 5093 + "jest-util": "30.0.2", 5094 + "p-limit": "^3.1.0", 5095 + "pretty-format": "30.0.2", 5096 + "pure-rand": "^7.0.0", 5097 + "slash": "^3.0.0", 5098 + "stack-utils": "^2.0.6" 5099 + }, 5100 + "engines": { 5101 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5102 + } 5103 + }, 5104 + "node_modules/jest-cli": { 5105 + "version": "30.0.2", 5106 + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.2.tgz", 5107 + "integrity": "sha512-yQ6Qz747oUbMYLNAqOlEby+hwXx7WEJtCl0iolBRpJhr2uvkBgiVMrvuKirBc8utwQBnkETFlDUkYifbRpmBrQ==", 5108 + "dev": true, 5109 + "license": "MIT", 5110 + "dependencies": { 5111 + "@jest/core": "30.0.2", 5112 + "@jest/test-result": "30.0.2", 5113 + "@jest/types": "30.0.1", 5114 + "chalk": "^4.1.2", 5115 + "exit-x": "^0.2.2", 5116 + "import-local": "^3.2.0", 5117 + "jest-config": "30.0.2", 5118 + "jest-util": "30.0.2", 5119 + "jest-validate": "30.0.2", 5120 + "yargs": "^17.7.2" 5121 + }, 5122 + "bin": { 5123 + "jest": "bin/jest.js" 5124 + }, 5125 + "engines": { 5126 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5127 + }, 5128 + "peerDependencies": { 5129 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 5130 + }, 5131 + "peerDependenciesMeta": { 5132 + "node-notifier": { 5133 + "optional": true 5134 + } 5135 + } 5136 + }, 5137 + "node_modules/jest-config": { 5138 + "version": "30.0.2", 5139 + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.2.tgz", 5140 + "integrity": "sha512-vo0fVq+uzDcXETFVnCUyr5HaUCM8ES6DEuS9AFpma34BVXMRRNlsqDyiW5RDHaEFoeFlJHoI4Xjh/WSYIAL58g==", 5141 + "dev": true, 5142 + "license": "MIT", 5143 + "dependencies": { 5144 + "@babel/core": "^7.27.4", 5145 + "@jest/get-type": "30.0.1", 5146 + "@jest/pattern": "30.0.1", 5147 + "@jest/test-sequencer": "30.0.2", 5148 + "@jest/types": "30.0.1", 5149 + "babel-jest": "30.0.2", 5150 + "chalk": "^4.1.2", 5151 + "ci-info": "^4.2.0", 5152 + "deepmerge": "^4.3.1", 5153 + "glob": "^10.3.10", 5154 + "graceful-fs": "^4.2.11", 5155 + "jest-circus": "30.0.2", 5156 + "jest-docblock": "30.0.1", 5157 + "jest-environment-node": "30.0.2", 5158 + "jest-regex-util": "30.0.1", 5159 + "jest-resolve": "30.0.2", 5160 + "jest-runner": "30.0.2", 5161 + "jest-util": "30.0.2", 5162 + "jest-validate": "30.0.2", 5163 + "micromatch": "^4.0.8", 5164 + "parse-json": "^5.2.0", 5165 + "pretty-format": "30.0.2", 5166 + "slash": "^3.0.0", 5167 + "strip-json-comments": "^3.1.1" 5168 + }, 5169 + "engines": { 5170 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5171 + }, 5172 + "peerDependencies": { 5173 + "@types/node": "*", 5174 + "esbuild-register": ">=3.4.0", 5175 + "ts-node": ">=9.0.0" 5176 + }, 5177 + "peerDependenciesMeta": { 5178 + "@types/node": { 5179 + "optional": true 5180 + }, 5181 + "esbuild-register": { 5182 + "optional": true 5183 + }, 5184 + "ts-node": { 5185 + "optional": true 5186 + } 5187 + } 5188 + }, 5189 + "node_modules/jest-config/node_modules/strip-json-comments": { 5190 + "version": "3.1.1", 5191 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 5192 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 5193 + "dev": true, 5194 + "license": "MIT", 5195 + "engines": { 5196 + "node": ">=8" 5197 + }, 5198 + "funding": { 5199 + "url": "https://github.com/sponsors/sindresorhus" 5200 + } 5201 + }, 5202 + "node_modules/jest-diff": { 5203 + "version": "30.0.2", 5204 + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.2.tgz", 5205 + "integrity": "sha512-2UjrNvDJDn/oHFpPrUTVmvYYDNeNtw2DlY3er8bI6vJJb9Fb35ycp/jFLd5RdV59tJ8ekVXX3o/nwPcscgXZJQ==", 5206 + "dev": true, 5207 + "license": "MIT", 5208 + "dependencies": { 5209 + "@jest/diff-sequences": "30.0.1", 5210 + "@jest/get-type": "30.0.1", 5211 + "chalk": "^4.1.2", 5212 + "pretty-format": "30.0.2" 5213 + }, 5214 + "engines": { 5215 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5216 + } 5217 + }, 5218 + "node_modules/jest-docblock": { 5219 + "version": "30.0.1", 5220 + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", 5221 + "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", 5222 + "dev": true, 5223 + "license": "MIT", 5224 + "dependencies": { 5225 + "detect-newline": "^3.1.0" 5226 + }, 5227 + "engines": { 5228 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5229 + } 5230 + }, 5231 + "node_modules/jest-each": { 5232 + "version": "30.0.2", 5233 + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.2.tgz", 5234 + "integrity": "sha512-ZFRsTpe5FUWFQ9cWTMguCaiA6kkW5whccPy9JjD1ezxh+mJeqmz8naL8Fl/oSbNJv3rgB0x87WBIkA5CObIUZQ==", 5235 + "dev": true, 5236 + "license": "MIT", 5237 + "dependencies": { 5238 + "@jest/get-type": "30.0.1", 5239 + "@jest/types": "30.0.1", 5240 + "chalk": "^4.1.2", 5241 + "jest-util": "30.0.2", 5242 + "pretty-format": "30.0.2" 5243 + }, 5244 + "engines": { 5245 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5246 + } 5247 + }, 5248 + "node_modules/jest-environment-node": { 5249 + "version": "30.0.2", 5250 + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.2.tgz", 5251 + "integrity": "sha512-XsGtZ0H+a70RsxAQkKuIh0D3ZlASXdZdhpOSBq9WRPq6lhe0IoQHGW0w9ZUaPiZQ/CpkIdprvlfV1QcXcvIQLQ==", 5252 + "dev": true, 5253 + "license": "MIT", 5254 + "dependencies": { 5255 + "@jest/environment": "30.0.2", 5256 + "@jest/fake-timers": "30.0.2", 5257 + "@jest/types": "30.0.1", 5258 + "@types/node": "*", 5259 + "jest-mock": "30.0.2", 5260 + "jest-util": "30.0.2", 5261 + "jest-validate": "30.0.2" 5262 + }, 5263 + "engines": { 5264 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5265 + } 5266 + }, 5267 + "node_modules/jest-haste-map": { 5268 + "version": "30.0.2", 5269 + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.2.tgz", 5270 + "integrity": "sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ==", 5271 + "dev": true, 5272 + "license": "MIT", 5273 + "dependencies": { 5274 + "@jest/types": "30.0.1", 5275 + "@types/node": "*", 5276 + "anymatch": "^3.1.3", 5277 + "fb-watchman": "^2.0.2", 5278 + "graceful-fs": "^4.2.11", 5279 + "jest-regex-util": "30.0.1", 5280 + "jest-util": "30.0.2", 5281 + "jest-worker": "30.0.2", 5282 + "micromatch": "^4.0.8", 5283 + "walker": "^1.0.8" 5284 + }, 5285 + "engines": { 5286 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5287 + }, 5288 + "optionalDependencies": { 5289 + "fsevents": "^2.3.3" 5290 + } 5291 + }, 5292 + "node_modules/jest-leak-detector": { 5293 + "version": "30.0.2", 5294 + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.2.tgz", 5295 + "integrity": "sha512-U66sRrAYdALq+2qtKffBLDWsQ/XoNNs2Lcr83sc9lvE/hEpNafJlq2lXCPUBMNqamMECNxSIekLfe69qg4KMIQ==", 5296 + "dev": true, 5297 + "license": "MIT", 5298 + "dependencies": { 5299 + "@jest/get-type": "30.0.1", 5300 + "pretty-format": "30.0.2" 5301 + }, 5302 + "engines": { 5303 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5304 + } 5305 + }, 5306 + "node_modules/jest-matcher-utils": { 5307 + "version": "30.0.2", 5308 + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.2.tgz", 5309 + "integrity": "sha512-1FKwgJYECR8IT93KMKmjKHSLyru0DqguThov/aWpFccC0wbiXGOxYEu7SScderBD7ruDOpl7lc5NG6w3oxKfaA==", 5310 + "dev": true, 5311 + "license": "MIT", 5312 + "dependencies": { 5313 + "@jest/get-type": "30.0.1", 5314 + "chalk": "^4.1.2", 5315 + "jest-diff": "30.0.2", 5316 + "pretty-format": "30.0.2" 5317 + }, 5318 + "engines": { 5319 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5320 + } 5321 + }, 5322 + "node_modules/jest-message-util": { 5323 + "version": "30.0.2", 5324 + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.2.tgz", 5325 + "integrity": "sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==", 5326 + "dev": true, 5327 + "license": "MIT", 5328 + "dependencies": { 5329 + "@babel/code-frame": "^7.27.1", 5330 + "@jest/types": "30.0.1", 5331 + "@types/stack-utils": "^2.0.3", 5332 + "chalk": "^4.1.2", 5333 + "graceful-fs": "^4.2.11", 5334 + "micromatch": "^4.0.8", 5335 + "pretty-format": "30.0.2", 5336 + "slash": "^3.0.0", 5337 + "stack-utils": "^2.0.6" 5338 + }, 5339 + "engines": { 5340 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5341 + } 5342 + }, 5343 + "node_modules/jest-mock": { 5344 + "version": "30.0.2", 5345 + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.2.tgz", 5346 + "integrity": "sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==", 5347 + "dev": true, 5348 + "license": "MIT", 5349 + "dependencies": { 5350 + "@jest/types": "30.0.1", 5351 + "@types/node": "*", 5352 + "jest-util": "30.0.2" 5353 + }, 5354 + "engines": { 5355 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5356 + } 5357 + }, 5358 + "node_modules/jest-pnp-resolver": { 5359 + "version": "1.2.3", 5360 + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", 5361 + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", 5362 + "dev": true, 5363 + "license": "MIT", 5364 + "engines": { 5365 + "node": ">=6" 5366 + }, 5367 + "peerDependencies": { 5368 + "jest-resolve": "*" 5369 + }, 5370 + "peerDependenciesMeta": { 5371 + "jest-resolve": { 5372 + "optional": true 5373 + } 5374 + } 5375 + }, 5376 + "node_modules/jest-regex-util": { 5377 + "version": "30.0.1", 5378 + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", 5379 + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", 5380 + "dev": true, 5381 + "license": "MIT", 5382 + "engines": { 5383 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5384 + } 5385 + }, 5386 + "node_modules/jest-resolve": { 5387 + "version": "30.0.2", 5388 + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.2.tgz", 5389 + "integrity": "sha512-q/XT0XQvRemykZsvRopbG6FQUT6/ra+XV6rPijyjT6D0msOyCvR2A5PlWZLd+fH0U8XWKZfDiAgrUNDNX2BkCw==", 5390 + "dev": true, 5391 + "license": "MIT", 5392 + "dependencies": { 5393 + "chalk": "^4.1.2", 5394 + "graceful-fs": "^4.2.11", 5395 + "jest-haste-map": "30.0.2", 5396 + "jest-pnp-resolver": "^1.2.3", 5397 + "jest-util": "30.0.2", 5398 + "jest-validate": "30.0.2", 5399 + "slash": "^3.0.0", 5400 + "unrs-resolver": "^1.7.11" 5401 + }, 5402 + "engines": { 5403 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5404 + } 5405 + }, 5406 + "node_modules/jest-resolve-dependencies": { 5407 + "version": "30.0.2", 5408 + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.2.tgz", 5409 + "integrity": "sha512-Lp1iIXpsF5fGM4vyP8xHiIy2H5L5yO67/nXoYJzH4kz+fQmO+ZMKxzYLyWxYy4EeCLeNQ6a9OozL+uHZV2iuEA==", 5410 + "dev": true, 5411 + "license": "MIT", 5412 + "dependencies": { 5413 + "jest-regex-util": "30.0.1", 5414 + "jest-snapshot": "30.0.2" 5415 + }, 5416 + "engines": { 5417 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5418 + } 5419 + }, 5420 + "node_modules/jest-runner": { 5421 + "version": "30.0.2", 5422 + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.2.tgz", 5423 + "integrity": "sha512-6H+CIFiDLVt1Ix6jLzASXz3IoIiDukpEIxL9FHtDQ2BD/k5eFtDF5e5N9uItzRE3V1kp7VoSRyrGBytXKra4xA==", 5424 + "dev": true, 5425 + "license": "MIT", 5426 + "dependencies": { 5427 + "@jest/console": "30.0.2", 5428 + "@jest/environment": "30.0.2", 5429 + "@jest/test-result": "30.0.2", 5430 + "@jest/transform": "30.0.2", 5431 + "@jest/types": "30.0.1", 5432 + "@types/node": "*", 5433 + "chalk": "^4.1.2", 5434 + "emittery": "^0.13.1", 5435 + "exit-x": "^0.2.2", 5436 + "graceful-fs": "^4.2.11", 5437 + "jest-docblock": "30.0.1", 5438 + "jest-environment-node": "30.0.2", 5439 + "jest-haste-map": "30.0.2", 5440 + "jest-leak-detector": "30.0.2", 5441 + "jest-message-util": "30.0.2", 5442 + "jest-resolve": "30.0.2", 5443 + "jest-runtime": "30.0.2", 5444 + "jest-util": "30.0.2", 5445 + "jest-watcher": "30.0.2", 5446 + "jest-worker": "30.0.2", 5447 + "p-limit": "^3.1.0", 5448 + "source-map-support": "0.5.13" 5449 + }, 5450 + "engines": { 5451 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5452 + } 5453 + }, 5454 + "node_modules/jest-runtime": { 5455 + "version": "30.0.2", 5456 + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.2.tgz", 5457 + "integrity": "sha512-H1a51/soNOeAjoggu6PZKTH7DFt8JEGN4mesTSwyqD2jU9PXD04Bp6DKbt2YVtQvh2JcvH2vjbkEerCZ3lRn7A==", 5458 + "dev": true, 5459 + "license": "MIT", 5460 + "dependencies": { 5461 + "@jest/environment": "30.0.2", 5462 + "@jest/fake-timers": "30.0.2", 5463 + "@jest/globals": "30.0.2", 5464 + "@jest/source-map": "30.0.1", 5465 + "@jest/test-result": "30.0.2", 5466 + "@jest/transform": "30.0.2", 5467 + "@jest/types": "30.0.1", 5468 + "@types/node": "*", 5469 + "chalk": "^4.1.2", 5470 + "cjs-module-lexer": "^2.1.0", 5471 + "collect-v8-coverage": "^1.0.2", 5472 + "glob": "^10.3.10", 5473 + "graceful-fs": "^4.2.11", 5474 + "jest-haste-map": "30.0.2", 5475 + "jest-message-util": "30.0.2", 5476 + "jest-mock": "30.0.2", 5477 + "jest-regex-util": "30.0.1", 5478 + "jest-resolve": "30.0.2", 5479 + "jest-snapshot": "30.0.2", 5480 + "jest-util": "30.0.2", 5481 + "slash": "^3.0.0", 5482 + "strip-bom": "^4.0.0" 5483 + }, 5484 + "engines": { 5485 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5486 + } 5487 + }, 5488 + "node_modules/jest-snapshot": { 5489 + "version": "30.0.2", 5490 + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.2.tgz", 5491 + "integrity": "sha512-KeoHikoKGln3OlN7NS7raJ244nIVr2K46fBTNdfuxqYv2/g4TVyWDSO4fmk08YBJQMjs3HNfG1rlLfL/KA+nUw==", 5492 + "dev": true, 5493 + "license": "MIT", 5494 + "dependencies": { 5495 + "@babel/core": "^7.27.4", 5496 + "@babel/generator": "^7.27.5", 5497 + "@babel/plugin-syntax-jsx": "^7.27.1", 5498 + "@babel/plugin-syntax-typescript": "^7.27.1", 5499 + "@babel/types": "^7.27.3", 5500 + "@jest/expect-utils": "30.0.2", 5501 + "@jest/get-type": "30.0.1", 5502 + "@jest/snapshot-utils": "30.0.1", 5503 + "@jest/transform": "30.0.2", 5504 + "@jest/types": "30.0.1", 5505 + "babel-preset-current-node-syntax": "^1.1.0", 5506 + "chalk": "^4.1.2", 5507 + "expect": "30.0.2", 5508 + "graceful-fs": "^4.2.11", 5509 + "jest-diff": "30.0.2", 5510 + "jest-matcher-utils": "30.0.2", 5511 + "jest-message-util": "30.0.2", 5512 + "jest-util": "30.0.2", 5513 + "pretty-format": "30.0.2", 5514 + "semver": "^7.7.2", 5515 + "synckit": "^0.11.8" 5516 + }, 5517 + "engines": { 5518 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5519 + } 5520 + }, 5521 + "node_modules/jest-util": { 5522 + "version": "30.0.2", 5523 + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.2.tgz", 5524 + "integrity": "sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==", 5525 + "dev": true, 5526 + "license": "MIT", 5527 + "dependencies": { 5528 + "@jest/types": "30.0.1", 5529 + "@types/node": "*", 5530 + "chalk": "^4.1.2", 5531 + "ci-info": "^4.2.0", 5532 + "graceful-fs": "^4.2.11", 5533 + "picomatch": "^4.0.2" 5534 + }, 5535 + "engines": { 5536 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5537 + } 5538 + }, 5539 + "node_modules/jest-util/node_modules/picomatch": { 5540 + "version": "4.0.2", 5541 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 5542 + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 5543 + "dev": true, 5544 + "license": "MIT", 5545 + "engines": { 5546 + "node": ">=12" 5547 + }, 5548 + "funding": { 5549 + "url": "https://github.com/sponsors/jonschlinkert" 5550 + } 5551 + }, 5552 + "node_modules/jest-validate": { 5553 + "version": "30.0.2", 5554 + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.2.tgz", 5555 + "integrity": "sha512-noOvul+SFER4RIvNAwGn6nmV2fXqBq67j+hKGHKGFCmK4ks/Iy1FSrqQNBLGKlu4ZZIRL6Kg1U72N1nxuRCrGQ==", 5556 + "dev": true, 5557 + "license": "MIT", 5558 + "dependencies": { 5559 + "@jest/get-type": "30.0.1", 5560 + "@jest/types": "30.0.1", 5561 + "camelcase": "^6.3.0", 5562 + "chalk": "^4.1.2", 5563 + "leven": "^3.1.0", 5564 + "pretty-format": "30.0.2" 5565 + }, 5566 + "engines": { 5567 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5568 + } 5569 + }, 5570 + "node_modules/jest-validate/node_modules/camelcase": { 5571 + "version": "6.3.0", 5572 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 5573 + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 5574 + "dev": true, 5575 + "license": "MIT", 5576 + "engines": { 5577 + "node": ">=10" 5578 + }, 5579 + "funding": { 5580 + "url": "https://github.com/sponsors/sindresorhus" 5581 + } 5582 + }, 5583 + "node_modules/jest-watcher": { 5584 + "version": "30.0.2", 5585 + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.2.tgz", 5586 + "integrity": "sha512-vYO5+E7jJuF+XmONr6CrbXdlYrgvZqtkn6pdkgjt/dU64UAdc0v1cAVaAeWtAfUUMScxNmnUjKPUMdCpNVASwg==", 5587 + "dev": true, 5588 + "license": "MIT", 5589 + "dependencies": { 5590 + "@jest/test-result": "30.0.2", 5591 + "@jest/types": "30.0.1", 5592 + "@types/node": "*", 5593 + "ansi-escapes": "^4.3.2", 5594 + "chalk": "^4.1.2", 5595 + "emittery": "^0.13.1", 5596 + "jest-util": "30.0.2", 5597 + "string-length": "^4.0.2" 5598 + }, 5599 + "engines": { 5600 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5601 + } 5602 + }, 5603 + "node_modules/jest-worker": { 5604 + "version": "30.0.2", 5605 + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.2.tgz", 5606 + "integrity": "sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg==", 5607 + "dev": true, 5608 + "license": "MIT", 5609 + "dependencies": { 5610 + "@types/node": "*", 5611 + "@ungap/structured-clone": "^1.3.0", 5612 + "jest-util": "30.0.2", 5613 + "merge-stream": "^2.0.0", 5614 + "supports-color": "^8.1.1" 5615 + }, 5616 + "engines": { 5617 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 5618 + } 5619 + }, 5620 + "node_modules/jest-worker/node_modules/supports-color": { 5621 + "version": "8.1.1", 5622 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 5623 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 5624 + "dev": true, 5625 + "license": "MIT", 5626 + "dependencies": { 5627 + "has-flag": "^4.0.0" 5628 + }, 5629 + "engines": { 5630 + "node": ">=10" 5631 + }, 5632 + "funding": { 5633 + "url": "https://github.com/chalk/supports-color?sponsor=1" 5634 + } 5635 + }, 5636 + "node_modules/js-tokens": { 5637 + "version": "4.0.0", 5638 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 5639 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 5640 + "dev": true, 5641 + "license": "MIT" 5642 + }, 5643 + "node_modules/js-yaml": { 5644 + "version": "3.14.1", 5645 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 5646 + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 5647 + "dev": true, 5648 + "license": "MIT", 5649 + "dependencies": { 5650 + "argparse": "^1.0.7", 5651 + "esprima": "^4.0.0" 5652 + }, 5653 + "bin": { 5654 + "js-yaml": "bin/js-yaml.js" 5655 + } 5656 + }, 5657 + "node_modules/jsesc": { 5658 + "version": "3.1.0", 5659 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 5660 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 5661 + "dev": true, 5662 + "license": "MIT", 5663 + "bin": { 5664 + "jsesc": "bin/jsesc" 5665 + }, 5666 + "engines": { 5667 + "node": ">=6" 5668 + } 5669 + }, 5670 + "node_modules/json-parse-even-better-errors": { 5671 + "version": "2.3.1", 5672 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 5673 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 5674 + "dev": true, 5675 + "license": "MIT" 5676 + }, 5677 + "node_modules/json5": { 5678 + "version": "2.2.3", 5679 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 5680 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 5681 + "dev": true, 5682 + "license": "MIT", 5683 + "bin": { 5684 + "json5": "lib/cli.js" 5685 + }, 5686 + "engines": { 5687 + "node": ">=6" 5688 + } 5689 + }, 5690 + "node_modules/leven": { 5691 + "version": "3.1.0", 5692 + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 5693 + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 5694 + "dev": true, 5695 + "license": "MIT", 5696 + "engines": { 5697 + "node": ">=6" 5698 + } 5699 + }, 5700 + "node_modules/lines-and-columns": { 5701 + "version": "1.2.4", 5702 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 5703 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 5704 + "dev": true, 5705 + "license": "MIT" 5706 + }, 5707 + "node_modules/locate-path": { 5708 + "version": "5.0.0", 5709 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 5710 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 5711 + "dev": true, 5712 + "license": "MIT", 5713 + "dependencies": { 5714 + "p-locate": "^4.1.0" 5715 + }, 5716 + "engines": { 5717 + "node": ">=8" 5718 + } 5719 + }, 2437 5720 "node_modules/lodash": { 2438 5721 "version": "4.17.21", 2439 5722 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", ··· 2441 5724 "dev": true, 2442 5725 "license": "MIT" 2443 5726 }, 5727 + "node_modules/lodash.memoize": { 5728 + "version": "4.1.2", 5729 + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", 5730 + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", 5731 + "dev": true, 5732 + "license": "MIT" 5733 + }, 5734 + "node_modules/lru-cache": { 5735 + "version": "5.1.1", 5736 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 5737 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 5738 + "dev": true, 5739 + "license": "ISC", 5740 + "dependencies": { 5741 + "yallist": "^3.0.2" 5742 + } 5743 + }, 5744 + "node_modules/make-dir": { 5745 + "version": "4.0.0", 5746 + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 5747 + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 5748 + "dev": true, 5749 + "license": "MIT", 5750 + "dependencies": { 5751 + "semver": "^7.5.3" 5752 + }, 5753 + "engines": { 5754 + "node": ">=10" 5755 + }, 5756 + "funding": { 5757 + "url": "https://github.com/sponsors/sindresorhus" 5758 + } 5759 + }, 5760 + "node_modules/make-error": { 5761 + "version": "1.3.6", 5762 + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 5763 + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 5764 + "dev": true, 5765 + "license": "ISC" 5766 + }, 5767 + "node_modules/makeerror": { 5768 + "version": "1.0.12", 5769 + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", 5770 + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", 5771 + "dev": true, 5772 + "license": "BSD-3-Clause", 5773 + "dependencies": { 5774 + "tmpl": "1.0.5" 5775 + } 5776 + }, 2444 5777 "node_modules/math-intrinsics": { 2445 5778 "version": "1.1.0", 2446 5779 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ··· 2471 5804 "url": "https://github.com/sponsors/sindresorhus" 2472 5805 } 2473 5806 }, 5807 + "node_modules/merge-stream": { 5808 + "version": "2.0.0", 5809 + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 5810 + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 5811 + "dev": true, 5812 + "license": "MIT" 5813 + }, 2474 5814 "node_modules/methods": { 2475 5815 "version": "1.1.2", 2476 5816 "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", ··· 2480 5820 "node": ">= 0.6" 2481 5821 } 2482 5822 }, 5823 + "node_modules/micromatch": { 5824 + "version": "4.0.8", 5825 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 5826 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 5827 + "dev": true, 5828 + "license": "MIT", 5829 + "dependencies": { 5830 + "braces": "^3.0.3", 5831 + "picomatch": "^2.3.1" 5832 + }, 5833 + "engines": { 5834 + "node": ">=8.6" 5835 + } 5836 + }, 2483 5837 "node_modules/mime": { 2484 5838 "version": "1.6.0", 2485 5839 "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", ··· 2513 5867 "node": ">= 0.6" 2514 5868 } 2515 5869 }, 5870 + "node_modules/mimic-fn": { 5871 + "version": "2.1.0", 5872 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 5873 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 5874 + "dev": true, 5875 + "license": "MIT", 5876 + "engines": { 5877 + "node": ">=6" 5878 + } 5879 + }, 2516 5880 "node_modules/mimic-response": { 2517 5881 "version": "3.1.0", 2518 5882 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", ··· 2546 5910 "url": "https://github.com/sponsors/ljharb" 2547 5911 } 2548 5912 }, 5913 + "node_modules/minipass": { 5914 + "version": "7.1.2", 5915 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 5916 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 5917 + "dev": true, 5918 + "license": "ISC", 5919 + "engines": { 5920 + "node": ">=16 || 14 >=14.17" 5921 + } 5922 + }, 2549 5923 "node_modules/mkdirp-classic": { 2550 5924 "version": "0.5.3", 2551 5925 "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", ··· 2579 5953 "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", 2580 5954 "license": "MIT" 2581 5955 }, 5956 + "node_modules/napi-postinstall": { 5957 + "version": "0.2.4", 5958 + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", 5959 + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", 5960 + "dev": true, 5961 + "license": "MIT", 5962 + "bin": { 5963 + "napi-postinstall": "lib/cli.js" 5964 + }, 5965 + "engines": { 5966 + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 5967 + }, 5968 + "funding": { 5969 + "url": "https://opencollective.com/napi-postinstall" 5970 + } 5971 + }, 5972 + "node_modules/natural-compare": { 5973 + "version": "1.4.0", 5974 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 5975 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 5976 + "dev": true, 5977 + "license": "MIT" 5978 + }, 2582 5979 "node_modules/negotiator": { 2583 5980 "version": "1.0.0", 2584 5981 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", ··· 2615 6012 "node-gyp-build-optional-packages-test": "build-test.js" 2616 6013 } 2617 6014 }, 6015 + "node_modules/node-int64": { 6016 + "version": "0.4.0", 6017 + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 6018 + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 6019 + "dev": true, 6020 + "license": "MIT" 6021 + }, 6022 + "node_modules/node-releases": { 6023 + "version": "2.0.19", 6024 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 6025 + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 6026 + "dev": true, 6027 + "license": "MIT" 6028 + }, 6029 + "node_modules/normalize-path": { 6030 + "version": "3.0.0", 6031 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 6032 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 6033 + "dev": true, 6034 + "license": "MIT", 6035 + "engines": { 6036 + "node": ">=0.10.0" 6037 + } 6038 + }, 6039 + "node_modules/npm-run-path": { 6040 + "version": "4.0.1", 6041 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 6042 + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 6043 + "dev": true, 6044 + "license": "MIT", 6045 + "dependencies": { 6046 + "path-key": "^3.0.0" 6047 + }, 6048 + "engines": { 6049 + "node": ">=8" 6050 + } 6051 + }, 2618 6052 "node_modules/object-assign": { 2619 6053 "version": "4.1.1", 2620 6054 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", ··· 2675 6109 "wrappy": "1" 2676 6110 } 2677 6111 }, 6112 + "node_modules/onetime": { 6113 + "version": "5.1.2", 6114 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 6115 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 6116 + "dev": true, 6117 + "license": "MIT", 6118 + "dependencies": { 6119 + "mimic-fn": "^2.1.0" 6120 + }, 6121 + "engines": { 6122 + "node": ">=6" 6123 + }, 6124 + "funding": { 6125 + "url": "https://github.com/sponsors/sindresorhus" 6126 + } 6127 + }, 2678 6128 "node_modules/p-finally": { 2679 6129 "version": "1.0.0", 2680 6130 "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", ··· 2684 6134 "node": ">=4" 2685 6135 } 2686 6136 }, 6137 + "node_modules/p-limit": { 6138 + "version": "3.1.0", 6139 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 6140 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 6141 + "dev": true, 6142 + "license": "MIT", 6143 + "dependencies": { 6144 + "yocto-queue": "^0.1.0" 6145 + }, 6146 + "engines": { 6147 + "node": ">=10" 6148 + }, 6149 + "funding": { 6150 + "url": "https://github.com/sponsors/sindresorhus" 6151 + } 6152 + }, 6153 + "node_modules/p-limit/node_modules/yocto-queue": { 6154 + "version": "0.1.0", 6155 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 6156 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 6157 + "dev": true, 6158 + "license": "MIT", 6159 + "engines": { 6160 + "node": ">=10" 6161 + }, 6162 + "funding": { 6163 + "url": "https://github.com/sponsors/sindresorhus" 6164 + } 6165 + }, 6166 + "node_modules/p-locate": { 6167 + "version": "4.1.0", 6168 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 6169 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 6170 + "dev": true, 6171 + "license": "MIT", 6172 + "dependencies": { 6173 + "p-limit": "^2.2.0" 6174 + }, 6175 + "engines": { 6176 + "node": ">=8" 6177 + } 6178 + }, 6179 + "node_modules/p-locate/node_modules/p-limit": { 6180 + "version": "2.3.0", 6181 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 6182 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 6183 + "dev": true, 6184 + "license": "MIT", 6185 + "dependencies": { 6186 + "p-try": "^2.0.0" 6187 + }, 6188 + "engines": { 6189 + "node": ">=6" 6190 + }, 6191 + "funding": { 6192 + "url": "https://github.com/sponsors/sindresorhus" 6193 + } 6194 + }, 2687 6195 "node_modules/p-queue": { 2688 6196 "version": "6.6.2", 2689 6197 "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", ··· 2712 6220 "node": ">=8" 2713 6221 } 2714 6222 }, 6223 + "node_modules/p-try": { 6224 + "version": "2.2.0", 6225 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 6226 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 6227 + "dev": true, 6228 + "license": "MIT", 6229 + "engines": { 6230 + "node": ">=6" 6231 + } 6232 + }, 6233 + "node_modules/package-json-from-dist": { 6234 + "version": "1.0.1", 6235 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 6236 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 6237 + "dev": true, 6238 + "license": "BlueOak-1.0.0" 6239 + }, 6240 + "node_modules/parse-json": { 6241 + "version": "5.2.0", 6242 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 6243 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 6244 + "dev": true, 6245 + "license": "MIT", 6246 + "dependencies": { 6247 + "@babel/code-frame": "^7.0.0", 6248 + "error-ex": "^1.3.1", 6249 + "json-parse-even-better-errors": "^2.3.0", 6250 + "lines-and-columns": "^1.1.6" 6251 + }, 6252 + "engines": { 6253 + "node": ">=8" 6254 + }, 6255 + "funding": { 6256 + "url": "https://github.com/sponsors/sindresorhus" 6257 + } 6258 + }, 2715 6259 "node_modules/parseurl": { 2716 6260 "version": "1.3.3", 2717 6261 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", ··· 2721 6265 "node": ">= 0.8" 2722 6266 } 2723 6267 }, 6268 + "node_modules/path-exists": { 6269 + "version": "4.0.0", 6270 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 6271 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 6272 + "dev": true, 6273 + "license": "MIT", 6274 + "engines": { 6275 + "node": ">=8" 6276 + } 6277 + }, 6278 + "node_modules/path-is-absolute": { 6279 + "version": "1.0.1", 6280 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 6281 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 6282 + "dev": true, 6283 + "license": "MIT", 6284 + "engines": { 6285 + "node": ">=0.10.0" 6286 + } 6287 + }, 6288 + "node_modules/path-key": { 6289 + "version": "3.1.1", 6290 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 6291 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 6292 + "dev": true, 6293 + "license": "MIT", 6294 + "engines": { 6295 + "node": ">=8" 6296 + } 6297 + }, 6298 + "node_modules/path-scurry": { 6299 + "version": "1.11.1", 6300 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 6301 + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 6302 + "dev": true, 6303 + "license": "BlueOak-1.0.0", 6304 + "dependencies": { 6305 + "lru-cache": "^10.2.0", 6306 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 6307 + }, 6308 + "engines": { 6309 + "node": ">=16 || 14 >=14.18" 6310 + }, 6311 + "funding": { 6312 + "url": "https://github.com/sponsors/isaacs" 6313 + } 6314 + }, 6315 + "node_modules/path-scurry/node_modules/lru-cache": { 6316 + "version": "10.4.3", 6317 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 6318 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 6319 + "dev": true, 6320 + "license": "ISC" 6321 + }, 2724 6322 "node_modules/path-to-regexp": { 2725 6323 "version": "8.2.0", 2726 6324 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", ··· 2728 6326 "license": "MIT", 2729 6327 "engines": { 2730 6328 "node": ">=16" 6329 + } 6330 + }, 6331 + "node_modules/picocolors": { 6332 + "version": "1.1.1", 6333 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 6334 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 6335 + "dev": true, 6336 + "license": "ISC" 6337 + }, 6338 + "node_modules/picomatch": { 6339 + "version": "2.3.1", 6340 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 6341 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 6342 + "dev": true, 6343 + "license": "MIT", 6344 + "engines": { 6345 + "node": ">=8.6" 6346 + }, 6347 + "funding": { 6348 + "url": "https://github.com/sponsors/jonschlinkert" 2731 6349 } 2732 6350 }, 2733 6351 "node_modules/pino": { ··· 2808 6426 "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", 2809 6427 "license": "MIT" 2810 6428 }, 6429 + "node_modules/pirates": { 6430 + "version": "4.0.7", 6431 + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", 6432 + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", 6433 + "dev": true, 6434 + "license": "MIT", 6435 + "engines": { 6436 + "node": ">= 6" 6437 + } 6438 + }, 6439 + "node_modules/pkg-dir": { 6440 + "version": "4.2.0", 6441 + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 6442 + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 6443 + "dev": true, 6444 + "license": "MIT", 6445 + "dependencies": { 6446 + "find-up": "^4.0.0" 6447 + }, 6448 + "engines": { 6449 + "node": ">=8" 6450 + } 6451 + }, 2811 6452 "node_modules/prebuild-install": { 2812 6453 "version": "7.1.3", 2813 6454 "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", ··· 2834 6475 "node": ">=10" 2835 6476 } 2836 6477 }, 6478 + "node_modules/pretty-format": { 6479 + "version": "30.0.2", 6480 + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", 6481 + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", 6482 + "dev": true, 6483 + "license": "MIT", 6484 + "dependencies": { 6485 + "@jest/schemas": "30.0.1", 6486 + "ansi-styles": "^5.2.0", 6487 + "react-is": "^18.3.1" 6488 + }, 6489 + "engines": { 6490 + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 6491 + } 6492 + }, 6493 + "node_modules/pretty-format/node_modules/ansi-styles": { 6494 + "version": "5.2.0", 6495 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 6496 + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 6497 + "dev": true, 6498 + "license": "MIT", 6499 + "engines": { 6500 + "node": ">=10" 6501 + }, 6502 + "funding": { 6503 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 6504 + } 6505 + }, 2837 6506 "node_modules/process": { 2838 6507 "version": "0.11.10", 2839 6508 "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", ··· 2872 6541 "once": "^1.3.1" 2873 6542 } 2874 6543 }, 6544 + "node_modules/pure-rand": { 6545 + "version": "7.0.1", 6546 + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", 6547 + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", 6548 + "dev": true, 6549 + "funding": [ 6550 + { 6551 + "type": "individual", 6552 + "url": "https://github.com/sponsors/dubzzz" 6553 + }, 6554 + { 6555 + "type": "opencollective", 6556 + "url": "https://opencollective.com/fast-check" 6557 + } 6558 + ], 6559 + "license": "MIT" 6560 + }, 2875 6561 "node_modules/qs": { 2876 6562 "version": "6.14.0", 2877 6563 "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", ··· 2947 6633 "rc": "cli.js" 2948 6634 } 2949 6635 }, 6636 + "node_modules/react-is": { 6637 + "version": "18.3.1", 6638 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", 6639 + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", 6640 + "dev": true, 6641 + "license": "MIT" 6642 + }, 2950 6643 "node_modules/readable-stream": { 2951 6644 "version": "3.6.2", 2952 6645 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", ··· 2980 6673 "node": ">=0.10.0" 2981 6674 } 2982 6675 }, 6676 + "node_modules/resolve-cwd": { 6677 + "version": "3.0.0", 6678 + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 6679 + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 6680 + "dev": true, 6681 + "license": "MIT", 6682 + "dependencies": { 6683 + "resolve-from": "^5.0.0" 6684 + }, 6685 + "engines": { 6686 + "node": ">=8" 6687 + } 6688 + }, 6689 + "node_modules/resolve-from": { 6690 + "version": "5.0.0", 6691 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 6692 + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 6693 + "dev": true, 6694 + "license": "MIT", 6695 + "engines": { 6696 + "node": ">=8" 6697 + } 6698 + }, 2983 6699 "node_modules/resolve-pkg-maps": { 2984 6700 "version": "1.0.0", 2985 6701 "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", ··· 3105 6821 "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 3106 6822 "license": "ISC" 3107 6823 }, 6824 + "node_modules/shebang-command": { 6825 + "version": "2.0.0", 6826 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 6827 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 6828 + "dev": true, 6829 + "license": "MIT", 6830 + "dependencies": { 6831 + "shebang-regex": "^3.0.0" 6832 + }, 6833 + "engines": { 6834 + "node": ">=8" 6835 + } 6836 + }, 6837 + "node_modules/shebang-regex": { 6838 + "version": "3.0.0", 6839 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 6840 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 6841 + "dev": true, 6842 + "license": "MIT", 6843 + "engines": { 6844 + "node": ">=8" 6845 + } 6846 + }, 3108 6847 "node_modules/shell-quote": { 3109 6848 "version": "1.8.3", 3110 6849 "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", ··· 3190 6929 "url": "https://github.com/sponsors/ljharb" 3191 6930 } 3192 6931 }, 6932 + "node_modules/signal-exit": { 6933 + "version": "4.1.0", 6934 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 6935 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 6936 + "dev": true, 6937 + "license": "ISC", 6938 + "engines": { 6939 + "node": ">=14" 6940 + }, 6941 + "funding": { 6942 + "url": "https://github.com/sponsors/isaacs" 6943 + } 6944 + }, 3193 6945 "node_modules/simple-concat": { 3194 6946 "version": "1.0.1", 3195 6947 "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", ··· 3233 6985 "decompress-response": "^6.0.0", 3234 6986 "once": "^1.3.1", 3235 6987 "simple-concat": "^1.0.0" 6988 + } 6989 + }, 6990 + "node_modules/slash": { 6991 + "version": "3.0.0", 6992 + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 6993 + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 6994 + "dev": true, 6995 + "license": "MIT", 6996 + "engines": { 6997 + "node": ">=8" 3236 6998 } 3237 6999 }, 3238 7000 "node_modules/sonic-boom": { ··· 3244 7006 "atomic-sleep": "^1.0.0" 3245 7007 } 3246 7008 }, 7009 + "node_modules/source-map": { 7010 + "version": "0.6.1", 7011 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 7012 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 7013 + "dev": true, 7014 + "license": "BSD-3-Clause", 7015 + "engines": { 7016 + "node": ">=0.10.0" 7017 + } 7018 + }, 7019 + "node_modules/source-map-support": { 7020 + "version": "0.5.13", 7021 + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", 7022 + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", 7023 + "dev": true, 7024 + "license": "MIT", 7025 + "dependencies": { 7026 + "buffer-from": "^1.0.0", 7027 + "source-map": "^0.6.0" 7028 + } 7029 + }, 3247 7030 "node_modules/split2": { 3248 7031 "version": "4.2.0", 3249 7032 "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", ··· 3253 7036 "node": ">= 10.x" 3254 7037 } 3255 7038 }, 7039 + "node_modules/sprintf-js": { 7040 + "version": "1.0.3", 7041 + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 7042 + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 7043 + "dev": true, 7044 + "license": "BSD-3-Clause" 7045 + }, 7046 + "node_modules/stack-utils": { 7047 + "version": "2.0.6", 7048 + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", 7049 + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", 7050 + "dev": true, 7051 + "license": "MIT", 7052 + "dependencies": { 7053 + "escape-string-regexp": "^2.0.0" 7054 + }, 7055 + "engines": { 7056 + "node": ">=10" 7057 + } 7058 + }, 3256 7059 "node_modules/statuses": { 3257 7060 "version": "2.0.2", 3258 7061 "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", ··· 3271 7074 "safe-buffer": "~5.2.0" 3272 7075 } 3273 7076 }, 7077 + "node_modules/string-length": { 7078 + "version": "4.0.2", 7079 + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 7080 + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", 7081 + "dev": true, 7082 + "license": "MIT", 7083 + "dependencies": { 7084 + "char-regex": "^1.0.2", 7085 + "strip-ansi": "^6.0.0" 7086 + }, 7087 + "engines": { 7088 + "node": ">=10" 7089 + } 7090 + }, 3274 7091 "node_modules/string-width": { 3275 7092 "version": "4.2.3", 3276 7093 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ··· 3286 7103 "node": ">=8" 3287 7104 } 3288 7105 }, 7106 + "node_modules/string-width-cjs": { 7107 + "name": "string-width", 7108 + "version": "4.2.3", 7109 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 7110 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 7111 + "dev": true, 7112 + "license": "MIT", 7113 + "dependencies": { 7114 + "emoji-regex": "^8.0.0", 7115 + "is-fullwidth-code-point": "^3.0.0", 7116 + "strip-ansi": "^6.0.1" 7117 + }, 7118 + "engines": { 7119 + "node": ">=8" 7120 + } 7121 + }, 3289 7122 "node_modules/strip-ansi": { 3290 7123 "version": "6.0.1", 3291 7124 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ··· 3299 7132 "node": ">=8" 3300 7133 } 3301 7134 }, 7135 + "node_modules/strip-ansi-cjs": { 7136 + "name": "strip-ansi", 7137 + "version": "6.0.1", 7138 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 7139 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 7140 + "dev": true, 7141 + "license": "MIT", 7142 + "dependencies": { 7143 + "ansi-regex": "^5.0.1" 7144 + }, 7145 + "engines": { 7146 + "node": ">=8" 7147 + } 7148 + }, 7149 + "node_modules/strip-bom": { 7150 + "version": "4.0.0", 7151 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 7152 + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 7153 + "dev": true, 7154 + "license": "MIT", 7155 + "engines": { 7156 + "node": ">=8" 7157 + } 7158 + }, 7159 + "node_modules/strip-final-newline": { 7160 + "version": "2.0.0", 7161 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 7162 + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 7163 + "dev": true, 7164 + "license": "MIT", 7165 + "engines": { 7166 + "node": ">=6" 7167 + } 7168 + }, 3302 7169 "node_modules/strip-json-comments": { 3303 7170 "version": "2.0.1", 3304 7171 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", ··· 3308 7175 "node": ">=0.10.0" 3309 7176 } 3310 7177 }, 7178 + "node_modules/superagent": { 7179 + "version": "10.2.1", 7180 + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.1.tgz", 7181 + "integrity": "sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==", 7182 + "dev": true, 7183 + "license": "MIT", 7184 + "dependencies": { 7185 + "component-emitter": "^1.3.0", 7186 + "cookiejar": "^2.1.4", 7187 + "debug": "^4.3.4", 7188 + "fast-safe-stringify": "^2.1.1", 7189 + "form-data": "^4.0.0", 7190 + "formidable": "^3.5.4", 7191 + "methods": "^1.1.2", 7192 + "mime": "2.6.0", 7193 + "qs": "^6.11.0" 7194 + }, 7195 + "engines": { 7196 + "node": ">=14.18.0" 7197 + } 7198 + }, 7199 + "node_modules/superagent/node_modules/mime": { 7200 + "version": "2.6.0", 7201 + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", 7202 + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", 7203 + "dev": true, 7204 + "license": "MIT", 7205 + "bin": { 7206 + "mime": "cli.js" 7207 + }, 7208 + "engines": { 7209 + "node": ">=4.0.0" 7210 + } 7211 + }, 7212 + "node_modules/supertest": { 7213 + "version": "7.1.1", 7214 + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.1.tgz", 7215 + "integrity": "sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==", 7216 + "dev": true, 7217 + "license": "MIT", 7218 + "dependencies": { 7219 + "methods": "^1.1.2", 7220 + "superagent": "^10.2.1" 7221 + }, 7222 + "engines": { 7223 + "node": ">=14.18.0" 7224 + } 7225 + }, 3311 7226 "node_modules/supports-color": { 3312 7227 "version": "7.2.0", 3313 7228 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", ··· 3320 7235 "node": ">=8" 3321 7236 } 3322 7237 }, 7238 + "node_modules/synckit": { 7239 + "version": "0.11.8", 7240 + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", 7241 + "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", 7242 + "dev": true, 7243 + "license": "MIT", 7244 + "dependencies": { 7245 + "@pkgr/core": "^0.2.4" 7246 + }, 7247 + "engines": { 7248 + "node": "^14.18.0 || >=16.0.0" 7249 + }, 7250 + "funding": { 7251 + "url": "https://opencollective.com/synckit" 7252 + } 7253 + }, 3323 7254 "node_modules/tar-fs": { 3324 7255 "version": "2.1.3", 3325 7256 "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", ··· 3348 7279 "node": ">=6" 3349 7280 } 3350 7281 }, 7282 + "node_modules/test-exclude": { 7283 + "version": "6.0.0", 7284 + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 7285 + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 7286 + "dev": true, 7287 + "license": "ISC", 7288 + "dependencies": { 7289 + "@istanbuljs/schema": "^0.1.2", 7290 + "glob": "^7.1.4", 7291 + "minimatch": "^3.0.4" 7292 + }, 7293 + "engines": { 7294 + "node": ">=8" 7295 + } 7296 + }, 7297 + "node_modules/test-exclude/node_modules/glob": { 7298 + "version": "7.2.3", 7299 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 7300 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 7301 + "deprecated": "Glob versions prior to v9 are no longer supported", 7302 + "dev": true, 7303 + "license": "ISC", 7304 + "dependencies": { 7305 + "fs.realpath": "^1.0.0", 7306 + "inflight": "^1.0.4", 7307 + "inherits": "2", 7308 + "minimatch": "^3.1.1", 7309 + "once": "^1.3.0", 7310 + "path-is-absolute": "^1.0.0" 7311 + }, 7312 + "engines": { 7313 + "node": "*" 7314 + }, 7315 + "funding": { 7316 + "url": "https://github.com/sponsors/isaacs" 7317 + } 7318 + }, 3351 7319 "node_modules/thread-stream": { 3352 7320 "version": "2.7.0", 3353 7321 "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", ··· 3366 7334 "tlds": "bin.js" 3367 7335 } 3368 7336 }, 7337 + "node_modules/tmpl": { 7338 + "version": "1.0.5", 7339 + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", 7340 + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", 7341 + "dev": true, 7342 + "license": "BSD-3-Clause" 7343 + }, 7344 + "node_modules/to-regex-range": { 7345 + "version": "5.0.1", 7346 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 7347 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 7348 + "dev": true, 7349 + "license": "MIT", 7350 + "dependencies": { 7351 + "is-number": "^7.0.0" 7352 + }, 7353 + "engines": { 7354 + "node": ">=8.0" 7355 + } 7356 + }, 3369 7357 "node_modules/toidentifier": { 3370 7358 "version": "1.0.1", 3371 7359 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", ··· 3385 7373 "tree-kill": "cli.js" 3386 7374 } 3387 7375 }, 7376 + "node_modules/ts-jest": { 7377 + "version": "29.4.0", 7378 + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.0.tgz", 7379 + "integrity": "sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==", 7380 + "dev": true, 7381 + "license": "MIT", 7382 + "dependencies": { 7383 + "bs-logger": "^0.2.6", 7384 + "ejs": "^3.1.10", 7385 + "fast-json-stable-stringify": "^2.1.0", 7386 + "json5": "^2.2.3", 7387 + "lodash.memoize": "^4.1.2", 7388 + "make-error": "^1.3.6", 7389 + "semver": "^7.7.2", 7390 + "type-fest": "^4.41.0", 7391 + "yargs-parser": "^21.1.1" 7392 + }, 7393 + "bin": { 7394 + "ts-jest": "cli.js" 7395 + }, 7396 + "engines": { 7397 + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" 7398 + }, 7399 + "peerDependencies": { 7400 + "@babel/core": ">=7.0.0-beta.0 <8", 7401 + "@jest/transform": "^29.0.0 || ^30.0.0", 7402 + "@jest/types": "^29.0.0 || ^30.0.0", 7403 + "babel-jest": "^29.0.0 || ^30.0.0", 7404 + "jest": "^29.0.0 || ^30.0.0", 7405 + "jest-util": "^29.0.0 || ^30.0.0", 7406 + "typescript": ">=4.3 <6" 7407 + }, 7408 + "peerDependenciesMeta": { 7409 + "@babel/core": { 7410 + "optional": true 7411 + }, 7412 + "@jest/transform": { 7413 + "optional": true 7414 + }, 7415 + "@jest/types": { 7416 + "optional": true 7417 + }, 7418 + "babel-jest": { 7419 + "optional": true 7420 + }, 7421 + "esbuild": { 7422 + "optional": true 7423 + }, 7424 + "jest-util": { 7425 + "optional": true 7426 + } 7427 + } 7428 + }, 7429 + "node_modules/ts-jest/node_modules/type-fest": { 7430 + "version": "4.41.0", 7431 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", 7432 + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", 7433 + "dev": true, 7434 + "license": "(MIT OR CC0-1.0)", 7435 + "engines": { 7436 + "node": ">=16" 7437 + }, 7438 + "funding": { 7439 + "url": "https://github.com/sponsors/sindresorhus" 7440 + } 7441 + }, 3388 7442 "node_modules/tslib": { 3389 7443 "version": "2.8.1", 3390 7444 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", ··· 3423 7477 "node": "*" 3424 7478 } 3425 7479 }, 7480 + "node_modules/type-detect": { 7481 + "version": "4.0.8", 7482 + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 7483 + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 7484 + "dev": true, 7485 + "license": "MIT", 7486 + "engines": { 7487 + "node": ">=4" 7488 + } 7489 + }, 7490 + "node_modules/type-fest": { 7491 + "version": "0.21.3", 7492 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 7493 + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 7494 + "dev": true, 7495 + "license": "(MIT OR CC0-1.0)", 7496 + "engines": { 7497 + "node": ">=10" 7498 + }, 7499 + "funding": { 7500 + "url": "https://github.com/sponsors/sindresorhus" 7501 + } 7502 + }, 3426 7503 "node_modules/type-is": { 3427 7504 "version": "2.0.1", 3428 7505 "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", ··· 3492 7569 "node": ">= 0.8" 3493 7570 } 3494 7571 }, 7572 + "node_modules/unrs-resolver": { 7573 + "version": "1.9.0", 7574 + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.0.tgz", 7575 + "integrity": "sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==", 7576 + "dev": true, 7577 + "hasInstallScript": true, 7578 + "license": "MIT", 7579 + "dependencies": { 7580 + "napi-postinstall": "^0.2.2" 7581 + }, 7582 + "funding": { 7583 + "url": "https://opencollective.com/unrs-resolver" 7584 + }, 7585 + "optionalDependencies": { 7586 + "@unrs/resolver-binding-android-arm-eabi": "1.9.0", 7587 + "@unrs/resolver-binding-android-arm64": "1.9.0", 7588 + "@unrs/resolver-binding-darwin-arm64": "1.9.0", 7589 + "@unrs/resolver-binding-darwin-x64": "1.9.0", 7590 + "@unrs/resolver-binding-freebsd-x64": "1.9.0", 7591 + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", 7592 + "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", 7593 + "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", 7594 + "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", 7595 + "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", 7596 + "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", 7597 + "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", 7598 + "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", 7599 + "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", 7600 + "@unrs/resolver-binding-linux-x64-musl": "1.9.0", 7601 + "@unrs/resolver-binding-wasm32-wasi": "1.9.0", 7602 + "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", 7603 + "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", 7604 + "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" 7605 + } 7606 + }, 7607 + "node_modules/update-browserslist-db": { 7608 + "version": "1.1.3", 7609 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 7610 + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 7611 + "dev": true, 7612 + "funding": [ 7613 + { 7614 + "type": "opencollective", 7615 + "url": "https://opencollective.com/browserslist" 7616 + }, 7617 + { 7618 + "type": "tidelift", 7619 + "url": "https://tidelift.com/funding/github/npm/browserslist" 7620 + }, 7621 + { 7622 + "type": "github", 7623 + "url": "https://github.com/sponsors/ai" 7624 + } 7625 + ], 7626 + "license": "MIT", 7627 + "dependencies": { 7628 + "escalade": "^3.2.0", 7629 + "picocolors": "^1.1.1" 7630 + }, 7631 + "bin": { 7632 + "update-browserslist-db": "cli.js" 7633 + }, 7634 + "peerDependencies": { 7635 + "browserslist": ">= 4.21.0" 7636 + } 7637 + }, 3495 7638 "node_modules/util-deprecate": { 3496 7639 "version": "1.0.2", 3497 7640 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", ··· 3505 7648 "license": "MIT", 3506 7649 "engines": { 3507 7650 "node": ">= 0.4.0" 7651 + } 7652 + }, 7653 + "node_modules/v8-to-istanbul": { 7654 + "version": "9.3.0", 7655 + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", 7656 + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", 7657 + "dev": true, 7658 + "license": "ISC", 7659 + "dependencies": { 7660 + "@jridgewell/trace-mapping": "^0.3.12", 7661 + "@types/istanbul-lib-coverage": "^2.0.1", 7662 + "convert-source-map": "^2.0.0" 7663 + }, 7664 + "engines": { 7665 + "node": ">=10.12.0" 3508 7666 } 3509 7667 }, 3510 7668 "node_modules/varint": { ··· 3522 7680 "node": ">= 0.8" 3523 7681 } 3524 7682 }, 7683 + "node_modules/walker": { 7684 + "version": "1.0.8", 7685 + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", 7686 + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", 7687 + "dev": true, 7688 + "license": "Apache-2.0", 7689 + "dependencies": { 7690 + "makeerror": "1.0.12" 7691 + } 7692 + }, 7693 + "node_modules/which": { 7694 + "version": "2.0.2", 7695 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 7696 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 7697 + "dev": true, 7698 + "license": "ISC", 7699 + "dependencies": { 7700 + "isexe": "^2.0.0" 7701 + }, 7702 + "bin": { 7703 + "node-which": "bin/node-which" 7704 + }, 7705 + "engines": { 7706 + "node": ">= 8" 7707 + } 7708 + }, 3525 7709 "node_modules/wrap-ansi": { 3526 7710 "version": "7.0.0", 3527 7711 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", ··· 3540 7724 "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3541 7725 } 3542 7726 }, 7727 + "node_modules/wrap-ansi-cjs": { 7728 + "name": "wrap-ansi", 7729 + "version": "7.0.0", 7730 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 7731 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 7732 + "dev": true, 7733 + "license": "MIT", 7734 + "dependencies": { 7735 + "ansi-styles": "^4.0.0", 7736 + "string-width": "^4.1.0", 7737 + "strip-ansi": "^6.0.0" 7738 + }, 7739 + "engines": { 7740 + "node": ">=10" 7741 + }, 7742 + "funding": { 7743 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 7744 + } 7745 + }, 3543 7746 "node_modules/wrappy": { 3544 7747 "version": "1.0.2", 3545 7748 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3546 7749 "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3547 7750 "license": "ISC" 3548 7751 }, 7752 + "node_modules/write-file-atomic": { 7753 + "version": "5.0.1", 7754 + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", 7755 + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", 7756 + "dev": true, 7757 + "license": "ISC", 7758 + "dependencies": { 7759 + "imurmurhash": "^0.1.4", 7760 + "signal-exit": "^4.0.1" 7761 + }, 7762 + "engines": { 7763 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 7764 + } 7765 + }, 3549 7766 "node_modules/ws": { 3550 7767 "version": "8.18.2", 3551 7768 "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", ··· 3576 7793 "engines": { 3577 7794 "node": ">=10" 3578 7795 } 7796 + }, 7797 + "node_modules/yallist": { 7798 + "version": "3.1.1", 7799 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 7800 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 7801 + "dev": true, 7802 + "license": "ISC" 3579 7803 }, 3580 7804 "node_modules/yargs": { 3581 7805 "version": "17.7.2",
+9 -2
package.json
··· 9 9 "seed-vibes": "tsx src/seed-vibes.ts", 10 10 "build": "tsc", 11 11 "start": "node dist/index.js", 12 - "test": "echo \"Error: no test specified\" && exit 1" 12 + "test": "jest", 13 + "test:watch": "jest --watch", 14 + "test:coverage": "jest --coverage" 13 15 }, 14 16 "keywords": [], 15 17 "author": "", ··· 42 44 "ws": "^8.18.2" 43 45 }, 44 46 "devDependencies": { 45 - "concurrently": "^9.1.2" 47 + "@types/jest": "^30.0.0", 48 + "@types/supertest": "^6.0.3", 49 + "concurrently": "^9.1.2", 50 + "jest": "^30.0.2", 51 + "supertest": "^7.1.1", 52 + "ts-jest": "^29.4.0" 46 53 } 47 54 }
+1 -1
src/blips.ts
··· 18 18 tags, 19 19 vibe, 20 20 createdAt: new Date().toISOString(), 21 - fluffs: 0, 21 + grooves: 0, 22 22 }; 23 23 24 24 const response = await this.agent.com.atproto.repo.createRecord({
+35 -8
src/database.js
··· 7 7 const better_sqlite3_1 = __importDefault(require("better-sqlite3")); 8 8 const path_1 = __importDefault(require("path")); 9 9 const db = new better_sqlite3_1.default(path_1.default.join(__dirname, '../blonk.db')); 10 + // Drop old fluffs index if it exists 11 + db.exec(`DROP INDEX IF EXISTS idx_blips_fluffs;`); 10 12 // Initialize database schema 11 13 db.exec(` 12 14 CREATE TABLE IF NOT EXISTS blips ( ··· 21 23 tags TEXT, 22 24 vibe_uri TEXT, 23 25 vibe_name TEXT, 24 - fluffs INTEGER DEFAULT 0, 26 + grooves INTEGER DEFAULT 0, 25 27 created_at TEXT NOT NULL, 26 28 indexed_at TEXT DEFAULT CURRENT_TIMESTAMP 27 29 ); 28 30 29 31 CREATE INDEX IF NOT EXISTS idx_blips_created_at ON blips(created_at DESC); 30 32 CREATE INDEX IF NOT EXISTS idx_blips_author ON blips(author_did); 31 - CREATE INDEX IF NOT EXISTS idx_blips_fluffs ON blips(fluffs DESC); 33 + CREATE INDEX IF NOT EXISTS idx_blips_grooves ON blips(grooves DESC); 32 34 CREATE INDEX IF NOT EXISTS idx_blips_vibe ON blips(vibe_uri); 33 35 34 36 CREATE TABLE IF NOT EXISTS vibes ( ··· 64 66 65 67 CREATE INDEX IF NOT EXISTS idx_vibe_mentions_name ON vibe_mentions(vibe_name); 66 68 CREATE UNIQUE INDEX IF NOT EXISTS idx_vibes_unique_name ON vibes(LOWER(name)); 69 + 70 + CREATE TABLE IF NOT EXISTS grooves ( 71 + id INTEGER PRIMARY KEY AUTOINCREMENT, 72 + blip_uri TEXT NOT NULL, 73 + user_did TEXT NOT NULL, 74 + groove_type TEXT NOT NULL CHECK (groove_type IN ('looks_good', 'shit_rips')), 75 + created_at TEXT NOT NULL, 76 + UNIQUE(blip_uri, user_did) 77 + ); 78 + 79 + CREATE INDEX IF NOT EXISTS idx_grooves_blip ON grooves(blip_uri); 80 + CREATE INDEX IF NOT EXISTS idx_grooves_user ON grooves(user_did); 67 81 `); 68 82 exports.blipDb = { 69 83 insertBlip: (blip) => { 70 84 const stmt = db.prepare(` 71 85 INSERT OR REPLACE INTO blips 72 - (uri, cid, author_did, author_handle, author_display_name, title, body, url, tags, vibe_uri, vibe_name, fluffs, created_at) 86 + (uri, cid, author_did, author_handle, author_display_name, title, body, url, tags, vibe_uri, vibe_name, grooves, created_at) 73 87 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 74 88 `); 75 - stmt.run(blip.uri, blip.cid, blip.authorDid, blip.authorHandle, blip.authorDisplayName, blip.title, blip.body, blip.url, JSON.stringify(blip.tags || []), blip.vibeUri, blip.vibeName, blip.fluffs, blip.createdAt); 89 + stmt.run(blip.uri, blip.cid, blip.authorDid, blip.authorHandle, blip.authorDisplayName, blip.title, blip.body, blip.url, JSON.stringify(blip.tags || []), blip.vibeUri, blip.vibeName, blip.grooves, blip.createdAt); 76 90 }, 77 91 getBlips: (limit = 50, offset = 0) => { 78 92 const stmt = db.prepare(` ··· 93 107 tags: JSON.parse(row.tags || '[]'), 94 108 vibeUri: row.vibe_uri, 95 109 vibeName: row.vibe_name, 96 - fluffs: row.fluffs, 110 + grooves: row.grooves, 97 111 createdAt: row.created_at, 98 112 indexedAt: row.indexed_at, 99 113 })); ··· 118 132 tags: JSON.parse(row.tags || '[]'), 119 133 vibeUri: row.vibe_uri, 120 134 vibeName: row.vibe_name, 121 - fluffs: row.fluffs, 135 + grooves: row.grooves, 122 136 createdAt: row.created_at, 123 137 indexedAt: row.indexed_at, 124 138 })); ··· 143 157 tags: JSON.parse(row.tags || '[]'), 144 158 vibeUri: row.vibe_uri, 145 159 vibeName: row.vibe_name, 146 - fluffs: row.fluffs, 160 + grooves: row.grooves, 147 161 createdAt: row.created_at, 148 162 indexedAt: row.indexed_at, 149 163 })); ··· 212 226 const result = stmt.get(vibeName); 213 227 return (result === null || result === void 0 ? void 0 : result.count) || 0; 214 228 }, 229 + getTotalMentionCount: (vibeName) => { 230 + const stmt = db.prepare(` 231 + SELECT COUNT(*) as count 232 + FROM vibe_mentions 233 + WHERE vibe_name = ? 234 + `); 235 + const result = stmt.get(vibeName); 236 + return (result === null || result === void 0 ? void 0 : result.count) || 0; 237 + }, 215 238 getEmergingVibes: () => { 216 239 const stmt = db.prepare(` 217 240 SELECT 218 241 vm.vibe_name, 219 242 COUNT(DISTINCT vm.mentioned_by_did) as mention_count, 243 + COUNT(*) as total_mention_count, 220 244 MIN(vm.mentioned_at) as first_mentioned, 221 245 MAX(vm.mentioned_at) as last_mentioned 222 246 FROM vibe_mentions vm ··· 228 252 return stmt.all().map(row => ({ 229 253 vibeName: row.vibe_name, 230 254 mentionCount: row.mention_count, 255 + totalMentionCount: row.total_mention_count, 231 256 firstMentioned: row.first_mentioned, 232 257 lastMentioned: row.last_mentioned, 233 - progress: (row.mention_count / 5) * 100, // 5 is the threshold 258 + progress: Math.max((row.mention_count / 5) * 100, // 5 unique mentions 259 + (row.total_mention_count / 10) * 100 // OR 10 total mentions 260 + ), 234 261 })); 235 262 }, 236 263 getVibeByName: (name) => {
+4 -3
src/database.ts
··· 57 57 vibe_name TEXT NOT NULL, 58 58 mentioned_by_did TEXT NOT NULL, 59 59 mentioned_at TEXT NOT NULL, 60 - post_uri TEXT, 61 - PRIMARY KEY (vibe_name, mentioned_by_did, mentioned_at) 60 + post_uri TEXT NOT NULL, 61 + PRIMARY KEY (vibe_name, post_uri) 62 62 ); 63 63 64 64 CREATE INDEX IF NOT EXISTS idx_vibe_mentions_name ON vibe_mentions(vibe_name); 65 + CREATE INDEX IF NOT EXISTS idx_vibe_mentions_author ON vibe_mentions(mentioned_by_did); 65 66 CREATE UNIQUE INDEX IF NOT EXISTS idx_vibes_unique_name ON vibes(LOWER(name)); 66 67 67 68 CREATE TABLE IF NOT EXISTS grooves ( ··· 276 277 }; 277 278 278 279 export const vibeMentionDb = { 279 - trackMention: (vibeName: string, mentionedByDid: string, postUri?: string) => { 280 + trackMention: (vibeName: string, mentionedByDid: string, postUri: string) => { 280 281 const stmt = db.prepare(` 281 282 INSERT OR IGNORE INTO vibe_mentions 282 283 (vibe_name, mentioned_by_did, mentioned_at, post_uri)
+34 -77
src/firehose-fixed.js
··· 11 11 Object.defineProperty(exports, "__esModule", { value: true }); 12 12 exports.FixedFirehoseMonitor = void 0; 13 13 const ws_1 = require("ws"); 14 - const common_1 = require("@atproto/common"); 14 + const cbor_x_1 = require("cbor-x"); 15 15 const repo_1 = require("@atproto/repo"); 16 16 const vibe_monitor_1 = require("./vibe-monitor"); 17 - // Frame types based on AT Protocol spec 18 - var FrameType; 19 - (function (FrameType) { 20 - FrameType[FrameType["Message"] = 1] = "Message"; 21 - FrameType[FrameType["Error"] = -1] = "Error"; 22 - })(FrameType || (FrameType = {})); 23 17 class FixedFirehoseMonitor { 24 18 constructor(agent) { 25 19 this.ws = null; ··· 32 26 } 33 27 start() { 34 28 return __awaiter(this, void 0, void 0, function* () { 35 - console.log('🔥 Starting FIXED Bluesky Firehose monitoring for #vibe-* hashtags...'); 29 + console.log('🔥 Starting fixed Bluesky Firehose monitoring for #vibe-* hashtags...'); 36 30 const firehoseUrl = 'wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos'; 37 31 console.log(`🔗 Connecting to: ${firehoseUrl}`); 38 32 this.ws = new ws_1.WebSocket(firehoseUrl); ··· 43 37 this.errorCount = 0; 44 38 // Log stats every 30 seconds 45 39 this.statsInterval = setInterval(() => { 46 - console.log(`📊 Firehose stats: ${this.messageCount} messages, ${this.vibeDetectionCount} #vibe-* detections, ${this.errorCount} errors`); 40 + console.log(`📊 Firehose stats: ${this.messageCount} messages processed, ${this.vibeDetectionCount} #vibe-* detections, ${this.errorCount} errors`); 47 41 }, 30000); 48 42 }); 49 43 this.ws.on('message', (data) => __awaiter(this, void 0, void 0, function* () { 50 44 this.messageCount++; 51 45 try { 52 - // Decode the frame structure 53 - const frame = this.decodeFrame(new Uint8Array(data)); 54 - if (!frame) { 55 - return; 56 - } 57 - // Handle different message types 58 - switch (frame.body.$type) { 59 - case 'com.atproto.sync.subscribeRepos#commit': 60 - yield this.handleCommit(frame.body); 61 - break; 62 - case 'com.atproto.sync.subscribeRepos#error': 63 - console.error('Firehose error:', frame.body.error, frame.body.message); 64 - this.errorCount++; 65 - break; 66 - case 'com.atproto.sync.subscribeRepos#info': 67 - console.log('Firehose info:', frame.body.name, frame.body.message); 68 - break; 69 - default: 70 - // Unknown message type 71 - if (this.messageCount % 1000 === 0) { 72 - console.log(`Unknown message type: ${frame.body.$type}`); 73 - } 46 + // AT Protocol uses framed messages 47 + // First decode the frame header 48 + const [header, remainder] = this.decodeVarint(data); 49 + // Then decode the actual message 50 + const messageBytes = data.slice(data.length - remainder); 51 + const message = (0, cbor_x_1.decode)(messageBytes); 52 + // Handle commit messages 53 + if (message && message.$type === 'com.atproto.sync.subscribeRepos#commit') { 54 + yield this.handleCommit(message); 74 55 } 75 56 } 76 57 catch (error) { 77 58 // Only log every 100th error to avoid spam 78 59 if (this.errorCount % 100 === 0) { 79 - console.error('Error processing firehose message:', error); 60 + console.error('Error processing message:', error); 80 61 } 81 62 this.errorCount++; 82 63 } 83 64 })); 84 65 this.ws.on('error', (error) => { 85 66 console.error('❌ Firehose WebSocket error:', error.message); 86 - if (error.code) { 87 - console.error(' Error code:', error.code); 88 - } 89 67 }); 90 68 this.ws.on('close', (code, reason) => { 91 69 console.log(`🔌 Firehose disconnected: Code ${code}${reason ? `, Reason: ${reason}` : ''}`); ··· 98 76 }); 99 77 }); 100 78 } 101 - decodeFrame(bytes) { 102 - try { 103 - // Decode multiple CBOR items (header and body) 104 - const decoded = (0, common_1.cborDecodeMulti)(bytes); 105 - if (decoded.length < 2) { 106 - throw new Error('Frame must have at least header and body'); 107 - } 108 - const header = decoded[0]; 109 - const body = decoded[1]; 110 - // Validate header 111 - if (!header || typeof header.op !== 'number') { 112 - throw new Error('Invalid frame header'); 113 - } 114 - // Handle message frames 115 - if (header.op === FrameType.Message) { 116 - // Add the $type field based on the header type 117 - if (body && typeof body === 'object' && header.t) { 118 - body.$type = header.t.startsWith('#') 119 - ? `com.atproto.sync.subscribeRepos${header.t}` 120 - : header.t; 121 - } 122 - return { header, body }; 123 - } 124 - // Handle error frames 125 - if (header.op === FrameType.Error) { 126 - return { header, body }; 127 - } 128 - throw new Error(`Unknown frame type: ${header.op}`); 129 - } 130 - catch (error) { 131 - if (this.errorCount % 100 === 0) { 132 - console.error('Error decoding frame:', error); 133 - } 134 - return null; 135 - } 79 + decodeVarint(buf) { 80 + let value = 0; 81 + let shift = 0; 82 + let byte; 83 + let i = 0; 84 + do { 85 + byte = buf[i++]; 86 + value |= (byte & 0x7f) << shift; 87 + shift += 7; 88 + } while (byte & 0x80); 89 + return [value, buf.length - i]; 136 90 } 137 91 handleCommit(commit) { 138 92 return __awaiter(this, void 0, void 0, function* () { 93 + var _a; 139 94 try { 95 + if (!commit.blocks) 96 + return; 140 97 // Parse the CAR file from blocks 141 98 const car = yield (0, repo_1.readCar)(commit.blocks); 142 99 // Process each operation 143 - for (const op of commit.ops) { 100 + for (const op of commit.ops || []) { 144 101 // We only care about post creates 145 - if (op.action === 'create' && op.path.includes('app.bsky.feed.post')) { 102 + if (op.action === 'create' && ((_a = op.path) === null || _a === void 0 ? void 0 : _a.includes('app.bsky.feed.post'))) { 146 103 try { 147 - // Get the record bytes from the CAR file using the operation's CID 104 + // Get the record bytes from the CAR file 148 105 const recordBytes = car.blocks.get(op.cid); 149 106 if (!recordBytes) 150 107 continue; 151 - // Convert CBOR to lexicon record 108 + // Convert CBOR to record 152 109 const record = (0, repo_1.cborToLexRecord)(recordBytes); 153 110 // Check for #vibe- hashtags 154 111 if (record.text && typeof record.text === 'string' && record.text.toLowerCase().includes('#vibe-')) { ··· 164 121 } 165 122 } 166 123 catch (e) { 167 - // Record-specific error, don't spam logs 124 + // Record-specific error 168 125 if (this.errorCount % 100 === 0) { 169 - console.error('Error processing post record:', e); 126 + console.error('Error processing record:', e); 170 127 } 171 128 this.errorCount++; 172 129 } ··· 176 133 catch (error) { 177 134 // CAR parsing error 178 135 if (this.errorCount % 100 === 0) { 179 - console.error('Error parsing CAR file:', error); 136 + console.error('Error handling commit:', error); 180 137 } 181 138 this.errorCount++; 182 139 }
+72
src/firehose-with-atproto-sync.js
··· 1 + "use strict"; 2 + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 + return new (P || (P = Promise))(function (resolve, reject) { 5 + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 + step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 + }); 10 + }; 11 + Object.defineProperty(exports, "__esModule", { value: true }); 12 + exports.ATProtoFirehoseMonitor = void 0; 13 + const sync_1 = require("@atproto/sync"); 14 + const vibe_monitor_1 = require("./vibe-monitor"); 15 + class ATProtoFirehoseMonitor { 16 + constructor(agent) { 17 + this.messageCount = 0; 18 + this.vibeDetectionCount = 0; 19 + this.statsInterval = null; 20 + this.vibeMonitor = new vibe_monitor_1.VibeMonitor(agent); 21 + this.firehose = new sync_1.Firehose({ 22 + filterCollections: ['app.bsky.feed.post'], 23 + handleEvent: (evt) => __awaiter(this, void 0, void 0, function* () { 24 + this.messageCount++; 25 + if (evt.event === 'create') { 26 + const ops = (0, sync_1.getOpsByType)(evt); 27 + for (const op of ops.posts.creates) { 28 + try { 29 + const record = op.record; 30 + // Check for #vibe- hashtags 31 + if (record.text && typeof record.text === 'string' && record.text.toLowerCase().includes('#vibe-')) { 32 + this.vibeDetectionCount++; 33 + console.log(`\n🎯 Detected #vibe-* in Bluesky post!`); 34 + console.log(` Author DID: ${op.author}`); 35 + console.log(` Text: "${record.text.substring(0, 100)}${record.text.length > 100 ? '...' : ''}"`); 36 + console.log(` URI: ${op.uri}`); 37 + // Process the vibe mention 38 + yield this.vibeMonitor.checkPost(record.text, op.author, op.uri); 39 + } 40 + } 41 + catch (e) { 42 + console.error('Error processing post:', e); 43 + } 44 + } 45 + } 46 + }), 47 + onError: (error) => { 48 + console.error('Firehose error:', error); 49 + } 50 + }); 51 + } 52 + start() { 53 + return __awaiter(this, void 0, void 0, function* () { 54 + console.log('🔥 Starting AT Protocol Sync Firehose monitoring for #vibe-* hashtags...'); 55 + // Start stats logging 56 + this.statsInterval = setInterval(() => { 57 + console.log(`📊 Firehose stats: ${this.messageCount} messages processed, ${this.vibeDetectionCount} #vibe-* detections`); 58 + }, 30000); 59 + // Start the firehose 60 + yield this.firehose.start(); 61 + console.log('📡 Connected to AT Protocol Firehose - monitoring all posts for #vibe-*'); 62 + }); 63 + } 64 + stop() { 65 + if (this.statsInterval) { 66 + clearInterval(this.statsInterval); 67 + this.statsInterval = null; 68 + } 69 + this.firehose.stop(); 70 + } 71 + } 72 + exports.ATProtoFirehoseMonitor = ATProtoFirehoseMonitor;
+103
src/firehose-with-skyware.js
··· 1 + "use strict"; 2 + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 + return new (P || (P = Promise))(function (resolve, reject) { 5 + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 + step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 + }); 10 + }; 11 + Object.defineProperty(exports, "__esModule", { value: true }); 12 + exports.SkywareFirehoseMonitor = void 0; 13 + const firehose_1 = require("@skyware/firehose"); 14 + const ws_1 = require("ws"); 15 + const vibe_monitor_1 = require("./vibe-monitor"); 16 + class SkywareFirehoseMonitor { 17 + constructor(agent) { 18 + this.messageCount = 0; 19 + this.vibeDetectionCount = 0; 20 + this.errorCount = 0; 21 + this.statsInterval = null; 22 + this.vibeMonitor = new vibe_monitor_1.VibeMonitor(agent); 23 + this.firehose = new firehose_1.Firehose({ 24 + ws: ws_1.WebSocket, 25 + relay: 'wss://bsky.network' 26 + }); 27 + } 28 + start() { 29 + return __awaiter(this, void 0, void 0, function* () { 30 + console.log('🔥 Starting Skyware Firehose monitoring for #vibe-* hashtags...'); 31 + // Set up event handlers 32 + this.firehose.on('open', () => { 33 + console.log('📡 Connected to Bluesky Firehose - monitoring all posts for #vibe-*'); 34 + this.messageCount = 0; 35 + this.vibeDetectionCount = 0; 36 + this.errorCount = 0; 37 + // Log stats every 30 seconds 38 + this.statsInterval = setInterval(() => { 39 + console.log(`📊 Firehose stats: ${this.messageCount} messages, ${this.vibeDetectionCount} #vibe-* detections, ${this.errorCount} errors`); 40 + }, 30000); 41 + }); 42 + this.firehose.on('commit', (commit) => __awaiter(this, void 0, void 0, function* () { 43 + this.messageCount++; 44 + try { 45 + // Process operations in the commit 46 + for (const op of commit.ops || []) { 47 + // We only care about post creates 48 + if (op.action === 'create' && op.path.includes('app.bsky.feed.post')) { 49 + const record = op.record; 50 + // Check for #vibe- hashtags 51 + if ((record === null || record === void 0 ? void 0 : record.text) && typeof record.text === 'string' && record.text.toLowerCase().includes('#vibe-')) { 52 + this.vibeDetectionCount++; 53 + const authorDid = commit.repo; 54 + console.log(`\n🎯 Detected #vibe-* in Bluesky post!`); 55 + console.log(` Author DID: ${authorDid}`); 56 + console.log(` Text: "${record.text.substring(0, 100)}${record.text.length > 100 ? '...' : ''}"`); 57 + console.log(` Path: ${op.path}`); 58 + // Process the vibe mention 59 + const postUri = `at://${authorDid}/${op.path}`; 60 + yield this.vibeMonitor.checkPost(record.text, authorDid, postUri); 61 + } 62 + } 63 + } 64 + } 65 + catch (error) { 66 + // Only log every 100th error to avoid spam 67 + if (this.errorCount % 100 === 0) { 68 + console.error('Error processing commit:', error); 69 + } 70 + this.errorCount++; 71 + } 72 + })); 73 + this.firehose.on('error', ({ error }) => { 74 + // Only log every 100th error to avoid spam 75 + if (this.errorCount % 100 === 0) { 76 + console.error('Firehose error:', error); 77 + } 78 + this.errorCount++; 79 + }); 80 + this.firehose.on('websocketError', ({ error }) => { 81 + console.error('❌ WebSocket error:', error); 82 + }); 83 + this.firehose.on('close', (cursor) => { 84 + console.log(`🔌 Firehose disconnected at cursor: ${cursor}`); 85 + console.log(' The firehose will auto-reconnect...'); 86 + if (this.statsInterval) { 87 + clearInterval(this.statsInterval); 88 + this.statsInterval = null; 89 + } 90 + }); 91 + // Start the firehose 92 + this.firehose.start(); 93 + }); 94 + } 95 + stop() { 96 + if (this.statsInterval) { 97 + clearInterval(this.statsInterval); 98 + this.statsInterval = null; 99 + } 100 + this.firehose.close(); 101 + } 102 + } 103 + exports.SkywareFirehoseMonitor = SkywareFirehoseMonitor;
+1 -1
src/firehose.js
··· 118 118 tags: blip.tags || [], 119 119 vibeUri: (_a = blip.vibe) === null || _a === void 0 ? void 0 : _a.uri, 120 120 vibeName: (_b = blip.vibe) === null || _b === void 0 ? void 0 : _b.name, 121 - fluffs: blip.fluffs || 0, 121 + grooves: blip.grooves || 0, 122 122 createdAt: blip.createdAt, 123 123 }); 124 124 }
+1 -1
src/index.ts
··· 30 30 if (blip.body) console.log(` ${blip.body.substring(0, 100)}...`); 31 31 if (blip.url) console.log(` 🔗 ${blip.url}`); 32 32 console.log(` 📅 ${new Date(blip.createdAt).toLocaleString()}`); 33 - console.log(` ✨ ${blip.fluffs} fluffs`); 33 + console.log(` ✨ ${blip.grooves} grooves`); 34 34 }); 35 35 36 36 } catch (error) {
+28
src/post-test-vibe.js
··· 1 + "use strict"; 2 + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 + return new (P || (P = Promise))(function (resolve, reject) { 5 + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 + step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 + }); 10 + }; 11 + Object.defineProperty(exports, "__esModule", { value: true }); 12 + const agent_1 = require("./agent"); 13 + function postTestVibe() { 14 + return __awaiter(this, void 0, void 0, function* () { 15 + const agent = new agent_1.BlonkAgent(); 16 + yield agent.login(); 17 + const bskyAgent = agent.getAgent(); 18 + const testVibeName = `blonk_test_${Date.now()}`; 19 + console.log(`Posting test vibe: #vibe-${testVibeName}`); 20 + const result = yield bskyAgent.post({ 21 + text: `Testing Blonk vibe detection! #vibe-${testVibeName}`, 22 + createdAt: new Date().toISOString(), 23 + }); 24 + console.log('Posted:', result.uri); 25 + console.log(`Now search for: #vibe-${testVibeName}`); 26 + }); 27 + } 28 + postTestVibe().catch(console.error);
+23
src/post-test-vibe.ts
··· 1 + import { BskyAgent } from '@atproto/api'; 2 + import { BlonkAgent } from './agent'; 3 + 4 + async function postTestVibe() { 5 + const agent = new BlonkAgent(); 6 + await agent.login(); 7 + 8 + const bskyAgent = agent.getAgent(); 9 + 10 + const testVibeName = `blonk_test_${Date.now()}`; 11 + 12 + console.log(`Posting test vibe: #vibe-${testVibeName}`); 13 + 14 + const result = await bskyAgent.post({ 15 + text: `Testing Blonk vibe detection! #vibe-${testVibeName}`, 16 + createdAt: new Date().toISOString(), 17 + }); 18 + 19 + console.log('Posted:', result.uri); 20 + console.log(`Now search for: #vibe-${testVibeName}`); 21 + } 22 + 23 + postTestVibe().catch(console.error);
+2 -2
src/schemas.js
··· 1 1 "use strict"; 2 2 Object.defineProperty(exports, "__esModule", { value: true }); 3 - exports.VIBE_MEMBER_NSID = exports.VIBE_NSID = exports.COMMENT_NSID = exports.FLUFF_NSID = exports.BLIP_NSID = void 0; 3 + exports.VIBE_MEMBER_NSID = exports.VIBE_NSID = exports.COMMENT_NSID = exports.GROOVE_NSID = exports.BLIP_NSID = void 0; 4 4 exports.BLIP_NSID = 'com.blonk.blip'; 5 - exports.FLUFF_NSID = 'com.blonk.fluff'; 5 + exports.GROOVE_NSID = 'com.blonk.groove'; 6 6 exports.COMMENT_NSID = 'com.blonk.comment'; 7 7 exports.VIBE_NSID = 'com.blonk.vibe'; 8 8 exports.VIBE_MEMBER_NSID = 'com.blonk.vibeMember';
+3 -2
src/search-monitor.js
··· 34 34 console.log('🔎 Searching Bluesky for #vibe-* mentions...'); 35 35 // Search for posts containing #vibe- 36 36 const searchResponse = yield this.agent.app.bsky.feed.searchPosts({ 37 - q: '#vibe-', 38 - limit: 50, 37 + q: 'vibe-', 38 + limit: 100, 39 39 }); 40 + console.log(`Search returned ${searchResponse.data.posts.length} posts`); 40 41 let newMentions = 0; 41 42 for (const post of searchResponse.data.posts) { 42 43 const text = post.record.text;
+9 -1
src/search-monitor.ts
··· 36 36 console.log(`Search returned ${searchResponse.data.posts.length} posts`); 37 37 38 38 let newMentions = 0; 39 + let debugCount = 0; 39 40 40 41 for (const post of searchResponse.data.posts) { 41 - const text = post.record.text; 42 + const record = post.record as any; 43 + const text = record?.text; 42 44 const authorDid = post.author.did; 45 + 46 + // Debug first few posts 47 + if (debugCount < 3 && text && text.includes('vibe-')) { 48 + console.log(`Debug: Post text contains 'vibe-': "${text.substring(0, 150)}"`); 49 + debugCount++; 50 + } 43 51 44 52 if (text && text.includes('#vibe-')) { 45 53 console.log(`Found #vibe-* mention by @${post.author.handle}: "${text.substring(0, 100)}..."`);
+16 -11
src/server.js
··· 51 51 const blips_1 = require("./blips"); 52 52 const vibes_1 = require("./vibes"); 53 53 const firehose_1 = require("./firehose"); 54 - const typed_firehose_1 = require("./typed-firehose"); 54 + const search_monitor_1 = require("./search-monitor"); 55 55 const database_1 = require("./database"); 56 56 const dotenv = __importStar(require("dotenv")); 57 57 dotenv.config(); ··· 63 63 let blipManager; 64 64 let vibeManager; 65 65 let aggregator; 66 - let firehoseMonitor; 66 + let searchMonitor; 67 67 function initializeAgent() { 68 68 return __awaiter(this, void 0, void 0, function* () { 69 69 agent = new agent_1.BlonkAgent(); ··· 73 73 // Start aggregating blips from all users 74 74 aggregator = new firehose_1.BlipAggregator(agent.getAgent()); 75 75 aggregator.startPolling(30000); // Poll every 30 seconds 76 - // Start monitoring Bluesky firehose for #vibe-* hashtags 77 - firehoseMonitor = new typed_firehose_1.TypedFirehoseMonitor(agent.getAgent()); 78 - yield firehoseMonitor.start(); 76 + // Start searching for #vibe-* hashtags on Bluesky 77 + searchMonitor = new search_monitor_1.SearchMonitor(agent.getAgent()); 78 + yield searchMonitor.start(); 79 79 console.log('✅ Connected to AT Protocol'); 80 80 console.log('📡 Starting blip aggregation...'); 81 - console.log('🔥 Monitoring Bluesky firehose for #vibe-* hashtags...'); 81 + console.log('🔍 Searching Bluesky for #vibe-* hashtags every 2 minutes...'); 82 82 }); 83 83 } 84 84 app.get('/api/blips', (req, res) => __awaiter(void 0, void 0, void 0, function* () { ··· 157 157 res.status(500).json({ error: 'Failed to join vibe' }); 158 158 } 159 159 })); 160 - // Manual search trigger (no longer needed with firehose) 160 + // Manual search trigger 161 161 app.post('/api/vibes/search', (req, res) => __awaiter(void 0, void 0, void 0, function* () { 162 - res.json({ 163 - success: true, 164 - message: 'Firehose is monitoring in real-time. Manual search not needed.' 165 - }); 162 + try { 163 + console.log('Manual vibe search triggered...'); 164 + yield searchMonitor.searchForVibeMentions(); 165 + res.json({ success: true, message: 'Search completed' }); 166 + } 167 + catch (error) { 168 + console.error('Error searching for vibes:', error); 169 + res.status(500).json({ error: 'Failed to search for vibes' }); 170 + } 166 171 })); 167 172 app.get('/api/blips/tag/:tag', (req, res) => __awaiter(void 0, void 0, void 0, function* () { 168 173 try {
+372
src/server.test.ts
··· 1 + import { BlonkAgent } from './agent'; 2 + import { BlipManager } from './blips'; 3 + import { VibeManager } from './vibes'; 4 + import { BlipAggregator } from './firehose'; 5 + import { SearchMonitor } from './search-monitor'; 6 + import { blipDb, vibeDb, vibeMentionDb } from './database'; 7 + 8 + // Mock all dependencies 9 + jest.mock('./agent'); 10 + jest.mock('./blips'); 11 + jest.mock('./vibes'); 12 + jest.mock('./firehose'); 13 + jest.mock('./search-monitor'); 14 + jest.mock('./database'); 15 + jest.mock('dotenv', () => ({ 16 + config: jest.fn() 17 + })); 18 + 19 + describe('Blonk Server Unit Tests', () => { 20 + let mockAgent: jest.Mocked<BlonkAgent>; 21 + let mockBlipManager: jest.Mocked<BlipManager>; 22 + let mockVibeManager: jest.Mocked<VibeManager>; 23 + let mockAggregator: jest.Mocked<BlipAggregator>; 24 + let mockSearchMonitor: jest.Mocked<SearchMonitor>; 25 + let mockBlipDb: any; 26 + let mockVibeDb: any; 27 + let mockVibeMentionDb: any; 28 + 29 + beforeEach(() => { 30 + // Clear all mocks 31 + jest.clearAllMocks(); 32 + 33 + // Set up mock instances 34 + mockAgent = { 35 + login: jest.fn().mockResolvedValue(undefined), 36 + getAgent: jest.fn().mockReturnValue({ 37 + session: { did: 'did:plc:test123' }, 38 + com: { 39 + atproto: { 40 + repo: { 41 + createRecord: jest.fn() 42 + } 43 + } 44 + } 45 + }) 46 + } as any; 47 + 48 + mockBlipManager = { 49 + createBlip: jest.fn().mockResolvedValue('at://did:plc:test/app.bsky.feed.post/abc123') 50 + } as any; 51 + 52 + mockVibeManager = { 53 + joinVibe: jest.fn().mockResolvedValue(undefined), 54 + createVibe: jest.fn().mockResolvedValue('at://did:plc:test/vibe/xyz789') 55 + } as any; 56 + 57 + mockAggregator = { 58 + startPolling: jest.fn(), 59 + addUser: jest.fn() 60 + } as any; 61 + 62 + mockSearchMonitor = { 63 + start: jest.fn().mockResolvedValue(undefined), 64 + searchForVibeMentions: jest.fn().mockResolvedValue(undefined) 65 + } as any; 66 + 67 + // Set up database mocks 68 + mockBlipDb = { 69 + getBlips: jest.fn().mockReturnValue([]), 70 + getBlipsByVibe: jest.fn().mockReturnValue([]), 71 + getBlipsByTag: jest.fn().mockReturnValue([]), 72 + addBlip: jest.fn() 73 + }; 74 + 75 + mockVibeDb = { 76 + getVibes: jest.fn().mockReturnValue([]), 77 + addMember: jest.fn(), 78 + getVibe: jest.fn() 79 + }; 80 + 81 + mockVibeMentionDb = { 82 + getEmergingVibes: jest.fn().mockReturnValue([]), 83 + getVibeByName: jest.fn(), 84 + recordMention: jest.fn() 85 + }; 86 + 87 + // Set up mocked constructors 88 + (BlonkAgent as jest.MockedClass<typeof BlonkAgent>).mockImplementation(() => mockAgent); 89 + (BlipManager as jest.MockedClass<typeof BlipManager>).mockImplementation(() => mockBlipManager); 90 + (VibeManager as jest.MockedClass<typeof VibeManager>).mockImplementation(() => mockVibeManager); 91 + (BlipAggregator as jest.MockedClass<typeof BlipAggregator>).mockImplementation(() => mockAggregator); 92 + (SearchMonitor as jest.MockedClass<typeof SearchMonitor>).mockImplementation(() => mockSearchMonitor); 93 + 94 + // Replace database exports with mocks 95 + (blipDb as any) = mockBlipDb; 96 + (vibeDb as any) = mockVibeDb; 97 + (vibeMentionDb as any) = mockVibeMentionDb; 98 + }); 99 + 100 + describe('Component Initialization', () => { 101 + it('should create BlonkAgent instance', () => { 102 + const agent = new BlonkAgent(); 103 + expect(BlonkAgent).toHaveBeenCalled(); 104 + expect(agent).toBe(mockAgent); 105 + }); 106 + 107 + it('should login to BlonkAgent', async () => { 108 + const agent = new BlonkAgent(); 109 + await agent.login(); 110 + expect(mockAgent.login).toHaveBeenCalled(); 111 + }); 112 + 113 + it('should create BlipManager with agent instance', () => { 114 + const agentInstance = mockAgent.getAgent(); 115 + const manager = new BlipManager(agentInstance); 116 + expect(BlipManager).toHaveBeenCalledWith(agentInstance); 117 + expect(manager).toBe(mockBlipManager); 118 + }); 119 + 120 + it('should create VibeManager with agent instance', () => { 121 + const agentInstance = mockAgent.getAgent(); 122 + const manager = new VibeManager(agentInstance); 123 + expect(VibeManager).toHaveBeenCalledWith(agentInstance); 124 + expect(manager).toBe(mockVibeManager); 125 + }); 126 + 127 + it('should create BlipAggregator with agent instance', () => { 128 + const agentInstance = mockAgent.getAgent(); 129 + const aggregator = new BlipAggregator(agentInstance); 130 + expect(BlipAggregator).toHaveBeenCalledWith(agentInstance); 131 + expect(aggregator).toBe(mockAggregator); 132 + }); 133 + 134 + it('should start polling on BlipAggregator', () => { 135 + const aggregator = new BlipAggregator(mockAgent.getAgent()); 136 + aggregator.startPolling(30000); 137 + expect(mockAggregator.startPolling).toHaveBeenCalledWith(30000); 138 + }); 139 + 140 + it('should create SearchMonitor with agent instance', () => { 141 + const agentInstance = mockAgent.getAgent(); 142 + const monitor = new SearchMonitor(agentInstance); 143 + expect(SearchMonitor).toHaveBeenCalledWith(agentInstance); 144 + expect(monitor).toBe(mockSearchMonitor); 145 + }); 146 + 147 + it('should start SearchMonitor', async () => { 148 + const monitor = new SearchMonitor(mockAgent.getAgent()); 149 + await monitor.start(); 150 + expect(mockSearchMonitor.start).toHaveBeenCalled(); 151 + }); 152 + }); 153 + 154 + describe('BlipManager Operations', () => { 155 + it('should create blip with all parameters', async () => { 156 + const title = 'Test Title'; 157 + const body = 'Test Body'; 158 + const url = 'https://example.com'; 159 + const tags = ['tag1', 'tag2']; 160 + const vibe = 'at://vibe/uri'; 161 + 162 + const uri = await mockBlipManager.createBlip(title, body, url, tags, vibe); 163 + 164 + expect(uri).toBe('at://did:plc:test/app.bsky.feed.post/abc123'); 165 + expect(mockBlipManager.createBlip).toHaveBeenCalledWith(title, body, url, tags, vibe); 166 + }); 167 + 168 + it('should handle blip creation errors', async () => { 169 + mockBlipManager.createBlip.mockRejectedValue(new Error('Creation failed')); 170 + 171 + await expect( 172 + mockBlipManager.createBlip('Title', 'Body', 'url', [], undefined) 173 + ).rejects.toThrow('Creation failed'); 174 + }); 175 + }); 176 + 177 + describe('VibeManager Operations', () => { 178 + it('should join vibe successfully', async () => { 179 + const vibeUri = 'at://vibe/uri'; 180 + const cid = 'cid123'; 181 + 182 + await mockVibeManager.joinVibe(vibeUri, cid); 183 + 184 + expect(mockVibeManager.joinVibe).toHaveBeenCalledWith(vibeUri, cid); 185 + }); 186 + 187 + it('should handle join vibe errors', async () => { 188 + mockVibeManager.joinVibe.mockRejectedValue(new Error('Join failed')); 189 + 190 + await expect( 191 + mockVibeManager.joinVibe('at://vibe/uri', 'cid123') 192 + ).rejects.toThrow('Join failed'); 193 + }); 194 + 195 + it('should create vibe successfully', async () => { 196 + const name = 'test_vibe'; 197 + const mood = 'chill'; 198 + const emoji = '🎵'; 199 + const color = '#FF0000'; 200 + 201 + const uri = await mockVibeManager.createVibe(name, mood, emoji, color); 202 + 203 + expect(uri).toBe('at://did:plc:test/vibe/xyz789'); 204 + expect(mockVibeManager.createVibe).toHaveBeenCalledWith(name, mood, emoji, color); 205 + }); 206 + }); 207 + 208 + describe('Database Operations', () => { 209 + describe('BlipDb', () => { 210 + it('should get blips with limit', () => { 211 + const mockBlips = [ 212 + { id: '1', title: 'Blip 1' }, 213 + { id: '2', title: 'Blip 2' } 214 + ]; 215 + mockBlipDb.getBlips.mockReturnValue(mockBlips); 216 + 217 + const result = mockBlipDb.getBlips(50); 218 + 219 + expect(result).toEqual(mockBlips); 220 + expect(mockBlipDb.getBlips).toHaveBeenCalledWith(50); 221 + }); 222 + 223 + it('should get blips by vibe', () => { 224 + const vibeUri = 'at://vibe/uri'; 225 + const mockBlips = [{ id: '1', title: 'Vibe Blip' }]; 226 + mockBlipDb.getBlipsByVibe.mockReturnValue(mockBlips); 227 + 228 + const result = mockBlipDb.getBlipsByVibe(vibeUri); 229 + 230 + expect(result).toEqual(mockBlips); 231 + expect(mockBlipDb.getBlipsByVibe).toHaveBeenCalledWith(vibeUri); 232 + }); 233 + 234 + it('should get blips by tag', () => { 235 + const tag = 'test-tag'; 236 + const mockBlips = [{ id: '1', title: 'Tagged Blip' }]; 237 + mockBlipDb.getBlipsByTag.mockReturnValue(mockBlips); 238 + 239 + const result = mockBlipDb.getBlipsByTag(tag); 240 + 241 + expect(result).toEqual(mockBlips); 242 + expect(mockBlipDb.getBlipsByTag).toHaveBeenCalledWith(tag); 243 + }); 244 + }); 245 + 246 + describe('VibeDb', () => { 247 + it('should get vibes with limit', () => { 248 + const mockVibes = [ 249 + { uri: 'at://vibe1', name: 'Vibe 1' }, 250 + { uri: 'at://vibe2', name: 'Vibe 2' } 251 + ]; 252 + mockVibeDb.getVibes.mockReturnValue(mockVibes); 253 + 254 + const result = mockVibeDb.getVibes(50); 255 + 256 + expect(result).toEqual(mockVibes); 257 + expect(mockVibeDb.getVibes).toHaveBeenCalledWith(50); 258 + }); 259 + 260 + it('should add member to vibe', () => { 261 + const vibeUri = 'at://vibe/uri'; 262 + const memberDid = 'did:plc:member'; 263 + 264 + mockVibeDb.addMember(vibeUri, memberDid); 265 + 266 + expect(mockVibeDb.addMember).toHaveBeenCalledWith(vibeUri, memberDid); 267 + }); 268 + }); 269 + 270 + describe('VibeMentionDb', () => { 271 + it('should get emerging vibes', () => { 272 + const mockEmergingVibes = [ 273 + { hashtag: '#vibe-test', count: 7, uniqueAuthors: 5 }, 274 + { hashtag: '#vibe-demo', count: 5, uniqueAuthors: 5 } 275 + ]; 276 + mockVibeMentionDb.getEmergingVibes.mockReturnValue(mockEmergingVibes); 277 + 278 + const result = mockVibeMentionDb.getEmergingVibes(); 279 + 280 + expect(result).toEqual(mockEmergingVibes); 281 + expect(mockVibeMentionDb.getEmergingVibes).toHaveBeenCalled(); 282 + }); 283 + }); 284 + }); 285 + 286 + describe('BlipAggregator Operations', () => { 287 + it('should add user to aggregation', () => { 288 + const did = 'did:plc:newuser'; 289 + 290 + mockAggregator.addUser(did); 291 + 292 + expect(mockAggregator.addUser).toHaveBeenCalledWith(did); 293 + }); 294 + }); 295 + 296 + describe('SearchMonitor Operations', () => { 297 + it('should search for vibe mentions', async () => { 298 + await mockSearchMonitor.searchForVibeMentions(); 299 + 300 + expect(mockSearchMonitor.searchForVibeMentions).toHaveBeenCalled(); 301 + }); 302 + 303 + it('should handle search errors', async () => { 304 + mockSearchMonitor.searchForVibeMentions.mockRejectedValue(new Error('Search failed')); 305 + 306 + await expect( 307 + mockSearchMonitor.searchForVibeMentions() 308 + ).rejects.toThrow('Search failed'); 309 + }); 310 + }); 311 + 312 + describe('Error Scenarios', () => { 313 + it('should handle database errors gracefully', () => { 314 + mockBlipDb.getBlips.mockImplementation(() => { 315 + throw new Error('Database connection failed'); 316 + }); 317 + 318 + expect(() => mockBlipDb.getBlips(50)).toThrow('Database connection failed'); 319 + }); 320 + 321 + it('should handle missing agent session', () => { 322 + mockAgent.getAgent.mockReturnValue({ 323 + session: null 324 + } as any); 325 + 326 + const agentInstance = mockAgent.getAgent(); 327 + expect(agentInstance.session).toBeNull(); 328 + }); 329 + }); 330 + 331 + describe('Integration Flow', () => { 332 + it('should complete full blip creation flow', async () => { 333 + // Initialize agent 334 + const agent = new BlonkAgent(); 335 + await agent.login(); 336 + 337 + // Create manager 338 + const blipManager = new BlipManager(agent.getAgent()); 339 + 340 + // Create blip 341 + const uri = await blipManager.createBlip( 342 + 'Integration Test', 343 + 'Testing full flow', 344 + 'https://test.com', 345 + ['integration', 'test'], 346 + undefined 347 + ); 348 + 349 + expect(uri).toBe('at://did:plc:test/app.bsky.feed.post/abc123'); 350 + expect(mockAgent.login).toHaveBeenCalled(); 351 + expect(mockBlipManager.createBlip).toHaveBeenCalled(); 352 + }); 353 + 354 + it('should complete full vibe join flow', async () => { 355 + // Initialize agent 356 + const agent = new BlonkAgent(); 357 + await agent.login(); 358 + 359 + // Create manager 360 + const vibeManager = new VibeManager(agent.getAgent()); 361 + 362 + // Join vibe 363 + await vibeManager.joinVibe('at://vibe/uri', 'cid123'); 364 + 365 + // Add member to database 366 + mockVibeDb.addMember('at://vibe/uri', 'did:plc:test123'); 367 + 368 + expect(mockVibeManager.joinVibe).toHaveBeenCalledWith('at://vibe/uri', 'cid123'); 369 + expect(mockVibeDb.addMember).toHaveBeenCalledWith('at://vibe/uri', 'did:plc:test123'); 370 + }); 371 + }); 372 + });
+38
src/test-atproto-sync-firehose.js
··· 1 + "use strict"; 2 + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 + return new (P || (P = Promise))(function (resolve, reject) { 5 + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 + step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 + }); 10 + }; 11 + Object.defineProperty(exports, "__esModule", { value: true }); 12 + const api_1 = require("@atproto/api"); 13 + const firehose_with_atproto_sync_1 = require("./firehose-with-atproto-sync"); 14 + function main() { 15 + return __awaiter(this, void 0, void 0, function* () { 16 + console.log('🚀 Starting AT Protocol Sync Firehose Test...'); 17 + const agent = new api_1.BskyAgent({ 18 + service: 'https://bsky.social' 19 + }); 20 + const monitor = new firehose_with_atproto_sync_1.AtprotoSyncFirehoseMonitor(agent); 21 + // Handle graceful shutdown 22 + process.on('SIGINT', () => __awaiter(this, void 0, void 0, function* () { 23 + console.log('\n⏹️ Shutting down...'); 24 + yield monitor.stop(); 25 + process.exit(0); 26 + })); 27 + process.on('SIGTERM', () => __awaiter(this, void 0, void 0, function* () { 28 + console.log('\n⏹️ Shutting down...'); 29 + yield monitor.stop(); 30 + process.exit(0); 31 + })); 32 + yield monitor.start(); 33 + }); 34 + } 35 + main().catch((error) => { 36 + console.error('Fatal error:', error); 37 + process.exit(1); 38 + });
+50
src/test-skyware-firehose.js
··· 1 + "use strict"; 2 + var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 + return new (P || (P = Promise))(function (resolve, reject) { 5 + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 + step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 + }); 10 + }; 11 + const { FirehoseSubscription } = require('@skyware/firehose'); 12 + function testFirehose() { 13 + return __awaiter(this, void 0, void 0, function* () { 14 + console.log('🔥 Testing Skyware Firehose...'); 15 + const firehose = new FirehoseSubscription({ 16 + service: 'wss://bsky.network', 17 + filter: { 18 + collections: ['app.bsky.feed.post'] 19 + } 20 + }); 21 + let messageCount = 0; 22 + let vibeCount = 0; 23 + firehose.on('commit', (commit) => { 24 + messageCount++; 25 + commit.ops.forEach((op) => { 26 + var _a; 27 + if (op.action === 'create' && ((_a = op.record) === null || _a === void 0 ? void 0 : _a.text)) { 28 + const text = op.record.text; 29 + if (text.toLowerCase().includes('#vibe-')) { 30 + vibeCount++; 31 + console.log(`\n🎯 FOUND #vibe-* POST!`); 32 + console.log(` Author: ${commit.repo}`); 33 + console.log(` Text: ${text}`); 34 + console.log(` Path: ${op.path}`); 35 + } 36 + } 37 + }); 38 + }); 39 + firehose.on('error', (error) => { 40 + console.error('Firehose error:', error); 41 + }); 42 + yield firehose.start(); 43 + console.log('📡 Connected to Skyware Firehose'); 44 + // Log stats every 10 seconds 45 + setInterval(() => { 46 + console.log(`📊 Stats: ${messageCount} messages, ${vibeCount} #vibe-* posts`); 47 + }, 10000); 48 + }); 49 + } 50 + testFirehose().catch(console.error);
+11 -9
src/vibe-monitor.js
··· 13 13 const vibes_1 = require("./vibes"); 14 14 const database_1 = require("./database"); 15 15 const vibe_validation_1 = require("./utils/vibe-validation"); 16 - const VIBE_CREATION_THRESHOLD = 5; // Number of unique users needed to create a vibe 16 + const UNIQUE_MENTION_THRESHOLD = 5; // Number of unique users needed to create a vibe 17 + const TOTAL_MENTION_THRESHOLD = 10; // OR total number of mentions needed 17 18 class VibeMonitor { 18 19 constructor(agent) { 19 20 this.agent = agent; ··· 33 34 console.log(`✅ Vibe "${vibeName}" already exists`); 34 35 return; 35 36 } 36 - // Check if we've hit the threshold 37 - const mentionCount = database_1.vibeMentionDb.getMentionCount(vibeName); 38 - console.log(`📊 Vibe "${vibeName}" has ${mentionCount} unique mentions`); 39 - if (mentionCount >= VIBE_CREATION_THRESHOLD) { 40 - yield this.createVibeFromHashtag(vibeName, mentionCount); 37 + // Check if we've hit either threshold 38 + const uniqueMentionCount = database_1.vibeMentionDb.getMentionCount(vibeName); 39 + const totalMentionCount = database_1.vibeMentionDb.getTotalMentionCount(vibeName); 40 + console.log(`📊 Vibe "${vibeName}" has ${uniqueMentionCount} unique mentions, ${totalMentionCount} total mentions`); 41 + if (uniqueMentionCount >= UNIQUE_MENTION_THRESHOLD || totalMentionCount >= TOTAL_MENTION_THRESHOLD) { 42 + yield this.createVibeFromHashtag(vibeName, uniqueMentionCount, totalMentionCount); 41 43 } 42 44 }); 43 45 } 44 - createVibeFromHashtag(vibeName, mentionCount) { 46 + createVibeFromHashtag(vibeName, uniqueMentions, totalMentions) { 45 47 return __awaiter(this, void 0, void 0, function* () { 46 48 try { 47 - console.log(`🎉 Creating new vibe "${vibeName}" after ${mentionCount} mentions!`); 49 + console.log(`🎉 Creating new vibe "${vibeName}" after ${uniqueMentions} unique mentions (${totalMentions} total)!`); 48 50 // Generate a mood based on the vibe name 49 51 const mood = this.generateMood(vibeName); 50 52 // Create the vibe ··· 60 62 mood, 61 63 emoji: '🌊', 62 64 color: '#7B68EE', 63 - memberCount: mentionCount, 65 + memberCount: uniqueMentions, 64 66 createdAt: new Date().toISOString(), 65 67 }); 66 68 console.log(`✨ Vibe "${vibeName}" created successfully!`);
+1 -1
src/vibe-monitor.ts
··· 15 15 this.vibeManager = new VibeManager(agent); 16 16 } 17 17 18 - async checkPost(text: string, authorDid: string, postUri?: string) { 18 + async checkPost(text: string, authorDid: string, postUri: string) { 19 19 const vibeName = extractVibeFromHashtag(text); 20 20 21 21 if (!vibeName) return;
+5 -1
tsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 3 /* Visit https://aka.ms/tsconfig to read more about this file */ 4 + "rootDir": "./src", 5 + "outDir": "./dist", 4 6 5 7 /* Projects */ 6 8 // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ ··· 109 111 /* Completeness */ 110 112 // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 111 113 "skipLibCheck": true /* Skip type checking all .d.ts files. */ 112 - } 114 + }, 115 + "include": ["src/**/*"], 116 + "exclude": ["node_modules", "client", "dist"] 113 117 }