From 208f557854fa0185c1a8ad217f26dc7f449f6f76 Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 11 Apr 2025 12:34:51 -0600 Subject: [PATCH 01/29] docs: initial commit establishing project goals and plan --- .clinerules | 116 ++++++++++++++++++++++++++++++++++ memory-bank/activeContext.md | 29 +++++++++ memory-bank/productContext.md | 22 +++++++ memory-bank/progress.md | 25 ++++++++ memory-bank/projectbrief.md | 21 ++++++ memory-bank/systemPatterns.md | 29 +++++++++ memory-bank/techContext.md | 30 +++++++++ 7 files changed, 272 insertions(+) create mode 100644 .clinerules create mode 100644 memory-bank/activeContext.md create mode 100644 memory-bank/productContext.md create mode 100644 memory-bank/progress.md create mode 100644 memory-bank/projectbrief.md create mode 100644 memory-bank/systemPatterns.md create mode 100644 memory-bank/techContext.md diff --git a/.clinerules b/.clinerules new file mode 100644 index 0000000..395ad66 --- /dev/null +++ b/.clinerules @@ -0,0 +1,116 @@ +# Cline's Memory Bank + +I am Cline, an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional. + +## Memory Bank Structure + +The Memory Bank consists of core files and optional context files, all in Markdown format. Files build upon each other in a clear hierarchy: + +flowchart TD + PB[projectbrief.md] --> PC[productContext.md] + PB --> SP[systemPatterns.md] + PB --> TC[techContext.md] + + PC --> AC[activeContext.md] + SP --> AC + TC --> AC + + AC --> P[progress.md] + +### Core Files (Required) +1. `projectbrief.md` + - Foundation document that shapes all other files + - Created at project start if it doesn't exist + - Defines core requirements and goals + - Source of truth for project scope + +2. `productContext.md` + - Why this project exists + - Problems it solves + - How it should work + - User experience goals + +3. `activeContext.md` + - Current work focus + - Recent changes + - Next steps + - Active decisions and considerations + - Important patterns and preferences + - Learnings and project insights + +4. `systemPatterns.md` + - System architecture + - Key technical decisions + - Design patterns in use + - Component relationships + - Critical implementation paths + +5. `techContext.md` + - Technologies used + - Development setup + - Technical constraints + - Dependencies + - Tool usage patterns + +6. `progress.md` + - What works + - What's left to build + - Current status + - Known issues + - Evolution of project decisions + +### Additional Context +Create additional files/folders within memory-bank/ when they help organize: +- Complex feature documentation +- Integration specifications +- API documentation +- Testing strategies +- Deployment procedures + +## Core Workflows + +### Plan Mode +flowchart TD + Start[Start] --> ReadFiles[Read Memory Bank] + ReadFiles --> CheckFiles{Files Complete?} + + CheckFiles -->|No| Plan[Create Plan] + Plan --> Document[Document in Chat] + + CheckFiles -->|Yes| Verify[Verify Context] + Verify --> Strategy[Develop Strategy] + Strategy --> Present[Present Approach] + +### Act Mode +flowchart TD + Start[Start] --> Context[Check Memory Bank] + Context --> Update[Update Documentation] + Update --> Execute[Execute Task] + Execute --> Document[Document Changes] + +## Documentation Updates + +Memory Bank updates occur when: +1. Discovering new project patterns +2. After implementing significant changes +3. When user requests with **update memory bank** (MUST review ALL files) +4. When context needs clarification + +flowchart TD + Start[Update Process] + + subgraph Process + P1[Review ALL Files] + P2[Document Current State] + P3[Clarify Next Steps] + P4[Document Insights & Patterns] + + P1 --> P2 --> P3 --> P4 + end + + Start --> Process + +Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state. + +REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy. + diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md new file mode 100644 index 0000000..43f4acd --- /dev/null +++ b/memory-bank/activeContext.md @@ -0,0 +1,29 @@ +# Active Context + +## Current Work Focus +Updating the active context after initializing the memory bank. + +## Recent Changes +- Created projectbrief.md with core project details. +- Created productContext.md outlining the product vision and goals. +- Created systemPatterns.md to define the system architecture and key technical decisions. +- Created techContext.md to document the technologies used and development setup. +- Created progress.md to track the project's status and known issues. + +## Next Steps +- Choose the right API for discovering live music events. +- Determine the best way to integrate with Spotify for user preferences. +- Select a suitable UI framework for the web and mobile app. + +## Active Decisions and Considerations +- Choosing the right API for discovering live music events. +- Determining the best way to integrate with Spotify for user preferences. +- Selecting a suitable UI framework for the web and mobile app. + +## Important Patterns and Preferences +- Following the memory bank structure defined in .clinerules. +- Documenting all decisions and changes in the memory bank. + +## Learnings and Project Insights +- The project requires a strong focus on personalization and user experience. +- Integration with external APIs (music events, Spotify) will be crucial. diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md new file mode 100644 index 0000000..526a0f8 --- /dev/null +++ b/memory-bank/productContext.md @@ -0,0 +1,22 @@ +# Product Context + +## Why This Project Exists +This project aims to provide a platform for music lovers to discover live music events in their area and connect with artists and venues. + +## Problems It Solves +- Difficulty in finding live music events that match user preferences. +- Lack of a centralized platform for discovering local music scenes. +- Limited ability to personalize music event discovery based on user tastes. + +## How It Should Work +The app should allow users to: +- Discover live music events based on location and musical preferences. +- Create a profile with their geographical area and musical tastes. +- Import musical preferences from Spotify. +- Save and share events with friends. + +## User Experience Goals +- Intuitive and easy-to-use interface. +- Personalized event recommendations. +- Seamless integration with Spotify. +- Engaging and visually appealing design. diff --git a/memory-bank/progress.md b/memory-bank/progress.md new file mode 100644 index 0000000..4234cb8 --- /dev/null +++ b/memory-bank/progress.md @@ -0,0 +1,25 @@ +# Progress + +## What Works +- Initialized the memory bank with core files. +- Defined the project scope and goals in projectbrief.md. +- Outlined the product vision and user experience in productContext.md. +- Documented the system architecture and technical decisions in systemPatterns.md. +- Described the technologies used and development setup in techContext.md. + +## What's Left to Build +- Implement the backend services for user authentication, music event discovery, and Spotify integration. +- Develop the UI for the web and mobile app. +- Integrate with third-party APIs for music events and Spotify. +- Deploy the app to Vercel. + +## Current Status +- Memory bank initialized. +- Project setup complete. + +## Known Issues +- None at this time. + +## Evolution of Project Decisions +- The initial plan was to use a microservices architecture, but this may be reevaluated based on the complexity of the project. +- The choice of Supabase for the backend may be revisited if it does not meet the project's needs. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md new file mode 100644 index 0000000..470ea34 --- /dev/null +++ b/memory-bank/projectbrief.md @@ -0,0 +1,21 @@ +# Project Brief + +## Overview +Building a web and mobile app for discovering live music + +## Core Features +- Use a free and public API to discover live music events in a particular geography (zip code or similar) +- Allow a user to login and create a profile that includes their geographical area +- Allow a user to specify their musical preferences (manually) +- Allow a user to specify their musical preferences by importing likes and followed artists from Spotify + +## Target Users +Music lovers + +## Technical Preferences (optional) +- Node.js +- React +- Tailwind CSS +- Supabase for backend +- Vercel for deployment +- Git and Github for SCM diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md new file mode 100644 index 0000000..3776528 --- /dev/null +++ b/memory-bank/systemPatterns.md @@ -0,0 +1,29 @@ +# System Patterns + +## System Architecture +The system will follow a microservices architecture, with separate services for: +- User authentication and profile management +- Music event discovery +- Spotify integration +- UI (web and mobile) + +## Key Technical Decisions +- Using Node.js and React for the UI. +- Using Supabase for the backend database and authentication. +- Using Tailwind CSS for styling. +- Deploying to Vercel for ease of use and scalability. + +## Design Patterns in Use +- Model-View-Controller (MVC) for the UI components. +- Observer pattern for event handling. +- Facade pattern for simplifying interactions with external APIs. + +## Component Relationships +- The UI will interact with the backend services through REST APIs. +- The music event discovery service will use a third-party API to fetch event data. +- The Spotify integration service will use the Spotify API to access user preferences. + +## Critical Implementation Paths +- User registration and login. +- Event search and filtering. +- Spotify preference import. diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md new file mode 100644 index 0000000..018ab7b --- /dev/null +++ b/memory-bank/techContext.md @@ -0,0 +1,30 @@ +# Tech Context + +## Technologies Used +- Node.js: JavaScript runtime environment for the backend services. +- React: JavaScript library for building the user interface. +- Tailwind CSS: CSS framework for styling the UI. +- Supabase: Backend-as-a-service platform for database and authentication. +- Vercel: Platform for deploying and hosting the web and mobile app. +- Git: Version control system for managing the codebase. +- Github: Online platform for hosting Git repositories. + +## Development Setup +- VSCode: Code editor for development. +- npm: Package manager for installing dependencies. +- Node.js: Development environment. + +## Technical Constraints +- Limited budget for third-party APIs and services. +- Need to ensure scalability and performance for a large number of users. +- Need to comply with data privacy regulations. + +## Dependencies +- React Router: For handling navigation in the UI. +- Axios: For making HTTP requests to external APIs. +- Spotify API: For integrating with Spotify. + +## Tool Usage Patterns +- Using Git for version control and collaboration. +- Using npm for managing dependencies. +- Using VSCode for code editing and debugging. From cab4e917de78f07b59bd0e58e78f5b2bc960458f Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 11 Apr 2025 12:51:11 -0600 Subject: [PATCH 02/29] docs: have tentatively selected the ticketmaster API because it seems to be the only really public one out there --- memory-bank/activeContext.md | 10 ++++------ memory-bank/progress.md | 6 ++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 43f4acd..8bb0486 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -11,15 +11,13 @@ Updating the active context after initializing the memory bank. - Created progress.md to track the project's status and known issues. ## Next Steps -- Choose the right API for discovering live music events. +- Validate the data coverage of the Ticketmaster API in the target geographic areas. +- Validate the event types provided by the Ticketmaster API. +- Validate the data accuracy of the Ticketmaster API. +- Validate the API usage and pricing of the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. - Select a suitable UI framework for the web and mobile app. -## Active Decisions and Considerations -- Choosing the right API for discovering live music events. -- Determining the best way to integrate with Spotify for user preferences. -- Selecting a suitable UI framework for the web and mobile app. - ## Important Patterns and Preferences - Following the memory bank structure defined in .clinerules. - Documenting all decisions and changes in the memory bank. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 4234cb8..d571571 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -8,6 +8,10 @@ - Described the technologies used and development setup in techContext.md. ## What's Left to Build +- Validate the data coverage of the Ticketmaster API in the target geographic areas. +- Validate the event types provided by the Ticketmaster API. +- Validate the data accuracy of the Ticketmaster API. +- Validate the API usage and pricing of the Ticketmaster API. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. - Integrate with third-party APIs for music events and Spotify. @@ -16,6 +20,8 @@ ## Current Status - Memory bank initialized. - Project setup complete. +- Ticketmaster API tentatively chosen for music event discovery, pending validation. +- Validation of Ticketmaster API in progress. ## Known Issues - None at this time. From a480988caae495b468edee48548fb067e1fb9fb3 Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 11 Apr 2025 15:08:09 -0600 Subject: [PATCH 03/29] feat: implemented barebones node app to exercise ticketmaster API --- index.ts | 67 +++++++ memory-bank/activeContext.md | 4 + memory-bank/progress.md | 4 +- package-lock.json | 361 +++++++++++++++++++++++++++++++++++ package.json | 25 +++ tsconfig.json | 12 ++ 6 files changed, 472 insertions(+), 1 deletion(-) create mode 100644 index.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..206b429 --- /dev/null +++ b/index.ts @@ -0,0 +1,67 @@ +import axios from 'axios'; +import * as dotenv from 'dotenv'; +dotenv.config(); + +const API_KEY = process.env.API_KEY; // Retrieve API key from environment variable +const CITY = process.env.CITY; // Retrieve city from environment variable +const RADIUS="50"; +const radiusUnit="mi"; + +interface Event { + name: string; + type: string; + dates: { + start: { + localDate: string; + localTime: string; + }; + }; + _embedded?: { + venues?: { name: string }[]; + }; + // Add other properties as needed +} + +interface ApiResponse { + _embedded?: { + events: Event[]; + }; + page: { + totalElements: number; + totalPages: number; + number: number; + size: number; + }; +} + +async function getEvents() { + try { + let allEvents: Event[] = []; + let page = 0; + let totalPages = 1; + const pageSize = 20; + + while (page < totalPages) { + const response = await axios.get( + `https://app.ticketmaster.com/discovery/v2/events.json?apikey=${API_KEY}&city=${CITY}&radius=${RADIUS}&radiusUnit=${radiusUnit}&size=${pageSize}&page=${page}` + ); + + if (response.data._embedded && response.data._embedded.events) { + const events = response.data._embedded.events; + allEvents = allEvents.concat(events); + } + + totalPages = response.data.page.totalPages; + page++; + } + + allEvents.forEach(event => { + const venueName = event._embedded?.venues?.[0]?.name || 'Unknown Venue'; + console.log(`Name: ${event.name}, Date: ${event.dates.start.localDate}, Time: ${event.dates.start.localTime}, Venue: ${venueName}`); + }); + } catch (error) { + console.error(error); + } +} + +getEvents(); diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 8bb0486..c335a4f 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -11,10 +11,13 @@ Updating the active context after initializing the memory bank. - Created progress.md to track the project's status and known issues. ## Next Steps +- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius. - Validate the data coverage of the Ticketmaster API in the target geographic areas. - Validate the event types provided by the Ticketmaster API. - Validate the data accuracy of the Ticketmaster API. - Validate the API usage and pricing of the Ticketmaster API. +- Investigate whether the radius parameter to the Ticketmaster API is being honored. +- Handle 429 rate limit errors from the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. - Select a suitable UI framework for the web and mobile app. @@ -25,3 +28,4 @@ Updating the active context after initializing the memory bank. ## Learnings and Project Insights - The project requires a strong focus on personalization and user experience. - Integration with external APIs (music events, Spotify) will be crucial. +- The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index d571571..bdd8b41 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -22,9 +22,11 @@ - Project setup complete. - Ticketmaster API tentatively chosen for music event discovery, pending validation. - Validation of Ticketmaster API in progress. +- SeatGeek API added to the list of music discovery APIs to explore. ## Known Issues -- None at this time. +- It is unclear whether the radius parameter to the Ticketmaster API is being honored. +- The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. ## Evolution of Project Decisions - The initial plan was to use a microservices architecture, but this may be reevaluated based on the complexity of the project. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0ce9734 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,361 @@ +{ + "name": "musemeter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "musemeter", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.8.4", + "dotenv": "^16.5.0" + }, + "devDependencies": { + "@types/axios": "^0.9.36", + "@types/dotenv": "^6.1.1", + "@types/node": "^22.14.0", + "typescript": "^5.8.3" + } + }, + "node_modules/@types/axios": { + "version": "0.9.36", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.9.36.tgz", + "integrity": "sha512-NLOpedx9o+rxo/X5ChbdiX6mS1atE4WHmEEIcR9NLenRVa5HoVjAvjafwU3FPTqnZEstpoqCaW7fagqSoTDNeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..52bc9d3 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "musemeter", + "version": "1.0.0", + "description": "App to discover live music coming to a geo of interest", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsc", + "run": "node dist/index.js", + "build-and-run": "tsc && node dist/index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/axios": "^0.9.36", + "@types/dotenv": "^6.1.1", + "@types/node": "^22.14.0", + "typescript": "^5.8.3" + }, + "dependencies": { + "axios": "^1.8.4", + "dotenv": "^16.5.0" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5e13ecb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "outDir": "dist" + }, + "include": ["*.ts"] +} From ac679b1ce47372ec5eeb0549e181dab2fe438694 Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 11 Apr 2025 16:59:14 -0600 Subject: [PATCH 04/29] feat: vite + react + tailwind and an express proxy to make authenticated requests to private API's --- .gitignore | 145 +- README.md | 56 +- eslint.config.js | 28 + index.html | 13 + index.ts | 67 - memory-bank/activeContext.md | 8 +- memory-bank/progress.md | 3 + memory-bank/techContext.md | 7 +- package-lock.json | 6383 ++++++++++++++++++++++++++++++++-- package.json | 48 +- public/vite.svg | 1 + server.cjs | 37 + src/App.css | 1 + src/App.tsx | 69 + src/assets/react.svg | 1 + src/index.css | 1 + src/index.ts | 26 + src/main.tsx | 29 + src/vite-env.d.ts | 1 + tsconfig.app.json | 26 + tsconfig.json | 15 +- tsconfig.node.json | 24 + vite.config.ts | 20 + 23 files changed, 6566 insertions(+), 443 deletions(-) create mode 100644 eslint.config.js create mode 100644 index.html delete mode 100644 index.ts create mode 100644 public/vite.svg create mode 100644 server.cjs create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/index.css create mode 100644 src/index.ts create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore index 1170717..4e3f7f8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,133 +4,24 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* lerna-debug.log* -.pnpm-debug.log* -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt +node_modules dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# secrets +.env diff --git a/README.md b/README.md index 9b15902..40ede56 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,54 @@ -# musemeter -App to discover live music coming to a geo of interest +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/index.html b/index.html new file mode 100644 index 0000000..936d812 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Musemeter + + +
+ + + diff --git a/index.ts b/index.ts deleted file mode 100644 index 206b429..0000000 --- a/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import axios from 'axios'; -import * as dotenv from 'dotenv'; -dotenv.config(); - -const API_KEY = process.env.API_KEY; // Retrieve API key from environment variable -const CITY = process.env.CITY; // Retrieve city from environment variable -const RADIUS="50"; -const radiusUnit="mi"; - -interface Event { - name: string; - type: string; - dates: { - start: { - localDate: string; - localTime: string; - }; - }; - _embedded?: { - venues?: { name: string }[]; - }; - // Add other properties as needed -} - -interface ApiResponse { - _embedded?: { - events: Event[]; - }; - page: { - totalElements: number; - totalPages: number; - number: number; - size: number; - }; -} - -async function getEvents() { - try { - let allEvents: Event[] = []; - let page = 0; - let totalPages = 1; - const pageSize = 20; - - while (page < totalPages) { - const response = await axios.get( - `https://app.ticketmaster.com/discovery/v2/events.json?apikey=${API_KEY}&city=${CITY}&radius=${RADIUS}&radiusUnit=${radiusUnit}&size=${pageSize}&page=${page}` - ); - - if (response.data._embedded && response.data._embedded.events) { - const events = response.data._embedded.events; - allEvents = allEvents.concat(events); - } - - totalPages = response.data.page.totalPages; - page++; - } - - allEvents.forEach(event => { - const venueName = event._embedded?.venues?.[0]?.name || 'Unknown Venue'; - console.log(`Name: ${event.name}, Date: ${event.dates.start.localDate}, Time: ${event.dates.start.localTime}, Venue: ${venueName}`); - }); - } catch (error) { - console.error(error); - } -} - -getEvents(); diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index c335a4f..30c2e8f 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,7 +1,9 @@ # Active Context ## Current Work Focus -Updating the active context after initializing the memory bank. +Reading and updating the memory bank. +# Active Context + ## Recent Changes - Created projectbrief.md with core project details. @@ -11,7 +13,7 @@ Updating the active context after initializing the memory bank. - Created progress.md to track the project's status and known issues. ## Next Steps -- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius. +- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React, with a server-side proxy to protect the API key. - Validate the data coverage of the Ticketmaster API in the target geographic areas. - Validate the event types provided by the Ticketmaster API. - Validate the data accuracy of the Ticketmaster API. @@ -24,8 +26,10 @@ Updating the active context after initializing the memory bank. ## Important Patterns and Preferences - Following the memory bank structure defined in .clinerules. - Documenting all decisions and changes in the memory bank. +- Using `npm-run-all` to start both the Vite development server and the proxy server simultaneously. ## Learnings and Project Insights - The project requires a strong focus on personalization and user experience. - Integration with external APIs (music events, Spotify) will be crucial. - The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. +- We can use perplexity to create links for events we are interested in so we don't have to use ticketmaster links. The syntax is `https://www.perplexity.ai/search?q=boulder%20theater ` diff --git a/memory-bank/progress.md b/memory-bank/progress.md index bdd8b41..1dfcdfc 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -23,6 +23,9 @@ - Ticketmaster API tentatively chosen for music event discovery, pending validation. - Validation of Ticketmaster API in progress. - SeatGeek API added to the list of music discovery APIs to explore. +- Migrated the project to Vite with React and TypeScript. +- Implemented a server-side proxy to protect the API key, using `npm-run-all` to start both the Vite development server and the proxy server. +- Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. ## Known Issues - It is unclear whether the radius parameter to the Ticketmaster API is being honored. diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index 018ab7b..b4b37d5 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -23,8 +23,5 @@ - React Router: For handling navigation in the UI. - Axios: For making HTTP requests to external APIs. - Spotify API: For integrating with Spotify. - -## Tool Usage Patterns -- Using Git for version control and collaboration. -- Using npm for managing dependencies. -- Using VSCode for code editing and debugging. +- tailwindcss: CSS framework for styling the UI. +- @tailwindcss/vite: Vite plugin for Tailwind CSS. diff --git a/package-lock.json b/package-lock.json index 0ce9734..7af77f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,345 +1,5977 @@ { "name": "musemeter", - "version": "1.0.0", + "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "musemeter", - "version": "1.0.0", - "license": "ISC", + "version": "0.0.0", "dependencies": { + "@tailwindcss/vite": "^4.1.3", "axios": "^1.8.4", - "dotenv": "^16.5.0" + "cors": "^2.8.5", + "dotenv": "^16.5.0", + "express": "^5.1.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.1.3" }, "devDependencies": { - "@types/axios": "^0.9.36", - "@types/dotenv": "^6.1.1", - "@types/node": "^22.14.0", - "typescript": "^5.8.3" + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "npm-run-all": "^4.1.5", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" } }, - "node_modules/@types/axios": { - "version": "0.9.36", - "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.9.36.tgz", - "integrity": "sha512-NLOpedx9o+rxo/X5ChbdiX6mS1atE4WHmEEIcR9NLenRVa5HoVjAvjafwU3FPTqnZEstpoqCaW7fagqSoTDNeg==", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@types/dotenv": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", - "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/node": { - "version": "22.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "license": "BSD-2-Clause", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://dotenvx.com" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0.0" } }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=4.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/proxy-from-env": { + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", + "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", + "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-x64": "4.1.3", + "@tailwindcss/oxide-freebsd-x64": "4.1.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-x64-musl": "4.1.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", + "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", + "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", + "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", + "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", + "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", + "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", + "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", + "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", + "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", + "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", + "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", + "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", + "tailwindcss": "4.1.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.1.tgz", + "integrity": "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", + "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/type-utils": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", + "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", + "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", + "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", + "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", + "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", + "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", + "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.136", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", + "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", + "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==", "license": "MIT" }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -350,12 +5982,337 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", + "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.29.1", + "@typescript-eslint/parser": "8.29.1", + "@typescript-eslint/utils": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 52bc9d3..e4aa5c5 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,39 @@ { "name": "musemeter", - "version": "1.0.0", - "description": "App to discover live music coming to a geo of interest", - "main": "index.js", + "private": true, + "version": "0.0.0", + "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc", - "run": "node dist/index.js", - "build-and-run": "tsc && node dist/index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@types/axios": "^0.9.36", - "@types/dotenv": "^6.1.1", - "@types/node": "^22.14.0", - "typescript": "^5.8.3" + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "server": "node server.cjs", + "dev:vite": "vite", + "dev:server": "node server.cjs", + "dev": "npm-run-all --parallel --print-label dev:*" }, "dependencies": { + "@tailwindcss/vite": "^4.1.3", "axios": "^1.8.4", - "dotenv": "^16.5.0" + "cors": "^2.8.5", + "dotenv": "^16.5.0", + "express": "^5.1.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.1.3" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "npm-run-all": "^4.1.5", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" } } diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server.cjs b/server.cjs new file mode 100644 index 0000000..29465f2 --- /dev/null +++ b/server.cjs @@ -0,0 +1,37 @@ +const express = require('express'); +const cors = require('cors'); +const axios = require('axios'); +require('dotenv').config(); + +const app = express(); +const port = 3000; + +app.use(cors()); + +const API_KEY = process.env.API_KEY; +const CITY = process.env.CITY; +const RADIUS = process.env.RADIUS || '50'; +const radiusUnit = process.env.RADIUS_UNIT || 'mi'; + +app.get('/api/events', async (req, res) => { + try { + const response = await axios.get( + `https://app.ticketmaster.com/discovery/v2/events.json?apikey=${API_KEY}&city=${CITY}&radius=${RADIUS}&radiusUnit=${radiusUnit}` + ); + res.json(response.data); + } catch (error) { + console.error(error); + res.status(500).json({ error: 'Failed to fetch events' }); + } +}); + +app.listen(port, () => { + const message = ` +================================= +🎵 MuseMeter Server Ready! +📍 Local: http://localhost:${port} +🔑 API Path: /api/events +================================= +`; + console.log(message); +}); diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/src/App.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..e5747fa --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,69 @@ +import React, { useState, useEffect } from 'react'; +import './App.css'; +import axios from 'axios'; +import { Event } from './index'; + +function App() { + const [events, setEvents] = useState([]); + + useEffect(() => { + async function fetchEvents() { + try { + const response = await axios.get<{ _embedded: { events: Event[] } }>('/api/events'); + setEvents(response.data._embedded.events); + } catch (error) { + console.error(error); + } + } + + fetchEvents(); + }, []); + + return ( +
+
+

+ Upcoming Events +

+
+
    + {events.map((event: Event, index: number) => ( +
  • +
    +
    +

    + {event.name} +

    + + {new Date(event.dates.start.localDate).toLocaleDateString('en-US', { + weekday: 'short', + month: 'short', + day: 'numeric' + })} + +
    +
    + + + + + {event._embedded?.venues?.[0]?.name || 'Unknown Venue'} + + {event.dates.start.localTime ? new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }) : 'Time TBA'} +
    +
    +
  • + ))} +
+
+
+
+ ); +} + +export default App; diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..05ca407 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,26 @@ +export interface Event { + name: string; + type: string; + dates: { + start: { + localDate: string; + localTime: string; + }; + }; + _embedded?: { + venues?: { name: string }[]; + }; + // Add other properties as needed +} + +export interface ApiResponse { + _embedded?: { + events: Event[]; + }; + page: { + totalElements: number; + totalPages: number; + number: number; + size: number; + }; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..1e5c505 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,29 @@ +/* +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) +*/ + + +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' +import { getEvents } from './index' + +/* +getEvents().then(events => console.log(events)); +*/ + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json index 5e13ecb..1ffef60 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,7 @@ { - "compilerOptions": { - "target": "es2016", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "outDir": "dist" - }, - "include": ["*.ts"] + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..ee0127d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,20 @@ + +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from 'tailwindcss'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + tailwindcss(), + ], + server: { + proxy: { + '/api': { + target: 'http://localhost:3000', + changeOrigin: true, + } + } + }, +}) From 30655a25e2dbca759e8cbde3aa7969280e6b54ee Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 11 Apr 2025 17:02:23 -0600 Subject: [PATCH 05/29] fix: correct Tailwind CSS configuration in Vite --- vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index ee0127d..1c2cb1c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' -import tailwindcss from 'tailwindcss'; +import tailwindcss from '@tailwindcss/vite'; // https://vitejs.dev/config/ export default defineConfig({ From 123a01822521e0349710dc5d18bc7f165683533f Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 12 Apr 2025 07:34:25 -0600 Subject: [PATCH 06/29] feat(ui): add Perplexity search and calendar links to event view. dark mode ftw. - Add event name links to Perplexity search with venue context - Implement Google Calendar integration with event details - Style UI elements with dark mode support - Add helper functions for URL generation --- memory-bank/activeContext.md | 18 ++++--- memory-bank/progress.md | 10 ++-- memory-bank/projectbrief.md | 1 + memory-bank/techContext.md | 3 +- src/App.css | 1 - src/App.tsx | 92 +++++++++++++++++++++++++++--------- src/{index.ts => events.ts} | 6 +++ src/main.tsx | 19 -------- 8 files changed, 96 insertions(+), 54 deletions(-) delete mode 100644 src/App.css rename src/{index.ts => events.ts} (74%) diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 30c2e8f..110049a 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -11,17 +11,23 @@ Reading and updating the memory bank. - Created systemPatterns.md to define the system architecture and key technical decisions. - Created techContext.md to document the technologies used and development setup. - Created progress.md to track the project's status and known issues. +- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React, with a server-side proxy to protect the API key. +- Added dark mode support to the event view +- Added a google calendar link to allow the user to add an event of interest to their calendar +- Rendered each event name as a link to perplexity search with the event name and venue as search parameters. +- Renamed `src/index.ts` to `src/events.ts` and moved the code related to fetching events to `src/events.ts`. +- Updated the import statement in `src/main.tsx`. +- Removed `src/App.css` and updated `src/App.tsx` to remove the import of `src/App.css`. ## Next Steps -- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React, with a server-side proxy to protect the API key. -- Validate the data coverage of the Ticketmaster API in the target geographic areas. -- Validate the event types provided by the Ticketmaster API. -- Validate the data accuracy of the Ticketmaster API. -- Validate the API usage and pricing of the Ticketmaster API. + +- Add support for handling pagination of the ticketmaster api in events.ts +- Add support for navigating pagination of events in the UI +- Continue to validate the API usage and pricing of the Ticketmaster API. - Investigate whether the radius parameter to the Ticketmaster API is being honored. - Handle 429 rate limit errors from the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. -- Select a suitable UI framework for the web and mobile app. +- Validate Vite+React as UI framework for the web and mobile app. ## Important Patterns and Preferences - Following the memory bank structure defined in .clinerules. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 1dfcdfc..2256c14 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -1,6 +1,8 @@ # Progress ## What Works +- Pulling events for a hardcoded region and radius from ticketmaster API +- Rendering the events in a simple but styled UI - Initialized the memory bank with core files. - Defined the project scope and goals in projectbrief.md. - Outlined the product vision and user experience in productContext.md. @@ -8,9 +10,8 @@ - Described the technologies used and development setup in techContext.md. ## What's Left to Build -- Validate the data coverage of the Ticketmaster API in the target geographic areas. -- Validate the event types provided by the Ticketmaster API. -- Validate the data accuracy of the Ticketmaster API. +- Add support for handling pagination of the ticketmaster api in events.ts +- Add support for navigating pagination of events in the UI - Validate the API usage and pricing of the Ticketmaster API. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. @@ -26,6 +27,9 @@ - Migrated the project to Vite with React and TypeScript. - Implemented a server-side proxy to protect the API key, using `npm-run-all` to start both the Vite development server and the proxy server. - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. +- Renamed `src/index.ts` to `src/events.ts` and moved the code related to fetching events to `src/events.ts`. +- Updated the import statement in `src/main.tsx`. +- Removed `src/App.css` and updated `src/App.tsx` to remove the import of `src/App.css`. ## Known Issues - It is unclear whether the radius parameter to the Ticketmaster API is being honored. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md index 470ea34..4aba05c 100644 --- a/memory-bank/projectbrief.md +++ b/memory-bank/projectbrief.md @@ -14,6 +14,7 @@ Music lovers ## Technical Preferences (optional) - Node.js +- Vite - React - Tailwind CSS - Supabase for backend diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index b4b37d5..244c43a 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -2,6 +2,7 @@ ## Technologies Used - Node.js: JavaScript runtime environment for the backend services. +- Vite: framework for rapid Nodejs development - React: JavaScript library for building the user interface. - Tailwind CSS: CSS framework for styling the UI. - Supabase: Backend-as-a-service platform for database and authentication. @@ -16,8 +17,6 @@ ## Technical Constraints - Limited budget for third-party APIs and services. -- Need to ensure scalability and performance for a large number of users. -- Need to comply with data privacy regulations. ## Dependencies - React Router: For handling navigation in the UI. diff --git a/src/App.css b/src/App.css deleted file mode 100644 index f1d8c73..0000000 --- a/src/App.css +++ /dev/null @@ -1 +0,0 @@ -@import "tailwindcss"; diff --git a/src/App.tsx b/src/App.tsx index e5747fa..734967e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,39 @@ import React, { useState, useEffect } from 'react'; -import './App.css'; import axios from 'axios'; -import { Event } from './index'; +import { Event } from './events'; function App() { const [events, setEvents] = useState([]); + const createPerplexitySearchUrl = (event: Event) => { + const searchQuery = encodeURIComponent( + `${event.name} ${event._embedded?.venues?.[0]?.name || ''}` + ); + return `https://www.perplexity.ai/search?q=${searchQuery}`; + }; + + const createGoogleCalendarUrl = (event: Event) => { + const startDate = new Date(event.dates.start.localDate); + if (event.dates.start.localTime) { + startDate.setHours( + parseInt(event.dates.start.localTime.split(':')[0]), + parseInt(event.dates.start.localTime.split(':')[1]) + ); + } + + const endDate = new Date(startDate.getTime() + (3 * 60 * 60 * 1000)); // Default 3 hour duration + + const params = new URLSearchParams({ + action: 'TEMPLATE', + text: event.name, + dates: `${startDate.toISOString().replace(/[-:]/g, '').split('.')[0]}Z/${endDate.toISOString().replace(/[-:]/g, '').split('.')[0]}Z`, + location: event._embedded?.venues?.[0]?.name || '', + details: `Event details: ${event.url || ''}` + }); + + return `https://calendar.google.com/calendar/render?${params.toString()}`; + }; + useEffect(() => { async function fetchEvents() { try { @@ -20,21 +48,26 @@ function App() { }, []); return ( -
+
-

+

Upcoming Events

-
-
    +
    +
      {events.map((event: Event, index: number) => ( -
    • +
    • -

      + {event.name} -

      - + + {new Date(event.dates.start.localDate).toLocaleDateString('en-US', { weekday: 'short', month: 'short', @@ -42,19 +75,32 @@ function App() { })}
      -
      - - - - - {event._embedded?.venues?.[0]?.name || 'Unknown Venue'} - - {event.dates.start.localTime ? new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { - hour: 'numeric', - minute: '2-digit' - }) : 'Time TBA'} +
      +
      + + + + + {event._embedded?.venues?.[0]?.name || 'Unknown Venue'} + + {event.dates.start.localTime ? new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }) : 'Time TBA'} +
      + + + + + Add to Calendar +
    • diff --git a/src/index.ts b/src/events.ts similarity index 74% rename from src/index.ts rename to src/events.ts index 05ca407..5bc21fd 100644 --- a/src/index.ts +++ b/src/events.ts @@ -24,3 +24,9 @@ export interface ApiResponse { size: number; }; } + +export const getEvents = async () => { + const response = await fetch('/api/events'); + const data = await response.json(); + return data; +}; diff --git a/src/main.tsx b/src/main.tsx index 1e5c505..964aeb4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,26 +1,7 @@ -/* -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' - -createRoot(document.getElementById('root')!).render( - - - , -) -*/ - - import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' -import { getEvents } from './index' - -/* -getEvents().then(events => console.log(events)); -*/ ReactDOM.createRoot(document.getElementById('root')!).render( From d47535fcc031524d71abc66565a5fb80dfc0c47e Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 12 Apr 2025 16:53:38 -0600 Subject: [PATCH 07/29] feat(api): implement proper pagination for events endpoint - Add pagination query parameters handling - Improve error handling - Add response data validation - Return structured pagination metadata - Update API documentation with pagination examples --- build_favicons.sh | 12 +++ index.html | 9 +- memory-bank/activeContext.md | 16 ++- memory-bank/productContext.md | 3 + memory-bank/progress.md | 16 +-- memory-bank/projectbrief.md | 4 +- memory-bank/systemPatterns.md | 126 +++++++++++++++++----- memory-bank/techContext.md | 63 +++++++---- public/favicon/android-chrome-192x192.png | Bin 0 -> 5068 bytes public/favicon/android-chrome-512x512.png | Bin 0 -> 15261 bytes public/favicon/apple-touch-icon.png | Bin 0 -> 4787 bytes public/favicon/favicon-16x16.png | Bin 0 -> 1471 bytes public/favicon/favicon-32x32.png | Bin 0 -> 1655 bytes public/musemeter.jpeg | Bin 0 -> 57887 bytes public/musemeter.png | Bin 0 -> 132731 bytes public/site.webmanifest | 20 ++++ server.cjs | 38 ++++++- src/App.tsx | 47 ++++++-- src/events.ts | 42 +++++++- 19 files changed, 313 insertions(+), 83 deletions(-) create mode 100755 build_favicons.sh create mode 100644 public/favicon/android-chrome-192x192.png create mode 100644 public/favicon/android-chrome-512x512.png create mode 100644 public/favicon/apple-touch-icon.png create mode 100644 public/favicon/favicon-16x16.png create mode 100644 public/favicon/favicon-32x32.png create mode 100644 public/musemeter.jpeg create mode 100644 public/musemeter.png create mode 100644 public/site.webmanifest diff --git a/build_favicons.sh b/build_favicons.sh new file mode 100755 index 0000000..7a605f6 --- /dev/null +++ b/build_favicons.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -ex + +# Create directory for favicon sizes if it doesn't exist +mkdir -p public/favicon + +# Generate different sizes from original +sips -z 16 16 public/musemeter.png --out public/favicon/favicon-16x16.png +sips -z 32 32 public/musemeter.png --out public/favicon/favicon-32x32.png +sips -z 180 180 public/musemeter.png --out public/favicon/apple-touch-icon.png +sips -z 192 192 public/musemeter.png --out public/favicon/android-chrome-192x192.png +sips -z 512 512 public/musemeter.png --out public/favicon/android-chrome-512x512.png \ No newline at end of file diff --git a/index.html b/index.html index 936d812..2be138a 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,13 @@ - + - + + + + - Musemeter + MuseMeter
      diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 110049a..24ddc05 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,7 +1,8 @@ # Active Context ## Current Work Focus -Reading and updating the memory bank. +Adding pagination support to the API and UI. + # Active Context @@ -11,31 +12,28 @@ Reading and updating the memory bank. - Created systemPatterns.md to define the system architecture and key technical decisions. - Created techContext.md to document the technologies used and development setup. - Created progress.md to track the project's status and known issues. -- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React, with a server-side proxy to protect the API key. +- Create a separate Node/Express proxy server to handle authenticated API calls to third party API's (starting with Ticketmaster). This design was chosen to prevent putting API keys in client side code. +- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React. - Added dark mode support to the event view - Added a google calendar link to allow the user to add an event of interest to their calendar - Rendered each event name as a link to perplexity search with the event name and venue as search parameters. -- Renamed `src/index.ts` to `src/events.ts` and moved the code related to fetching events to `src/events.ts`. -- Updated the import statement in `src/main.tsx`. -- Removed `src/App.css` and updated `src/App.tsx` to remove the import of `src/App.css`. ## Next Steps -- Add support for handling pagination of the ticketmaster api in events.ts -- Add support for navigating pagination of events in the UI -- Continue to validate the API usage and pricing of the Ticketmaster API. +- Allow the user to specify which region and radius to search for events in. Presently this is hard coded as an env variable. - Investigate whether the radius parameter to the Ticketmaster API is being honored. - Handle 429 rate limit errors from the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. -- Validate Vite+React as UI framework for the web and mobile app. ## Important Patterns and Preferences - Following the memory bank structure defined in .clinerules. - Documenting all decisions and changes in the memory bank. - Using `npm-run-all` to start both the Vite development server and the proxy server simultaneously. +- Using Tailwind to style HTML output ## Learnings and Project Insights - The project requires a strong focus on personalization and user experience. - Integration with external APIs (music events, Spotify) will be crucial. - The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. - We can use perplexity to create links for events we are interested in so we don't have to use ticketmaster links. The syntax is `https://www.perplexity.ai/search?q=boulder%20theater ` +- Implemented pagination support in `src/events.ts` and the UI. diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md index 526a0f8..740da17 100644 --- a/memory-bank/productContext.md +++ b/memory-bank/productContext.md @@ -5,18 +5,21 @@ This project aims to provide a platform for music lovers to discover live music ## Problems It Solves - Difficulty in finding live music events that match user preferences. +- Bandsintown doesn't seem to work reliably. - Lack of a centralized platform for discovering local music scenes. - Limited ability to personalize music event discovery based on user tastes. ## How It Should Work The app should allow users to: - Discover live music events based on location and musical preferences. +- Create calendar entries and invitations for events of interest - Create a profile with their geographical area and musical tastes. - Import musical preferences from Spotify. - Save and share events with friends. ## User Experience Goals - Intuitive and easy-to-use interface. +- Works well on desktop or mobile. - Personalized event recommendations. - Seamless integration with Spotify. - Engaging and visually appealing design. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 2256c14..f53027c 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -1,8 +1,11 @@ # Progress ## What Works -- Pulling events for a hardcoded region and radius from ticketmaster API -- Rendering the events in a simple but styled UI +- An API proxy server implemented in node/express to prevent API keys from ending up in client side code +- Pulling events for a hardcoded region and radius from ticketmaster API. +- Rendering the events in a simple but styled UI. +- Allowing user to add events of interest to Google Calendar. +- Allowing the user to see more about an event of interest by linking them to a perplexity search. - Initialized the memory bank with core files. - Defined the project scope and goals in projectbrief.md. - Outlined the product vision and user experience in productContext.md. @@ -10,9 +13,7 @@ - Described the technologies used and development setup in techContext.md. ## What's Left to Build -- Add support for handling pagination of the ticketmaster api in events.ts -- Add support for navigating pagination of events in the UI -- Validate the API usage and pricing of the Ticketmaster API. +- Handle 429 rate limiting errors returned by the Ticketmaster API - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. - Integrate with third-party APIs for music events and Spotify. @@ -26,10 +27,9 @@ - SeatGeek API added to the list of music discovery APIs to explore. - Migrated the project to Vite with React and TypeScript. - Implemented a server-side proxy to protect the API key, using `npm-run-all` to start both the Vite development server and the proxy server. +- Determined the pagination parameters and response structure for the Ticketmaster API. +- Implemented pagination support in `src/events.ts`, `server.cjs`, and `src/App.tsx`. - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. -- Renamed `src/index.ts` to `src/events.ts` and moved the code related to fetching events to `src/events.ts`. -- Updated the import statement in `src/main.tsx`. -- Removed `src/App.css` and updated `src/App.tsx` to remove the import of `src/App.css`. ## Known Issues - It is unclear whether the radius parameter to the Ticketmaster API is being honored. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md index 4aba05c..44491ae 100644 --- a/memory-bank/projectbrief.md +++ b/memory-bank/projectbrief.md @@ -1,10 +1,12 @@ # Project Brief ## Overview -Building a web and mobile app for discovering live music +Building a web and mobile app for discovering live music events of interest ## Core Features - Use a free and public API to discover live music events in a particular geography (zip code or similar) +- Allow the user to page through multiple pages of events +- Allow a user to select which geography and radius to show events for - Allow a user to login and create a profile that includes their geographical area - Allow a user to specify their musical preferences (manually) - Allow a user to specify their musical preferences by importing likes and followed artists from Spotify diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md index 3776528..fb6935c 100644 --- a/memory-bank/systemPatterns.md +++ b/memory-bank/systemPatterns.md @@ -1,29 +1,103 @@ # System Patterns ## System Architecture -The system will follow a microservices architecture, with separate services for: -- User authentication and profile management -- Music event discovery -- Spotify integration -- UI (web and mobile) - -## Key Technical Decisions -- Using Node.js and React for the UI. -- Using Supabase for the backend database and authentication. -- Using Tailwind CSS for styling. -- Deploying to Vercel for ease of use and scalability. - -## Design Patterns in Use -- Model-View-Controller (MVC) for the UI components. -- Observer pattern for event handling. -- Facade pattern for simplifying interactions with external APIs. - -## Component Relationships -- The UI will interact with the backend services through REST APIs. -- The music event discovery service will use a third-party API to fetch event data. -- The Spotify integration service will use the Spotify API to access user preferences. - -## Critical Implementation Paths -- User registration and login. -- Event search and filtering. -- Spotify preference import. + +### Frontend Layer +- React application using TypeScript +- Component-based UI architecture +- Client-side routing with React Router +- State management with React Query for server state +- Dark mode support via Tailwind CSS + +### API Layer +- Express proxy server for third-party API calls +- RESTful endpoints for event data +- Rate limiting and caching implementation +- Error handling and logging strategy +- Request validation middleware + +### Integration Layer +- Ticketmaster API integration for event discovery +- Google Calendar API for event scheduling +- Perplexity AI for event context enrichment +- Future Spotify API integration planned + +### Data Layer +- Supabase PostgreSQL for structured data +- Real-time subscriptions for live updates +- Row Level Security for data access control +- Event data caching strategy + +## Technical Decisions & Rationales + +### API Security +- Express proxy server to protect API keys +- CORS configuration for secure client access +- Rate limiting to prevent abuse +- Request validation for data integrity + +### Frontend Architecture +- Vite for fast development and optimal builds +- TypeScript for type safety and better DX +- Tailwind CSS for maintainable styling +- Component-driven development with atomic design + +### State Management +- React Query for server state +- Local state with useState/useReducer +- URL state for shareable routes +- Persistent state in localStorage where needed + +### Testing Strategy +- Unit tests with Jest and React Testing Library +- Integration tests for API endpoints +- E2E tests with Cypress (planned) +- Continuous testing in CI/CD pipeline + +## Design Patterns + +### Frontend Patterns +- Custom hooks for reusable logic +- Render props for component composition +- Container/Presenter pattern for separation of concerns +- Error boundaries for graceful failure handling + +### Backend Patterns +- Repository pattern for data access +- Middleware pattern for request processing +- Strategy pattern for API integrations +- Observer pattern for event handling + +## Component Architecture + +### Core Components +- EventList: Main event display component +- EventCard: Individual event display +- SearchFilters: Event filtering interface +- CalendarIntegration: Google Calendar integration + +### Shared Components +- Button: Reusable button component +- Modal: Popup dialog component +- ErrorBoundary: Error handling wrapper +- LoadingSpinner: Loading state indicator + +## Implementation Roadmap + +### Phase 1 (Current) +- ✅ Basic event discovery with Ticketmaster API +- ✅ Event display with dark mode support +- ✅ Google Calendar integration +- ✅ Perplexity search integration + +### Phase 2 (Next) +- User authentication with Supabase +- Personalized event recommendations +- Event favoriting and saving +- Email notifications for saved events + +### Phase 3 (Future) +- Spotify integration for music preferences +- Social sharing features +- Mobile app development +- Advanced event filtering and search diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index 244c43a..23e9198 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -1,26 +1,51 @@ # Tech Context ## Technologies Used -- Node.js: JavaScript runtime environment for the backend services. -- Vite: framework for rapid Nodejs development -- React: JavaScript library for building the user interface. -- Tailwind CSS: CSS framework for styling the UI. -- Supabase: Backend-as-a-service platform for database and authentication. -- Vercel: Platform for deploying and hosting the web and mobile app. -- Git: Version control system for managing the codebase. -- Github: Online platform for hosting Git repositories. - -## Development Setup -- VSCode: Code editor for development. -- npm: Package manager for installing dependencies. -- Node.js: Development environment. + +### Frontend +- React: Component-based UI library for building interactive web interfaces +- Vite: Modern build tool and dev server offering fast HMR and optimized builds +- Tailwind CSS: Utility-first CSS framework for rapid UI development +- TypeScript: Static typing for improved code reliability and developer experience + +### Backend & Infrastructure +- Node.js: Server-side JavaScript runtime for building scalable network applications +- Express: Minimal and flexible Node.js web application framework +- Supabase: Open source Firebase alternative providing: + - PostgreSQL database + - Authentication with multiple providers + - Real-time subscriptions + - Edge functions +- Vercel: Edge network deployment platform optimized for React applications + +### APIs & Integration +- Ticketmaster API: Primary source for music event discovery and ticket information +- SeatGeek API: Secondary source for event validation and price comparison +- Spotify API: Music artist information and user playlist integration + +#### Ticketmaster API Pagination + +The Ticketmaster Discovery API uses the following structure for pagination: + +- The response includes `_links`, `_embedded`, and `page` objects. +- The `page` object contains information about the current page in the data source. + +### Development Tools +- Git: Distributed version control system for code management +- GitHub: Collaboration platform for code hosting and CI/CD +- VS Code: Primary IDE with extensions for: + - TypeScript + - Tailwind CSS + - ESLint + - Prettier + +### Testing & Quality +- Jest: JavaScript testing framework +- React Testing Library: Component testing utilities +- ESLint: Static code analysis +- Prettier: Code formatting ## Technical Constraints - Limited budget for third-party APIs and services. -## Dependencies -- React Router: For handling navigation in the UI. -- Axios: For making HTTP requests to external APIs. -- Spotify API: For integrating with Spotify. -- tailwindcss: CSS framework for styling the UI. -- @tailwindcss/vite: Vite plugin for Tailwind CSS. + diff --git a/public/favicon/android-chrome-192x192.png b/public/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d87fc1e3d47f0bff5d9ec21096ef10d2186cee GIT binary patch literal 5068 zcmcgwc{tSF+aFuD?6Q`ou?@;tN|rJ97}?j6sL2dQ%*c#=S45#~MfQD7Aw9}gNQ4Ga zSxST~$x>Mo-tUZlJw4B_uJ`@xo$LC}IrsV8%jdq&ea?5Ti7_+LXJZj!0f9hlNCRC9 zV0=V*m}r6TH%*&nz(DV!Wvm4PRb6BKj%EO4u#F$feO0Rn|x0)f5(OJOr0khdHN zG^YEl7 zfZ%?rz|;dvLWBK0-0?(JKXnLILlu})mSGSuRfTk39fC481M3jHuwW%wIaxUff&~l) z!@V%hsusE@ewYK2I>ePk@>GSve0_aoeHCR1UM?_s6%`ejoB~Wi;Rv8{gy@eaq5Y2F ziK4qs{^Lg%OLX$Wd6IAhJecAaeU9KwQinh&fqs5|@bvKf83<4Okrj|1%n$7elb4l) z{muyKNpd<0Tc=2IwsF~-OS+tZ&e*HESf~{vLX=N5xeaGhy8o~?_$A!Nk>%|=Yk`l z-7N{;UQXB(ICrd-zb6*)qX>^lzF8a?sfM5xAD~bVu*c*|$T2_8E3z_~E z#;-)42G*S>;>=H3ntMo-STWl8lCX2(({SJ&^iI>*;>PW$0?Zx|*}vk_#)G(J^7VOlVFhcTv^7ee}ATdEsVE(P7$;CF8`S`PeRLYevkN zEg_xKT6F1hIj>6{<_+pc!LPf5d1)az6oBgw^9Kn~A*RT%QAQSq?4x`fViciGGxuFm zI|SUP38fd?0|4Z>!Pef1@SvArG$VSNdo;h)Ttyv@8i#;2hK@VeGIa}}uQ57@#sKfdw~d-% z?7A!r28S9g9Y-0@O`qeFv8g~k7FZan`S7~R$xjMybNf{7_Ko2g4H=oM+k#!?*yhb^ z#DdC;voBn}e0sA9iYi)DGQ zM{mlT1%wkJQ_WkeBYpY$Dj`$PQrc>U$x_P>%^_ReX^K`dcGZ&?IS{F+u{2TkfSj?= zo#5AZ(H9vxL^ML+aGcxXv$V=m*0PwyoOt(%=X>U7#_xNKJcqfui|WTW%-1DUa(d7> zJR~8<-XDsxZW{kMRP*@*dFT6QvTX&5Yf>U%9S|91zTaNCZU5Icu#7RrzioJ2TZQxW zUY^i%NQo)55%rNNcv*?U~bTuS(4GmE-o%Y|n)-gqFOt!}fFGGOs z>7#vS%knS!Ja6pxGwjzc{ z5~4OaQf_&j8l+OH?ri>k|=%lXd) z$)g^)4N5!I`%D=$1#iD!EtYEbKlaX=SdT66}WJ{{Tu`wWB z$zxiQ&3j(On``D4t}f4_&~U{_RNZslZtXqh@s_o~L)@!RXK>exT@E@JG$y^gZGTXe z6#eZ2xv221j+NWP#qbuzgs8Aywl&384u|zXPmMh+WGx{})VfxF|3xOKw9&r)`NN4( zp|S--_849f;c!@L6D;=6k;I8Fnii0*z6?yJ4=Z3Y*qh8Nq>{h_ zyveN05>=60oHXK*Crk<=!ZsJ%iz6Zikis;~c`u?&gr*OHEmLRyw|Cxqrk&J)@fHTh zs1Ir8neCAUYLcc|leOuai_JUh%RFgmPX>7k;e5dpZOkk3R;3mU&&Zi-`sdhu{Jm2? z3T8}s2W*X~neOz`5yBImNPc1y0URk4o+OpU*1$V7u~`So9UE0Uk3)%98nj3TN(@oX zyl>-NbWJWKh`$Y)tc&+r^L7z#)C7sND(Xas*F>9vj!nvLB` zuOYshrm8= zt&J^?{I%Gd+p2^g%{e2gE1#+6>v+%A{K=JljO_b6>bt*y0-zUPtu$|cJ1k4I1gN9Q|aJ=x^T zW-ZGeG2AUx$THe&sB_~Qj=RhFth4i~m;uv0OlRVBPkNH9Yj2L$B>RhxZe>=7Hf{L6 zB4aP}1Z;hMrDEWf104P3CaD)J&x`PH9$rz&u`Y8P3dZMl4?9SW3#m1!;);dV_P|vNegy$1U0`sjL z8U;ijuEL^h2c_DRSv^V~!?7ajh6`n=D>bM02v_mbaPA|GMDs!5k>lZ@1JyB^eT+us zdORZ0DO`$NI}gJyU79oza~ub=hmqbjG#Q;U=CiDmCAIG@Nxf*LU{fW3lgo_A>21-@ zk)WTzd3mkN%d0v~fXmL=nR!LGYWWj8+p)D%>ictVmE|K+!b*(H27w}_DY}F#KjC)^ z8R*GJMK9Ga|An6tPin2dzQlSiVD+Q_(mSnqsEveamXYkB?^v*H)yiD?9fiKT>@MNP zqh;E*ZQ=I^R7o$2j8*#}2dd+prgM*U$#2honj0*)CU?+!i)d`0QJA}M$pLXeY*abt zk^R6N6LtV8VXRHCdZLy075JGj2aZY2+#fSJgh8-9i;wCXhBUq_iQB3x#_TYCa!JxPAA-{i46v0Kass`E{~n;0O1u zx7m&d`Z=T+Toow^>y4R+c}u!We%#@)0ymq4%ADpuY%0bli-7nZ<6_SfyC!lVHNEQzaiNoML0d1(?a*5yZ)4!>WZU<#2c$a3|3UCq_IK3-y6*OTrI zD;m;cIL=GzbJI{Ej39v`C1M+>Sdm;HN=+q^sRMaxK~S8w8VDyE6P8ghm}L$D|2Nbb zr%Mgzw~LL&_)v&-@;Xx^a7>EbUX4u@*k$$)(%iag6k=_3L#@M|37CD;R86UFY7Qd1 z(M5Lcen{oJ%#6?`{cdFF@@_^k;Z$l9;lHUwxg3=meIGUVWlgGG%s({ScD?+-nDeML zo7nZqy-Tf)?l%>*LI3KL>$-YH=6)nSHCt{PYDT)d;eH2AKDD9{vx;iW?T$-MPe18W zh3YK6EUDBrumGO{YR3iRKLZHi8Pi3rmN7ag_xkIlvr$n%vG6oHm;bZ+UB?V%o jGhF*3^o5_9Z<{06C%*LQ`@Z&zBNAhjkZ-Y(1yW+IAAdBO&Dw!Ji;!)V15EH*oqYl zCY1?;(R$r&)|UYTruL@l4%*r04be?IUJ({r}9_OS+E z@NjS#9{7YqV>raWpb#(|-tX@aM(EnBQ$Rd!XCqTzQ*A9NTTgdBYdcRHd%gg7F9-l8 z6Cee?y4(9&qXXRCJba`AWLb_Oq`-IRF+U6X7{u3Amc>+C53T6wZI2e?6W|kIkt0H* z(K6n44pIh6Du1JcU$QJtzP?^k{QUm@{(Szze4gHp{DP8_lKcWf{6a#!0D{*i(8Jd{ zfY-x^^)Dj-qN8N*W9#kg+j#o<%CfLPjDG$7EvLKJFGe0de`^Kw;}5X* z;uqu-;QuEibuV9A5umSf0HFG}lz^S>v5Y>xcKm+;@CykDNbm{>@d`=)BQ5&?=ijRS zPZB^Q|5gMqCr@8bA1BX$BmJ-8zX%+g_%F?6fZS4w-uBkMp58{Do^En~xq}S}GEi=w&bWw-Icw@%^%chrPd#t*4#655L`CC_cw1 zz5txx*W23J!`@Eb&C%1_+1JV4*;d=$&e>Y#Ps9BiPXCEm|8GP(=JJO)(0obhIS1Ig znJPKE+k5x`_mdM65Rs7K|Hq;KimK@8=IL$dWo>IOC-^tYACLYk^f9AL|DMqwLw}(D z@(aiX?3{h&w5{#z(f(i#(5jxEj&Am7d3727{{`xA3NrjqH2o1>e}(SxQxLmyM8J#w zl?UXA!d!}CVKA{<>PqrP0r0hZglUY*qc4S@V<^$#4;2xaC`3>vtGpPVjp@xdFoooZ z8w}fwG!zv2)TDcPA8rtrgkUk` zztQS9uQdHeD?c52=+0CXwzLEV2S;DUz!2nEObD|1qv4rEW*8iW!KvVKC}6Y*BpMbj zK`4NT8D4iH0ne>WX<1=a2o%7$N@;~8FP<5s1GpUm3@}|P5;mE1*mgeRUQP^#AFmA)vL9Lf?QPmM5#L~fs=EH-&r9k49 zzSpM*;=xFb5jVc=L<(r?0GdDXvAf5QytGVR~nQ zP3{1jT$#$31o}zB88Gv-uoYmlZQzAS8X|;BV*5Po0Khvz^Ez|-;3$Orc z^mh3%oo-a7M=k}%&Oy}znt*uJ2m{8%WIWIC5NHEj!xRPhbPX*LLK7_yBS?llJNMV~ zuiP=FJc;+A*`!3eu)?mv*>PS(5SS6dBl-=sUdcrjeu(A-vVv^MfmlzB*#?@zn`#|v z8?LUf^}v|jJSxb$PUu2`6yVN)y9sf02Q%;o%Ge(Q|7V(fMsWYL zz*s!4Ujx8+|7?^w`G+o3Nn=ow;)3-3EtUlK_W(erV>|=d!6*kt`iCMN@U&kVV)6d4 zNi)bx8jc*0=>bv-#?!MpyUzz^T+8SVWwZe#NN=KW7G-E|OISeI(^RVDKn$oktcpUX z-74UXA}B~IR0bxf>kb9x;R_W($dX%x4^fwM$x0zZ-eB)Qp-qSLPDAssi~Pai6)IP7 z>}?q^R;-nFybT1kLRBJ(-JHek2C79KhaU`tAF3m!1aQOPPKQTU-{8t1bcTqNm&n04 zv|#ZaqYZ3y&~Gkf>^Ypl+ioNTx(j(q1M|NIIKwrqS)o`9UxA!1ls@k`?;Ak=@GylC za+EFLfMuSFB0vhXUL3F-wV2Rx+{giqx7=e+9J>Prn1tUvPQ#7fML8YIMh&3Ox!K)- zutR~%u1t}WK=w>y(er_Ykm0DM{-P!pK3R@_9V}m7NpS4OP+&PS_N^|K&&VVgJZk8P|oFl9j&GR7tR=rPDKq4saU2C%;++icoCXWr%X&A{HxeN zl;B@zD->2FxFE6oE(kJP0V|3vvML}ymYlVN4zuN^5)V0sNF>Y^ru|fn`Iw+8AhWarTHEbTnemqxIf5|{(;l+C$$cEEj526q~6kHVB`Ke65a@i zsR7s`3>dUhLzxrj0}|2F<*5N7NIhQmjtHwi_^|$oB!SKNQ0N7L-P6Ps`{bzfq6ZKN zVTae5a-q#c>uYNk1O8lJ5BI+4W(rsj6{z!;B(pFB4ZUFZT8-_InLswT)Kvd`|2*2!5q%2ro^na-T@;y#yhua`4AK1U zj8{J)l7%BVRGeCn+=%Qhw&(zFoO}zN46+GYoEr(vFH*kaR>W19{97t^$kfze(dX(< zU@+#e`Vv}Jfpm|?C?Y=(@mJq)ieb$@mStsSrPpeQ z^(3)Mwx3Ji2%5q{a!dj-@qVJ#P{iPll=pnMuWQDYpyjSp<~)q=?w^+0-S#TV&;S}3 zJ=02eE6CbV7q_tRk`A^OWu1xg)soIhtGag@b&?QRDcP!cXq!T9^RryoT)d~HVksfQ zofCvhJ!?{t!aJ0e6P#`T>3~?&B(p#*aQl=cSnB5ZN%>nB4u2$yO?D4?D38{AfdqRBULSt3_lmKLdu7g-6^(|sw7D5P z)EmVY4wi38duTdJ&L=BQcQfBz4ci=4Fxy2uz4z7nX4aSIg3_hzjokVg*o$d)`nw>_uXsdjmw;b z!%xjD(~hzT5~<&v9HRWzEIyw4T0?Y0&0!j6In&PHG=H1W+Fb1b`-Ud*v|!$K6$9o0 z77%-oRh0l>K?W_xNl-ziNB)i=+R3i!=&8qwjS!xxyQ`GvhBRu(VR`zNx=N>ptaWFwj~k1%2^TARP5fBes@EnG`De`D(P8pFNrk?Tqy=d!r9_PsJ=lE{ zR!q*N0X8oBHr-^wtCbBN?FZW;F@+gs+>BYb^a;k}_EvqBBW)%J8Wt)PY@(9w$e2@kz!xZJXo+_?Cuo!4qH}#ATsz} z&P|&sZQg|86&gANsMTDHGl=DTEmBSrT2dZ1T<#ha?%_&vs#eQG!^LkjHp7cf2BZai z&krZ@>t4X(ahxUEu$NUAK0(sf0KUM#-$_(UU+7`Rq9 z?$NSVf5-BA;B@0vbGJub-o3nwJ@bUcIcYV5WoABC`P+WvxfPU|m^l~v`n{3ctFXHg z_$i(2`qzk5PThp{>+3>}XPK@qzE;4`Pj^gmKWP*_U(qerx#tqB zvKBo7l>C%BbX&|J$Gu*Cyf8Dzvuy(4Ouai4Gjs#9<&r76cK-JL@1o%9c`$60_hH@LPg?XdtJzKBFvfuU` zGfG&KUT;(+McWEBUm~3Y33yWw2j_>~;ftNP)O zQ?_F@I;KbOfrR0~%TYnmA-gmEu|Cf0HPS^lyP%p9ET&#B&N#{(?Qd-NPnHF4PdK{D z$ro=d^bMbnU+lldXC&^e%C(J5rZg5m>V9ek@ef4pgd%`&-F`)>_F4y8Q zbqftV8W zWRY7eZT4fNy#DOKS?WqJRKT%2rOR))EJro> znKzln(8lF9dgB@Im1M2{TUs`f>{QwY(o}-mMjIc+?xN-^dN~*3cSeO=$9NQ3nQ?|) z6f&v}{P{>+`i+4xq~Cj0;s?t!{7QFO~gvQI)sw z$7~Od&3}1Rtm0Bl<=Gz{1hvT?@qTz3W+1F+SZx!TWGA&BTeB}eunE>cJAgGLrlOjr z_c_@G8AI!}M}pG2wNZf`a00s?F3+H=5{8ej+a1hW2G$*^GG1yX_p5Mml)A338&{V9&i`HL zS}9`EE6@1llkLggL^li5orjCLVQpvJ-$w}e6dpVG$X{EEb;dpg3cLNKBxA3M#u?8b*v4U^k;!J`^PE8_pX`Q2&b>ZMiykZ z-#+gFB^r$G{H|(A+b*fBi0^XYofSXZ6}wNABk@hS<)iLxyYCpUy?wt@UOi@0#6&gx zWFDj!Ij-`}P**9H$P)kF&vR}+dkXJsCh?b^*_jQlo~(bxk+ak$>SJo^vr@rt3pzy{l+bXg`3&$5SM?d|2ElIT1>>(_QPf^b4c+@ znb}P9o_(OY3!O$O?UjJ{TjQ2TFX%m;ZWdpSs9(t_zjs+46ep0*WAbSRJ7xK|lA9mC z*<#ERl9ZO1GG{0H)@3eecnAVAc{Y7CpJLuKkL; zhrujXA6+BWfO*wee3N+qY@jh8Pv)P0I!^WT0~OXgj@_FiNXm)8MZ@Xgw#s8yVGakm_%M$Dwy_@RnJ$$Yzz_A`MNJ%FG*X3IoO$1Jk3T>qtk)U3r`U{8TtGE34v1q}gCf;RQR-$>qHu8-@6rcxnaSMB!*~G(-(mFg`H4 zCp{shUYH{n_}xx>Am{q!Pv>!#l@nF9LmGv>49y7>mg27X4G)G>vZL=~*3{=7c;fS- z(l867>1QS+u(nCEV!F(gr$gpT8)6br_WQpO(-L@)C&;bnmtYKcMN+WU&%bwx zKU&eC#n08qsWwZr{NXU^BAPvRF&oR_=zB7q$oMq;tJk5P1>@kTv|U*AV2X-0YMym2 zXVKa&Iq9qcKG@6>btu%5!+ASa)Et*z->OJeIe~XyO$`rhVf$Es6Q5G=QKwweBA8oU z3jL;DX%<$+IdnoUt^Q$8zwh13MR^ilkl3A=r@Q0FPV8T*aVTV7Iv~noji|M&5cF0# z!&+?WjPoZZ{K|kKey?(6vqV3iuW>GHu`j3Cd>o(Ht$1u|xaP;wU_NWKq3S^!1*RU4 z{FT%h^&1#{aF%PCFXPrA`6+``NjUxJIjP}yHI|Q*18ePa%~^-7*)~56{p2Y;?t)|E zi!%la>8KyOdX^!3e)N*w^IyV__I_?GwivIfX!CQqKW|Z+(I6zy1*=?ZtiBg4ynlI# zK%`evU$wnoYE^;)$vhB(a9EF4o?A#Q?9}0y^MSSf&>4%Ym&eJ2RpbQxwk$dL#GH(! z`-#dVW+F&VI%NQzQ*VGkNA(wQ8O33Xlr%qqx)iq-I3inr9NeTtMtzm_WjE721=TN( z3l6P9Ad48iFcPT^1Uuk9TXl6~G)C1D|NP(!F;MEQB@`L;MS;+dK7GT%7XiL-nud#= zlm$mO(kCQN@>7Igl^@o#7C&QVKb{W7NmK40!_ZMJZHIm6jIBCtjq1eU#`adh{eYF5@4Uex9Tuwz>d@0Z z&mc>n$q7MZunLN}KxG~^$~j3a8%6)|QD3*?^#Rzs2Po#Fp^}Xou%sJb=W)UCJ_tFm z&i`LNmqBIpMVdm@6*!eZ^^rA_{9&v<2~<9k1w4X$)u7T1IUD>wl60to>$vjH51&1e zeTUi`5*fh?E^e$&C^JG70trVLV7bU{O=3ytr#!i7;|bi+4+c~66Uv0plP=U(S*%TK zGE|u(KM5a$-4JAt1JB91RInD9t^j7JFo!-3s&xOs0Pv9n+M#0)f~x8-(zp;%Vd*qD zyU=`$6oJfSh59O=X{8m*0zt)rddqJNP<}man1_O(Y=B2m|H1%P{ypFY143EcfStX| z1yAH5cft#2Y9kmp(Zgum6?V9h3xf64I`Ju8?#Ao~S#O~K9 zXU7lYFp)r-E8y5QGPl0&5osB`CR$p`X7XamVV)+V18kC7_P_V$WF8&vw0pK6)IZKK zJjf=y&gJlm{myHV;`Ib@(bMO)D>^I+& zg*6rzzdRr|%5B*iGe7!3+n$WgQNFIQRVKJ{$GBS3=&|g4p>KCQ&!bLC%OB5Z-DdCk z-!J27-yN-XdyNaH(vgs-VZ7Q&Q8gbyCRZXizQwX)M-{Da2kKcpjbQIp&hC;V>&s22 zP^K{QvD{xQ+Pf0$AVFp8zV|B%ox6<>?9w!CZrEO@@glRQkezBhyFW*uz)M}G@V)5D zAUS*BdS(6O3OFo;f-_r%On4^Y$sfT!N86}q4UB)xif-jKFp1miEnlkEU%z;Z4HB7g z&Am41yu$BR5adHY)>r5u=AN+r?Owql?y$r6U1gAVn$F&E6iG0s0gb309efG%XVo?p z{~Wd=-3I;o68vro>;Ol*r{G$}{5jh1yqREpX8+{Ga-o477__a)?K5M7%ZYG7yvueC`F1|N**+=`Ek!dNB z8pTiM#N4*St?KfyhD&J{GqqA4hST7*S$b=)B>&cJY^fSTN~?@;)jyuMUO;en^r4oQ zonc~bnx*ZYFTdK_yhNkXo?uXZumHz-Z%#2eM!lqSuiou1h-a@n+F7`$RZ66LU*?j> zE0rnh>h6c=qVW%e~JvN%xfMOS981d`dH1Df^C$SehwC@R6-{7@Wr{bs(4c-oRyn8ijI`+w6Jwgme>6>(vfA&Bv)dW<0A^}8XyxVqocVHnrvq=N<@WMt59dJX()H`K-(Oxh9L%VG zCaZ|#wq6GgQ{mk!HGJ%zG+SHd;AH8qM@q6 z{5uo&cP#p4HhgK?fEP>&4Tpo&p>XXrdgGBZ)1$Um6j;6edCm)gTcaj3ZHnTt&DuJK-Yp8^cQa}Q zxyQt9H^9lpRFF6B`e)m-HO0*)GoX@lxW9Pe=xg+a{q2VKwferEOsoZ+sO$agY5yc; zQXEIQWV!!rR@2epp3912RiVyaT?cOJC@F0Jqgmvbc2J&5>LZ=)n;{FOXH@Jsvef#7 zw~PnB@UNn#*zn3o`P5xJhvLpxl}uEgFn*X$S;7T&70M*z^A4*QO(I|o1H^odpt#_X zK-gjtMX#f|Yg6ky!qLR*Gw9g&icN$qt8e4~=pRw60Db_4R2bG}@85Nh7bwfT-f$Gu6z{Pu_-L!T_;u+N{kAOp;@rYW+Q6rIJ+ktY=v~&-0?Rex-S#%cmM@}sH8u6? zy7!u2(7Bqz@uz1kizkQkSSg(6jStgJt~hU$ai+hWZrT{LJjypSg38)VK}!#ku5adF z>_Cn%Nm8zT9jr(TdGOfo+S6=>L9}|Ql$Hv9=ga-FFIPODY>8misMqgLCU_LkUu14J zAAf$;U^1yde2?g=On=nh_x$Qxj9FsHd5){ey?OT}s@KuYwOk!`Q10O1ma$ep)lV5TpAyzA zZ90F!?Kb_uE$SM^S!$cJNa6AO&4at~kAfC7rDKwP)~ICBKK8<|?0uxvup+5sC(ZEmAg)g#V<8*w%&sV1x|=TMI#TZ?+wed{7F%@NZ%OAJ zgHZW2xPsxNWb;}nEuQ2-=7GCw+!5KiY`r7K#tbR(DL3JnkMF#mlNeZr-n_44Q0%#Q zW1d-T!Y(!UXn*n4twSTX#xGZ zy>g^vL8ADqX|TF>K#J*6Fs<*G+%`dfbLX1I6c1DO_|dnIKHie}@U@Mg`_z)NSgBQP zIg&)j4lQnC=^Fj&Q7K%-FqJ!rJ?dGxMa|>y;8?r5z{0=@BK+<(%aXcfbQ{=DxHMmu z&9)KUaStMo^t)5pgur)u{md=?aG0Skr(pTJ@;SW2@w+Wkm7EToBPS{qm#nQAgSu|i zA58lWYlB=LT5jI6T%22_+Ay7RQ+oy!lgBK>LbuY_x#UY-ayU{dOf5083(ru6*MIg} zj>#Fh$H;(MZ)K*KQfZ`vWhu)ZwQpSoVRoF{R;eyy@aIQjwu4wA?Tj4mXA-cr0qw$* zln+egO7g|G(^bc<6v}re843x-Wz#aQFW4r3P$PvJxAdOxjy{&fDQOWD^nVb}{rURr z;a7q#r=BT?QQ_tlQ@@p2wMirVjLY5y9>QxD^$Wu@M)YIxQzA8Xx^?iuC>k$mdE;V5 z(&eVb!_ckK_HnnU?{wDMk>!zDq?r4PWRIKd$4L0U!=6Vu#}|v;U%6`e#P#WPN?$knt8x(id4=>8un4z3HrxaiBCMkr!_Yez`cTZjT48qOkJIN1fKYP zP+dN8(#`e+Mbi3$&buX7j>mq_gQu^)oLIwfsPkj#H(wZP;@iHwRk!53=&|QYUy5bo z@*yBtcL*z7c_I=d7;(P(E2zX*O>M;UA68CrxA4u3pWE?|iKX3Qi}ThUmE7Jc6FrMd zUXL-3zpp$n^N3=2I_BCzFW$uE&`UwG!iNX$55ND!6MZQ(a8$Taw!QB0#4X=T*_k6K z_vS*yre35<@N!&CEL7`|YRTanC~@CKM{ey`ZcjDxfOS$pTG*qDZO&nQtzCso?2g9< zs26)_i%gxyuRXU>QPcleaPskowkECK+s%7p)BP!`Or?bu=N%BXFRL7AOK9>{Beh$n zn7SHuo}qqRAKlBjVuC0lucXw}=Jj^Et;AoSiZ`$~Q_E+gDL{%AbhrP$O=FMWi=>Pz zh%1rgmTk?5tERO+nZ|dCDkx|%+Vo7WNi}LHj~SfPM2fBylt?4I_C&QET`!abt{BrR zk7)Ds2+oC#!@1;LW6fIY4EHBZOJ(EDzZLmR3{3ZjIX>9a$Qsr#bwK5S#u|u$1iWWP}xo?(I#Ikpu zakO~Vp++mztUgeKSb3!e#EX2fh=tyt9TXs!-Qr>b;UAJ|@vbv@r zj67T1zlLi+(KAG`G{VoW4&htve&vFd#z2OWxf@IJdi&GM}Gam5-%!9yiQWIee!(imVtJX)6nJk7v7p4WwROFqqn5Wwx!U))4^Y!l<9my zKNe(1q;h&b`4D%0HQlGJbzw?0$9-Ep7vs=6yH!-bEE)CMNYW^=qadYdh7IkRa!$pL z4V*E5>?T@$^t0dd9Ts_1wB@%`DbC&~%7b&dOI$g{51y zM%L#$wU=IL%IA|{{z7V)R*-&TZFI1lxWcsgjMzDfWT~-xZ?Wg|O_E)@^TtWe8MG+S zCeoaW%Z#HOEqr33&|xQ*l9jH3w&;Gwy>~R+cZ3bScyP{MF}rS9Df#lfS#RcC&M&6* zY~Ld>*oN>Zt1bnp*SYVG+*6x;W~y6GLYHRu$u#ab?EK_R`)al_{?xZ+hs*tnsS1<9Ws80@w9lK|2U?RCZhWq1V1Fh1R-MyCNSH@` zRc8~Svoq4;x|F}*oG70}Fr`MN$63YtO$yz`WlVe`=>5&6*lRvnMqN%+#k0L%_|CQ1 z2zB0-tf_pMWA`jne2I8-AZwwGtw?d{r0l`UNK7d_`{QHJb>SYf^x-a--1LX8%gQ7z zU!M`r7-!T92wH>ACi41F;o2#y2oi@k_X~OVvw6WPb=fmQ|IULfqP~Rkclr_*CF|Lv z#Uaa@mP4!-*|)|wpDY}V)+}AO+~_y^IGPdoNyx&KrKL@?uqD`CaVTTo-1CWXU?S~c zU+I-09Aj3{wyAPcpy*M)(2UN+=Cj*Z$*4+Yztks9fz>cwJXEvln#+nMalvvHds72% z!+x#Y@RFGM8^YE1cuiEpZ^nW?wJ8b}8I-#%6pv}?v*cG^Tn~yck9_8`IA*RpR*=OI z8+XSgP6Tckf89^*wZ(}$cSeh?Hu*-CoYzaoWHu#rWmkA6cPWc=lq9$j7R^{+b>%|g zp89NTP*|U6`P8Va-(a~WZ9!9u$s2PK&+;vz>JUj9bhP8xKHYoR_ZkICsLrE@+;yak zFd(*vdRH)30tgwD*lFg!J4|p>6+HN5j4n{?7Z!U5#tP%7ql5r&YJ=PB;5r_d1}g@kH9)}UkS_j4@X*F0v>27<-B1v^;lDcUuN zDAe`Z>ZEpD3KIis@Y`)=X$Tjz&i>{L3Xt`ogQS1SL;AlbA3*Q)n@++X^k+}d{U-E> zV*jTM{+;}wWH#02L;#G^0lIdvv?PR(t)6joq;~vPSOD?gZiqScxqqG*i9aSRfad0J zflz3-y*x%x3xo5+8U7HI5BJZ6co5P5Kh3ZUDXyVG+>QO%DPYJU;Ee@Yeh z06mSH+uJG+&TByRWGq$@I4fQR8iLCNw;MK(#hRf3FVsWS=MMC7BQ^)3j^L>&Ud*cx zOHhlq6*IgD+em#ZuLiEAy!^bu=wJQy(_k(--NR}@#}x}l2a8wd3spZbEgnGe5A_#7 zFBF1;YR+$fg8u9%=uvM3b@-U6Lno-wT?zFtLAo#?W*m6m z#xg_G07HaRnf_q&nlsB|0<#73C+e%Z8rkVQ=*r-xCUz0_td2JuO5NS^SWmV$TL+WjY{7jPk1OL8eV(10JaEWd|*BdVb*E+j!_x+x=sgm(L&M-Ah>?Z zD2gpJPu_;;ajAp&VSk!(e3df_pni#R8)=I72g;vnfxgvWw7~VsZxex+5pJ;3|7APS zllfa+3GD5;?h`aQTs?g zm**U_osB{lfuUE()hsnBbuN4QJtng@7{7r}-1s4S02W!s=d0dCTUe?bb&WORQHy?0 z$wzL}n9B3hOnUXD#v(V}TYI(N_YZbG;igRF2`v*6rqLR9dc$sHMv;>u3X5l{#q4U- zg;8o~6kk*eJ7+`M&=+@AH$IAlD!%JPT!x|AtdSX)CMSy6?}qM6?%QoTbnwgpDT_3U zf$AnY-i#Cc{l3b5ai#mH4tD91z-(oAwVp?Jj0PtylzQl4?9O(z56hNEKG}Yxs;J29 zeVUO$zCew5N>y?&vGjF$`7kT%;rUCP`R7#v)KHDv&kPi85Df<7J6y8|z203YMO+hd i`g#ZN#3tbp+2J$l&1q&ATkz5#{U2x%x0xkvM0$E{E zNFow2SW=llEWpS_kEJsI$SO)@`DxQDATP$p0X!M3odd}Maa;>U@K!*g32qn#vbPUC z0R$&&0j4*GgoKd2ad@H@SzDZup#|7JsJqJpBh4m$(_ zf%~D|wQLNJZIuIe+Txxhl8+V?8WSM3f)ahlC~IA#`1&8^NEXEiO)P^y9O|>Fx8Q5uUg;D`0+5GSUYMQ&5Ed zs>sxbgi-5Y5&Y~31f0(1c7Q|w>HoP{@NLu4GQ@gdNl2V6 z!QT&sIflhy?1FqSI$Mi?3Q+j54tPu;5k){_h*0!q36W7k0@9%*KO`29LF?l@2!2?S zr#BXbz@V{6`1XbSmrnl+*8c~I(PbMB{ds9wVaXVrgCW)%gC_#pPe(~nMFS4~W$2%! z1_T_z&(;Tt!sx)ZO18QFnaybA`0tIjg|?Oc*cbFIfX0$^5J)rz5(qp4h%tfSfx|%b zP2tf0%Gy$ZL+Ph!+v(aox(qLHc6Hc+UG&#`K!-idD>Djs+hv#<>f4c-ChrBtoOmTt z*P~$0laU2s-*-n^+9qSb_7E8O*uYCG1Qh;e*bGq&uUY-$LpfIckhOc9c0b| zXP66RmS>Hd>W6A=|)Nqxn$9CMY&xn99A!PMc zWMW5RcV1vUM1ctKnFxK*iw&>kF-&KUG7tdsHWTUIQG0v9jvWD~Sx2~WVj(7a{ePJ| znC3%M;l}JLZ_LciSuWIyNwDrR5u%G~(DkDZ00c6ZE+PeKD zV3^XwbS{+~I(h#OL}|z^z`HkgC*Vz?Gg>wNz}+;17>G<*?(6I-IVLRn%y;ZBc-ldH z>1MPh-K2@_{%_24O?2-l{+B>Mmn2q$*K@crX?`%yGGMeBSw|7pcY2i#`HVxKYOL~) z&aDWX?%pk^hU+Su{dgt}VSP%ja8Q%CCgsKrWcC6HW~%s}NMQxfZ|s5~uN&&a){Re^ z!bDbezmM}8Ux>Z_EPK{twEs*>qUXSZk+QOK`6A>=wq4eT<_8AeiZ^J}(!LH>vwQ0X z8{)V`bxu7yx47Sh{2;YI&l8QVojY1SmYK}oS%7&v411BFa9WErY84Qm#+m6<>=o21 zS7PK_<=o)B+!I__h^)E7rMo&4f7q5?WmR`$l{nq~?EJ#$Y}1kHy^oNCGIc&qNRGMN zmk(rQXE(l0fTH%KAL2?5YMNc0r)?~>ST1)FX{1X$+M~Y7k6^-zp(Y0KFW0+VTQ2k0RKT6`_TT-?3P(aS1U}r*GWLd)9QKX z+Txdwzh?`5ZXAso=zV$7gO;LNOBK;RH{N;}r?BvKek5$AFY?qE3A6aTfg9Q3aZ;AN z3himD{3;_C_s)o)%ym&kz)MN9{YG#$QDtpkGbxL^imK)JhBFWAvOR@;F+46rc(&MP zz@^=qi4c74+EIWpj7KD^eXaj& z$+*EhWQ~R=Ekzr8s;svdfxlYlSc(_s!N*A=s#f~1ovsM*#S8iNRbT#C8f|D1U;A=F z_x#cXainRo``PzGnvU~R(&47?Jm0l%yCuxmsT-v%xX9H3s_yXk$hY<0i(GTMiYAjQ zvjZB3(D?zAozu@ZQc6mQEmQ<=LsPOk7r}S1o`;kmp+9%RF~@`2YeQ=#Ut z*;o64huQPUI=#gE)6!VWNSiYu$M*LoTT5;KA+xEF$mRSukmu$J3d`N+q09R(vT-dv z9=d_fEL&UpbpQO6rbrTLyfq8xY1h=yutp2b)+i____jPvvyBr_^&(An7NhDYfuH^N zTaUkpVDTREJit@oeBej`uBR&Gy33Bs)3wSZ%st67KI+UOh zUNK$u3GFm?>P$z8TV;Mv$nxi?JyJ@8k~*&~ zp6rruX%66*Kj_vEdLn#!;>c84O|RO(rF-xX4QfUv(bTN4Ndo@SjpaxYZf21`>~ow- z+yO@WTo;7(TvEGD<>lf(?6TY@r3GL?!RsH)q1v;xdpJN$y|-jfPMDCt<$e7q_%*ko zt2M`2{gc7EV5g)tENw*7=4ME5XWibu?wmg?9luf=4SQn?lWYW>2BO1^j2~JU0X}s>t+H5 zudKyfd6%sIyh;-}y_ob$UP=-csg4`=YVwDC6!8gqDCwB%qMZ_-Atz(y?&Q?(t0z(? zV-=}xF(j=$QZJ=CykigSka1>Mr`oipG*QA1FzjnrR*&V`J*s$cApA8xZa*3R7|S1 zSr^z*jM~{ag%ovb<`Vd>k?Nn?+uL_O7#vX_2cC99ae>^s;#(bF5trw)v(=qRR+ClV zr(~T=x>B?&g6`e(TE&Q|Uc+fJ;W+jg8j;>R*NR+_KT~x9eAp6hU=LV^zra zj+{N7#X`i5lrqyp>a$)t3<$e;*sATq4jQ8+udFR`5 zj@6;ucWHuzO8qR&KF_u5i6e?96_W)j=ibQT0%p3;Py2=lo3UT!xkJWjhw`tP4M#dHg_VZe4D+Lw^5I!Ws9~vVO;dwCb~{`HSAy z_Q_9_39wzPJ2#x<;nkLHx}J$ht{{zdK0aaY92uDG7*Xft;-?ijMW-wrs*=AR&6A&a zF(2LPn6)~bOeol3{^XxHR4_Q7-<(x*O=d7&;Y74{pF=YoSBb zbC>c_$J6gFg+u#f>SUXDRh-RxJOq3uarjtP|(O2HPhMCJr2{zM3*(VhM$LwLUta?4D=M#>5I;F3`F@+v}%3fG$gq z&u%=P8N5VJ((;!H+b{1_yMBB%jHgj{tW31q_II&$7EG`19d$xU@K?VQFQhD|nr+^9 zuRQpD)O+3cyKarO2!VIB!!nz`5A0nHDhqRn>QtUzo~qp=edTa?N_iJnBXpH~2kqV;=vSJWG1{2aViIXEV|p%` z+elKwI@0^iXj?G1tY+m+mj_2Liy2%=t+do#Q?XXH*@!1k7Jn4apze{P5K+|yd+~Z@ zqA%Hej9<7@W3-)T^1gC1)du#2M4Bh6o^1oZ*P6h^gr1ZLskqU>$}uhA9|0w5m+8h@g6JOO3ny*v_T9UZRda^?nkB2Y zZ+HGpN_h8(j~qIPReb4E>yh&k*W&en1I>5%H~%S~SPeMDObhrGjS_o%Fg3iDB`t$K z%=`mpNr7IocS)?l?mdVFZgl~c*GGY*4jeP}h;8!h! zac)zD*@lsr$;Z&&6oJtC=#2G5Mr%^(cH(;CFGMy;tn|j|Wzxe8$iF9Ut;iP0roJ>} zkv^NhCvIVFD#mIE{pKjb^f`wCGN`%zP9=u{a>st#ivNAF0%b+GC4?h5Ji6QMEi5RS zFN=zbp3fZjE^P?$1J7-AvPdiwCdIYQ=1$6X1vWf%J)eKNUFf^&x^E3fyKbn!5-YxF iK3{4nOrSwv1-kPgWv1v%a0~r^Ii^MyhEI;VUic3NUMz?J literal 0 HcmV?d00001 diff --git a/public/favicon/favicon-16x16.png b/public/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0641acdfbd7e9479860ea6f455e35894747009c7 GIT binary patch literal 1471 zcmcgsU1$?Q5Z<)amT099714qo@dvHs_7Y2Nk4tK7v__1yX^<#B^t@Y>waM*yw>8(I zSfr?Z@dp%CMEanDf}(;i6$QmVP!S&#e;)+FKUBnOp^9}ciD|4Y_~gOf&dq!?^Ud7s z_BO9>DtFFs0szWGD}oWWSJxlBpwI{064#Q(hqq8`{tAtkuU&V^8o1X z0bq!!y59iMApr2M4FK^F0MqoN{VftR#851>F&qZfOfCaO4iB&cm$Ef)7X~G4cd*5? z1)8xUn=%uM`y8N{?GD@4SCmIp^c9cDw#U*XaWU{S>E-nM1?LJp5+{`r+197#yzzZ(FljAtaP&bN^;PRY1 z`|`OGl2#V;FXD+2ho1WSdMJ3I*Xw2ox7n#t*>Y><>}-(Vae~NH46IX3G|rAI zZy+7i=W^MJ@=uOuO3x?K%v@EhK4{50^zZ^4%PFK&rH0kJ%wkbGl z;As6wv!sG@#2}7iDkob>hoPY5IEkX2I`Ze5plspueb7+aREUa9sAgTvj0!b%vaSe6PKH%_L1q4j?#WwI2|vHzFYj4hOm1#t>#CL2G$SE#9z;FzY- zu8kx~j8Iy01AgcBO(%QV)o?Bp3`FNoJ=hX(Ugsu1-`)21+pE&b zq2XHt&o3?haH8zY(~kp@;I$nyugy8!JN?A>D-FITI;rbq!}geFMy`G}F*A?xx!l##YQw9!1%BxQGl)AdA?p)}p zIDX*Kx~*?(wq1Ngrgfive|kb};+~f2I~^@$j?WE&7s}@LBXb|#&>X`nzuunMu=DYK b%_2j^vnnH=pM$dk_PrKbwmNurY1@up6$#e2 literal 0 HcmV?d00001 diff --git a/public/favicon/favicon-32x32.png b/public/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..1d34196f353d4f50f26d5f5c73d4166ec03f91d0 GIT binary patch literal 1655 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WSkfJR9T^xl_H+M9WCckkdj$D1 zFjT2AFf_CGK4GQ<#=IWDQi$wiq3C7Jno3LtY6 zlk!VTY?YKi7Qq43ow)^Yi}H%0z5@DBzap_f-%!s$ADbr6f|6ttpnqK}fTluS3A8R5 z?8f4f6n!KG`bGu@7P?$j9M&xHQB7a1cX$ zZUc0;m2**QVo82cNPd2f9V9u}=%b4x0?P);J60~4>6s;oIl=j*MaijdnK`K;l?ADG z&_GBo(}RaYUTS%9a(+r`v3?3fOEFkW2~fFyNl{{EUTTVCPI`V(W=TeFX0mT;N@k)B za=_uRi5O?m$4OvYkemaGFROseiqxD4m(1MMykcPTvokUfr5K}etJ%-f}^L6K87l& z2{!tm+=P_7AXyhI3e3B9T)a&)00t=T6PZ!4!58k&Sw%yGRA~xZR1%p{~ z)|_(-Vk!1KC2+#t|G*U`v8LV$O1Uhmfu9}kNKdXSKfJNEAX@j`hi7MJf7G0ENq=Vh z37vaa)i#N0Y~uVUT41bX?|MhMa@1{)fGq-71Yg6ELGjwbD z^X7Z?5?1H)pKI*q?_QTJaje2d@3hdJ6GHEJnEKdDW9{Yom*s`{x>~Y`ut!SqwO?R# zG?*_CCSu9bbB$$w#FHk~8yo%!d;I5r((jRyxG^_n|0(&v_o5}I{Z@6vw>{ZY-l2c( Q1E@UqboFyt=akR{0Mj%o`~Uy| literal 0 HcmV?d00001 diff --git a/public/musemeter.jpeg b/public/musemeter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ee9f763f8adc9b70fc5ea87e5b363f231e8cd23f GIT binary patch literal 57887 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 a0S2{z#yn;8fCD8fl(1xFVDMY;|0V!_n~8z| literal 0 HcmV?d00001 diff --git a/public/musemeter.png b/public/musemeter.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4e0c590a426fd4a01bb1c49dcfd00803ebe405 GIT binary patch literal 132731 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

      J%@NSTMC+pc!lZAA(YfaWD&;6q$Z(Hildzi}H< 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 literal 0 HcmV?d00001 diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..0225b7a --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "MuseMeter", + "short_name": "MuseMeter", + "icons": [ + { + "src": "/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#4f46e5", + "background_color": "#ffffff", + "display": "standalone", + "start_url": "/" + } \ No newline at end of file diff --git a/server.cjs b/server.cjs index 29465f2..eae8183 100644 --- a/server.cjs +++ b/server.cjs @@ -1,3 +1,6 @@ +// to test this code, run the following command: +// curl "http://localhost:3000/api/events?page=0&size=20" + const express = require('express'); const cors = require('cors'); const axios = require('axios'); @@ -15,12 +18,43 @@ const radiusUnit = process.env.RADIUS_UNIT || 'mi'; app.get('/api/events', async (req, res) => { try { + // Extract pagination parameters from query + const page = parseInt(req.query.page) || 0; + const size = parseInt(req.query.size) || 20; + + // Make request to Ticketmaster API with pagination const response = await axios.get( - `https://app.ticketmaster.com/discovery/v2/events.json?apikey=${API_KEY}&city=${CITY}&radius=${RADIUS}&radiusUnit=${radiusUnit}` + 'https://app.ticketmaster.com/discovery/v2/events.json', + { + params: { + apikey: API_KEY, + city: CITY, + radius: RADIUS, + radiusUnit: radiusUnit, + page: page, + size: size, + sort: 'date,asc' // Optional: sort by date ascending + } + } ); + + // Validate response data + if (!response.data.page) { + throw new Error('Invalid API response: missing pagination data'); + } + res.json(response.data); } catch (error) { - console.error(error); + console.error('API Error:', error.message); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + res.status(500).json({ error: 'Failed to fetch events' }); } }); diff --git a/src/App.tsx b/src/App.tsx index 734967e..0266887 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,12 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; -import { Event } from './events'; +import { Event, getEvents, ApiResponse } from './events'; function App() { const [events, setEvents] = useState([]); + const [currentPage, setCurrentPage] = useState(0); + const [totalPages, setTotalPages] = useState(0); + const pageSize = 20; const createPerplexitySearchUrl = (event: Event) => { const searchQuery = encodeURIComponent( @@ -20,9 +23,9 @@ function App() { parseInt(event.dates.start.localTime.split(':')[1]) ); } - + const endDate = new Date(startDate.getTime() + (3 * 60 * 60 * 1000)); // Default 3 hour duration - + const params = new URLSearchParams({ action: 'TEMPLATE', text: event.name, @@ -37,15 +40,20 @@ function App() { useEffect(() => { async function fetchEvents() { try { - const response = await axios.get<{ _embedded: { events: Event[] } }>('/api/events'); - setEvents(response.data._embedded.events); + const data: ApiResponse = await getEvents(currentPage, pageSize); + setEvents(data._embedded?.events || []); + setTotalPages(data.page.totalPages); } catch (error) { console.error(error); } } fetchEvents(); - }, []); + }, [currentPage, pageSize]); + + const handlePageChange = (newPage: number) => { + setCurrentPage(newPage); + }; return (

    +
    + + + Page {currentPage + 1} of {totalPages} + + +
); diff --git a/src/events.ts b/src/events.ts index 5bc21fd..6afa74b 100644 --- a/src/events.ts +++ b/src/events.ts @@ -10,6 +10,7 @@ export interface Event { _embedded?: { venues?: { name: string }[]; }; + url?: string; // Add other properties as needed } @@ -23,10 +24,41 @@ export interface ApiResponse { number: number; size: number; }; + _links?: { + self: { href: string }; + first?: { href: string }; + last?: { href: string }; + next?: { href: string }; + prev?: { href: string }; + }; +} + +export const getEvents = async (page: number = 0, size: number = 20): Promise => { + try { + const response = await fetch(`/api/events?page=${page}&size=${size}`); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data: ApiResponse = await response.json(); + + // Validate pagination data + if (!data.page) { + throw new Error('Invalid API response: missing pagination data'); + } + + return data; + } catch (error) { + console.error('Failed to fetch events:', error); + throw error; + } } -export const getEvents = async () => { - const response = await fetch('/api/events'); - const data = await response.json(); - return data; -}; +export const hasNextPage = (response: ApiResponse): boolean => { + return !!response._links?.next; +} + +export const hasPreviousPage = (response: ApiResponse): boolean => { + return !!response._links?.prev; +} From e31585315367e745f3d6998bfdcf5a8afc0d5844 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 12 Apr 2025 21:33:13 -0600 Subject: [PATCH 08/29] feat(search): add city and state search functionality [wip] - TODO: input validation. also likely don't need state. city should be sufficient. - Add city/state search inputs and search button to UI - Update server to accept city and state query parameters - Modify API calls to include search parameters - Update documentation to reflect new search capability - Add smooth scroll to top on pagination --- memory-bank/activeContext.md | 1 + memory-bank/progress.md | 1 + server.cjs | 16 +++++++---- src/App.tsx | 54 +++++++++++++++++++++++++++++------- src/events.ts | 11 ++++++-- 5 files changed, 66 insertions(+), 17 deletions(-) diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 24ddc05..164f6fc 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -21,6 +21,7 @@ Adding pagination support to the API and UI. ## Next Steps - Allow the user to specify which region and radius to search for events in. Presently this is hard coded as an env variable. +- Implemented first stab at city and state search functionality. (work in progress) - Investigate whether the radius parameter to the Ticketmaster API is being honored. - Handle 429 rate limit errors from the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index f53027c..fbdb394 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -29,6 +29,7 @@ - Implemented a server-side proxy to protect the API key, using `npm-run-all` to start both the Vite development server and the proxy server. - Determined the pagination parameters and response structure for the Ticketmaster API. - Implemented pagination support in `src/events.ts`, `server.cjs`, and `src/App.tsx`. +- Implemented city and state search functionality in `src/App.tsx` and `server.cjs`. (work in progress) - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. ## Known Issues diff --git a/server.cjs b/server.cjs index eae8183..fdd046e 100644 --- a/server.cjs +++ b/server.cjs @@ -12,25 +12,31 @@ const port = 3000; app.use(cors()); const API_KEY = process.env.API_KEY; -const CITY = process.env.CITY; +// const CITY = process.env.CITY; const RADIUS = process.env.RADIUS || '50'; -const radiusUnit = process.env.RADIUS_UNIT || 'mi'; +const RADIUSUNIT = process.env.RADIUS_UNIT || 'miles'; // or 'km' +// log the radius to console +console.log(`Radius: ${RADIUS}`); app.get('/api/events', async (req, res) => { try { - // Extract pagination parameters from query + // Extract pagination parameters and city and state from query const page = parseInt(req.query.page) || 0; const size = parseInt(req.query.size) || 20; + const city = req.query.city; + const state = req.query.state; // Make request to Ticketmaster API with pagination + // ref: https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/#overview const response = await axios.get( 'https://app.ticketmaster.com/discovery/v2/events.json', { params: { apikey: API_KEY, - city: CITY, + city: city, + stateCode: state, radius: RADIUS, - radiusUnit: radiusUnit, + unit: RADIUSUNIT, page: page, size: size, sort: 'date,asc' // Optional: sort by date ascending diff --git a/src/App.tsx b/src/App.tsx index 0266887..488e99f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,8 @@ function App() { const [currentPage, setCurrentPage] = useState(0); const [totalPages, setTotalPages] = useState(0); const pageSize = 20; + const [city, setCity] = useState(''); + const [state, setState] = useState(''); const createPerplexitySearchUrl = (event: Event) => { const searchQuery = encodeURIComponent( @@ -37,22 +39,32 @@ function App() { return `https://calendar.google.com/calendar/render?${params.toString()}`; }; - useEffect(() => { - async function fetchEvents() { - try { - const data: ApiResponse = await getEvents(currentPage, pageSize); - setEvents(data._embedded?.events || []); - setTotalPages(data.page.totalPages); - } catch (error) { - console.error(error); - } + async function fetchEvents() { + try { + const data: ApiResponse = await getEvents(currentPage, pageSize, city, state); + setEvents(data._embedded?.events || []); + setTotalPages(data.page.totalPages); + } catch (error) { + console.error(error); } + } + useEffect(() => { fetchEvents(); - }, [currentPage, pageSize]); + }, [currentPage, pageSize, city, state]); const handlePageChange = (newPage: number) => { setCurrentPage(newPage); + // Scroll to top of events list + window.scrollTo({ + top: 0, + behavior: 'smooth' + }); + }; + + const handleSearch = () => { + setCurrentPage(0); + fetchEvents(); }; return ( @@ -61,6 +73,28 @@ function App() {

Upcoming Events

+
+ setCity(e.target.value)} + className="px-4 py-2 mr-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600 dark:focus:ring-indigo-400" + /> + setState(e.target.value)} + className="px-4 py-2 mr-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600 dark:focus:ring-indigo-400" + /> + +
    {events.map((event: Event, index: number) => ( diff --git a/src/events.ts b/src/events.ts index 6afa74b..bbfd5ec 100644 --- a/src/events.ts +++ b/src/events.ts @@ -33,9 +33,16 @@ export interface ApiResponse { }; } -export const getEvents = async (page: number = 0, size: number = 20): Promise => { +export const getEvents = async (page: number = 0, size: number = 20, city: string = '', state: string = ''): Promise => { try { - const response = await fetch(`/api/events?page=${page}&size=${size}`); + let url = `/api/events?page=${page}&size=${size}`; + if (city) { + url += `&city=${city}`; + } + if (state) { + url += `&state=${state}`; + } + const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); From a928d085b39baa10fb0cf88c97dd31defee4ac62 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 12 Apr 2025 21:38:03 -0600 Subject: [PATCH 09/29] docs: update README --- README.md | 59 +++++++++---------------------------------------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 40ede56..950e688 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,13 @@ -# React + TypeScript + Vite +# MuseMeter -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +MuseMeter Logo -Currently, two official plugins are available: +Because if the question is "live music" the answer is always "yes" :) -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh +[Project Brief](memory-bank/projectbrief.md) +[Product Context](memory-bank/productContext.md) +[Tech Context](memory-bank/techContext.md) +[System Patterns](memory-bank/systemPatterns.md) +[Active Context](memory-bank/activeContext.md) +[Progress](memory-bank/progress.md) -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default tseslint.config({ - extends: [ - // Remove ...tseslint.configs.recommended and replace with this - ...tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - ...tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - ...tseslint.configs.stylisticTypeChecked, - ], - languageOptions: { - // other options... - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - }, -}) -``` - -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default tseslint.config({ - plugins: { - // Add the react-x and react-dom plugins - 'react-x': reactX, - 'react-dom': reactDom, - }, - rules: { - // other rules... - // Enable its recommended typescript rules - ...reactX.configs['recommended-typescript'].rules, - ...reactDom.configs.recommended.rules, - }, -}) -``` From 9107cb92637bd09331e9bc1ebf36683e7d9e51bf Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 12 Apr 2025 21:40:59 -0600 Subject: [PATCH 10/29] docs: beautify --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 950e688..c848858 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,73 @@ +
    + # MuseMeter MuseMeter Logo -Because if the question is "live music" the answer is always "yes" :) +> Because if the question is "live music" the answer is always "yes" :) + +[![TypeScript](https://img.shields.io/badge/TypeScript-4.9-blue.svg)](https://www.typescriptlang.org/) +[![React](https://img.shields.io/badge/React-19.0-blue.svg)](https://reactjs.org/) +[![Vite](https://img.shields.io/badge/Vite-6.2-646CFF.svg)](https://vitejs.dev/) +[![Tailwind](https://img.shields.io/badge/Tailwind-4.1-38B2AC.svg)](https://tailwindcss.com/) + +
    + +## 📖 Documentation + +- 📋 [Project Brief](memory-bank/projectbrief.md) + > Project overview, goals, and scope + +- 🎯 [Product Context](memory-bank/productContext.md) + > User experience and feature roadmap + +- 💻 [Tech Context](memory-bank/techContext.md) + > Technology stack and architecture decisions + +- 🏗️ [System Patterns](memory-bank/systemPatterns.md) + > Design patterns and implementation details + +- 📊 [Active Context](memory-bank/activeContext.md) + > Current development status and priorities + +- 📈 [Progress](memory-bank/progress.md) + > Development timeline and milestones + +## 🚀 Getting Started + +```bash +# Clone the repository +git clone https://github.com/yourusername/musemeter.git + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## ✨ Features + +- 🎵 Discover live music events in your area +- 📅 Add events to your Google Calendar +- 🔍 Search by city and state +- 🌙 Dark mode support +- 🎨 Modern UI with Tailwind CSS + +## 🧪 Development + +```bash +# Run tests +npm test + +# Lint code +npm run lint + +# Build for production +npm run build +``` + +## 📝 License -[Project Brief](memory-bank/projectbrief.md) -[Product Context](memory-bank/productContext.md) -[Tech Context](memory-bank/techContext.md) -[System Patterns](memory-bank/systemPatterns.md) -[Active Context](memory-bank/activeContext.md) -[Progress](memory-bank/progress.md) +[MIT](LICENSE) © 2025 MuseMeter From c8ea84a034325b18179265cb1e4e0a77192dad99 Mon Sep 17 00:00:00 2001 From: DC Date: Sun, 13 Apr 2025 06:34:57 -0600 Subject: [PATCH 11/29] docs: add Ticketmaster API documentation and rename server - Add ticketmaster_api.md with endpoint docs and examples - Rename server.cjs to api_proxy.cjs for clarity - Update package.json scripts to use new filename - Update documentation with latest progress and features - Update GitHub repo URL in README.md --- .clinerules | 4 +- README.md | 2 +- server.cjs => api_proxy.cjs | 0 memory-bank/progress.md | 19 ++++-- memory-bank/projectbrief.md | 11 ++-- memory-bank/ticketmaster_api.md | 109 ++++++++++++++++++++++++++++++++ package.json | 4 +- 7 files changed, 134 insertions(+), 15 deletions(-) rename server.cjs => api_proxy.cjs (100%) create mode 100644 memory-bank/ticketmaster_api.md diff --git a/.clinerules b/.clinerules index 395ad66..ac40668 100644 --- a/.clinerules +++ b/.clinerules @@ -59,6 +59,9 @@ flowchart TD - Known issues - Evolution of project decisions +7. `ticketmaster_api.md` + - Documentation for the Ticketmaster API + ### Additional Context Create additional files/folders within memory-bank/ when they help organize: - Complex feature documentation @@ -113,4 +116,3 @@ flowchart TD Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state. REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy. - diff --git a/README.md b/README.md index c848858..87e17d9 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ ```bash # Clone the repository -git clone https://github.com/yourusername/musemeter.git +git clone https://github.com/alchemydc/musemeter.git # Install dependencies npm install diff --git a/server.cjs b/api_proxy.cjs similarity index 100% rename from server.cjs rename to api_proxy.cjs diff --git a/memory-bank/progress.md b/memory-bank/progress.md index fbdb394..ae73af7 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -1,11 +1,13 @@ # Progress ## What Works +- Handle 429 rate limiting errors returned by the Ticketmaster API. +- Allowing the user to search for events in a particular City and State. Note this is US centric and thus needs to be reworked. - An API proxy server implemented in node/express to prevent API keys from ending up in client side code - Pulling events for a hardcoded region and radius from ticketmaster API. - Rendering the events in a simple but styled UI. - Allowing user to add events of interest to Google Calendar. -- Allowing the user to see more about an event of interest by linking them to a perplexity search. +- Allowing the user to see more about an event of interest by linking them to a perplexity search. This likely need to be reworked to use a different Ticketmaster API endpoint to show more detailed information about a specific event. - Initialized the memory bank with core files. - Defined the project scope and goals in projectbrief.md. - Outlined the product vision and user experience in productContext.md. @@ -13,7 +15,9 @@ - Described the technologies used and development setup in techContext.md. ## What's Left to Build -- Handle 429 rate limiting errors returned by the Ticketmaster API +- Add docs for the Ticketmaster API into the memory bank. +- Rework the search functionality to be less US-centric. +- Use the Ticketmaster API to provide more information about specific events of interest. The user should be able to click into an event of interest to see more detail. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. - Integrate with third-party APIs for music events and Spotify. @@ -22,20 +26,23 @@ ## Current Status - Memory bank initialized. - Project setup complete. -- Ticketmaster API tentatively chosen for music event discovery, pending validation. +- Ticketmaster API chosen for music event discovery. - Validation of Ticketmaster API in progress. - SeatGeek API added to the list of music discovery APIs to explore. - Migrated the project to Vite with React and TypeScript. - Implemented a server-side proxy to protect the API key, using `npm-run-all` to start both the Vite development server and the proxy server. - Determined the pagination parameters and response structure for the Ticketmaster API. -- Implemented pagination support in `src/events.ts`, `server.cjs`, and `src/App.tsx`. -- Implemented city and state search functionality in `src/App.tsx` and `server.cjs`. (work in progress) +- Implemented pagination support in `src/events.ts`, `api_proxy.cjs`, and `src/App.tsx`. +- Implemented city and state search functionality in `src/App.tsx` and `api_proxy.cjs`. (work in progress) - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. +- Search sort of works + ## Known Issues - It is unclear whether the radius parameter to the Ticketmaster API is being honored. -- The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. +- The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. We are now handling this in code. ## Evolution of Project Decisions - The initial plan was to use a microservices architecture, but this may be reevaluated based on the complexity of the project. - The choice of Supabase for the backend may be revisited if it does not meet the project's needs. +- Not thrilled about the Ticketmaster API but it seems to be one of the few free and relatively open options available. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md index 44491ae..c0cef19 100644 --- a/memory-bank/projectbrief.md +++ b/memory-bank/projectbrief.md @@ -4,11 +4,12 @@ Building a web and mobile app for discovering live music events of interest ## Core Features -- Use a free and public API to discover live music events in a particular geography (zip code or similar) -- Allow the user to page through multiple pages of events -- Allow a user to select which geography and radius to show events for -- Allow a user to login and create a profile that includes their geographical area -- Allow a user to specify their musical preferences (manually) +- Use a free and public API to discover live music events in a particular city +- Allow the user to scroll through multiple pages of events +- Allow a user to select which city to show events for +- Allow the user to create calendar entries for events of interest +- Allow the user to listen to music from artists that are coming to town via Spotify +- Allow a user to login and create a profile that includes their geographical area and musical preferences - Allow a user to specify their musical preferences by importing likes and followed artists from Spotify ## Target Users diff --git a/memory-bank/ticketmaster_api.md b/memory-bank/ticketmaster_api.md new file mode 100644 index 0000000..8e52db4 --- /dev/null +++ b/memory-bank/ticketmaster_api.md @@ -0,0 +1,109 @@ +# Ticketmaster API Documentation + +## Overview + +The official documentation for the Ticketmaster API can be found here: https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/ + +## Authentication + +The Ticketmaster API uses API keys for authentication. You will need to obtain an API key from the Ticketmaster Developer Portal in order to use the API. + +API keys should be passed as a query parameter named `apikey` in each request. For example: + +`https://app.ticketmaster.com/discovery/v2/events.json?apikey=YOUR_API_KEY` + +## API Endpoints + +### Event Discovery API + +The Event Discovery API allows you to search for events based on various criteria, such as keyword, city, state, and date. + +The base URL for the Event Discovery API is: + +`https://app.ticketmaster.com/discovery/v2/events.json` + +The following parameters can be used to filter the results: + +* `apikey`: Your API key. +* `keyword`: A keyword to search for. +* `city`: The city to search in. +* `stateCode`: The state to search in. +* `countryCode`: The country to search in. +* `startDateTime`: The start date and time to search for. +* `endDateTime`: The end date and time to search for. +* `radius`: The radius to search within. +* `unit`: The unit of the radius (miles or km). +* `page`: The page number to retrieve. +* `size`: The number of results to return per page. + +### Event Details API + +The Event Details API allows you to retrieve detailed information about a specific event. + +The base URL for the Event Details API is: + +`https://app.ticketmaster.com/discovery/v2/events/{eventId}.json` + +Where `{eventId}` is the ID of the event you want to retrieve. + +The following parameters can be used to filter the results: + +* `apikey`: Your API key. + +## Data Models + +The Event Discovery API and Event Details API return different data models. + +The Event Discovery API returns a list of events, with each event containing the following information: + +* `name`: The name of the event. +* `id`: The ID of the event. +* `url`: The URL of the event. +* `dates`: The dates and times of the event. +* `_embedded`: Embedded resources, such as venues and attractions. + +The Event Details API returns detailed information about a specific event, including all of the information listed above, as well as the following information: + +* `description`: A description of the event. +* `images`: Images of the event. +* `priceRanges`: The price ranges for the event. +* `seatmap`: A seatmap of the event. + +## Pagination + +The Ticketmaster API uses pagination to return large sets of data. The `page` and `size` parameters can be used to control the pagination. + +The `page` parameter specifies the page number to retrieve. The default value is 0. + +The `size` parameter specifies the number of results to return per page. The default value is 20. The maximum value is 200. + +The response includes `_links`, `_embedded`, and `page` objects. +- The `page` object contains information about the current page in the data source. + +## Rate Limits + +The Ticketmaster API has rate limits to prevent abuse and ensure fair usage. The specific rate limits vary depending on the API endpoint and the API key. + +If you exceed the rate limits, you will receive a 429 Too Many Requests error. You should handle this error gracefully and retry the request after a short delay. + +The current code handles 429 rate limiting errors. + +## Examples + +### Example 1: Search for events in Denver + +`https://app.ticketmaster.com/discovery/v2/events.json?apikey=YOUR_API_KEY&city=Denver` + +This will return a list of events in Denver. + +### Example 2: Search for events in Denver with the keyword "music" + +`https://app.ticketmaster.com/discovery/v2/events.json?apikey=YOUR_API_KEY&city=Denver&keyword=music` + +This will return a list of events in Denver with the keyword "music". + +### Example 3: Get details for a specific event + +`https://app.ticketmaster.com/discovery/v2/events/{eventId}.json?apikey=YOUR_API_KEY` + +Replace `{eventId}` with the ID of the event you want to retrieve. diff --git a/package.json b/package.json index e4aa5c5..4076455 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "server": "node server.cjs", + "server": "node api_proxy.cjs", "dev:vite": "vite", - "dev:server": "node server.cjs", + "dev:server": "node api_proxy.cjs", "dev": "npm-run-all --parallel --print-label dev:*" }, "dependencies": { From 465c6b1e819b406014ec03880dc2f9fe8e18f787 Mon Sep 17 00:00:00 2001 From: DC Date: Sun, 13 Apr 2025 08:04:32 -0600 Subject: [PATCH 12/29] feat(events): add event details view - Add EventDetails component for displaying event information - Add endpoint in api_proxy.cjs for fetching single event details - Update App.tsx to show event details on click - Add development mode logging - Remove Perplexity search integration - Update documentation to reflect new event details feature --- api_proxy.cjs | 67 ++++++++++++++++++++- memory-bank/activeContext.md | 8 ++- memory-bank/progress.md | 6 +- memory-bank/systemPatterns.md | 5 +- package.json | 4 +- src/App.tsx | 41 ++++++++++++- src/EventDetails.tsx | 107 ++++++++++++++++++++++++++++++++++ src/events.ts | 1 + 8 files changed, 224 insertions(+), 15 deletions(-) create mode 100644 src/EventDetails.tsx diff --git a/api_proxy.cjs b/api_proxy.cjs index fdd046e..ceb346c 100644 --- a/api_proxy.cjs +++ b/api_proxy.cjs @@ -1,5 +1,11 @@ -// to test this code, run the following command: -// curl "http://localhost:3000/api/events?page=0&size=20" +/* +# to test these endpoints: +# List events for a particular city and state +curl "http://localhost:3000/api/events?city=Denver&state=CO" + +# Get details for a specific event +curl "http://localhost:3000/api/events/EVENT_ID" +*/ const express = require('express'); const cors = require('cors'); @@ -8,6 +14,14 @@ require('dotenv').config(); const app = express(); const port = 3000; +const isDev = process.env.NODE_ENV === 'development'; + +// Debug logger utility +const debug = (...args) => { + if (isDev) { + console.log('[Debug]', ...args); + } +}; app.use(cors()); @@ -16,7 +30,7 @@ const API_KEY = process.env.API_KEY; const RADIUS = process.env.RADIUS || '50'; const RADIUSUNIT = process.env.RADIUS_UNIT || 'miles'; // or 'km' // log the radius to console -console.log(`Radius: ${RADIUS}`); +debug(`Search Radius: ${RADIUS}`); app.get('/api/events', async (req, res) => { try { @@ -65,6 +79,53 @@ app.get('/api/events', async (req, res) => { } }); +app.get('/api/events/:id', async (req, res) => { + try { + const { id } = req.params; + debug(`Fetching event details for ID: ${id}`); + + const url = `https://app.ticketmaster.com/discovery/v2/events/${id}.json`; + debug(`Calling Ticketmaster API: ${url}`); + + const response = await axios.get(url, { + params: { + apikey: API_KEY + } + }); + + debug(`Ticketmaster API response status: ${response.status}`); + + // Add response data validation + if (!response.data) { + throw new Error('Invalid API response: missing data'); + } + + // Add debug logging for response data + // debug('Event data:', response.data); + + res.json(response.data); + } catch (error) { + debug('API Error:', { + message: error.message, + status: error.response?.status, + url: error.config?.url + }); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + + // Always send an error response + return res.status(error.response?.status || 500).json({ + error: error.message || 'Failed to fetch event details' + }); + } +}); + app.listen(port, () => { const message = ` ================================= diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 164f6fc..e33e949 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,7 +1,7 @@ # Active Context ## Current Work Focus -Adding pagination support to the API and UI. +Allowing the user to click on an event when browsing the list of events to see more details about the event. # Active Context @@ -16,7 +16,10 @@ Adding pagination support to the API and UI. - Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React. - Added dark mode support to the event view - Added a google calendar link to allow the user to add an event of interest to their calendar -- Rendered each event name as a link to perplexity search with the event name and venue as search parameters. +- Removed the link to Perplexity that was serving as the title for each event. +- Added a new component called `EventDetails.tsx` to display the event details. +- Modified the `src/App.tsx` file to display the `EventDetails.tsx` component when an event is clicked. +- Modified the `api_proxy.cjs` file to add a new endpoint to retrieve the details of a specific event. ## Next Steps @@ -37,4 +40,3 @@ Adding pagination support to the API and UI. - Integration with external APIs (music events, Spotify) will be crucial. - The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. - We can use perplexity to create links for events we are interested in so we don't have to use ticketmaster links. The syntax is `https://www.perplexity.ai/search?q=boulder%20theater ` -- Implemented pagination support in `src/events.ts` and the UI. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index ae73af7..1229717 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -7,7 +7,7 @@ - Pulling events for a hardcoded region and radius from ticketmaster API. - Rendering the events in a simple but styled UI. - Allowing user to add events of interest to Google Calendar. -- Allowing the user to see more about an event of interest by linking them to a perplexity search. This likely need to be reworked to use a different Ticketmaster API endpoint to show more detailed information about a specific event. +- Allowing the user to click on an event when browsing the list of events to see more details about the event. - Initialized the memory bank with core files. - Defined the project scope and goals in projectbrief.md. - Outlined the product vision and user experience in productContext.md. @@ -17,7 +17,6 @@ ## What's Left to Build - Add docs for the Ticketmaster API into the memory bank. - Rework the search functionality to be less US-centric. -- Use the Ticketmaster API to provide more information about specific events of interest. The user should be able to click into an event of interest to see more detail. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. - Integrate with third-party APIs for music events and Spotify. @@ -34,6 +33,9 @@ - Determined the pagination parameters and response structure for the Ticketmaster API. - Implemented pagination support in `src/events.ts`, `api_proxy.cjs`, and `src/App.tsx`. - Implemented city and state search functionality in `src/App.tsx` and `api_proxy.cjs`. (work in progress) +- Implemented a new endpoint in `api_proxy.cjs` to retrieve event details. +- Created a new component called `EventDetails.tsx` to display event details. +- Modified `src/App.tsx` to display event details when an event is clicked. - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. - Search sort of works diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md index fb6935c..3dfba66 100644 --- a/memory-bank/systemPatterns.md +++ b/memory-bank/systemPatterns.md @@ -12,6 +12,7 @@ ### API Layer - Express proxy server for third-party API calls - RESTful endpoints for event data + - `/api/events/:id`: Retrieves details for a specific event. - Rate limiting and caching implementation - Error handling and logging strategy - Request validation middleware @@ -19,7 +20,6 @@ ### Integration Layer - Ticketmaster API integration for event discovery - Google Calendar API for event scheduling -- Perplexity AI for event context enrichment - Future Spotify API integration planned ### Data Layer @@ -75,6 +75,7 @@ - EventCard: Individual event display - SearchFilters: Event filtering interface - CalendarIntegration: Google Calendar integration +- EventDetails: Displays detailed information about a specific event. ### Shared Components - Button: Reusable button component @@ -88,7 +89,7 @@ - ✅ Basic event discovery with Ticketmaster API - ✅ Event display with dark mode support - ✅ Google Calendar integration -- ✅ Perplexity search integration +- ✅ Implemented event details view [work in progress] ### Phase 2 (Next) - User authentication with Supabase diff --git a/package.json b/package.json index 4076455..74391a0 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "server": "node api_proxy.cjs", + "server": "NODE_ENV=production node api_proxy.cjs", "dev:vite": "vite", - "dev:server": "node api_proxy.cjs", + "dev:server": "NODE_ENV=development node api_proxy.cjs", "dev": "npm-run-all --parallel --print-label dev:*" }, "dependencies": { diff --git a/src/App.tsx b/src/App.tsx index 488e99f..f1e5146 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,29 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { Event, getEvents, ApiResponse } from './events'; +import EventDetails from './EventDetails'; function App() { const [events, setEvents] = useState([]); + const [selectedEventId, setSelectedEventId] = useState(null); const [currentPage, setCurrentPage] = useState(0); + const [showEventDetails, setShowEventDetails] = useState(false); + + const handleEventClick = (eventId: string) => { + setSelectedEventId(eventId); + setShowEventDetails(true); + // Scroll to event details + window.scrollTo({ + top: 0, + behavior: 'smooth' + }); + }; + + const handleCloseDetails = () => { + setShowEventDetails(false); + setSelectedEventId(null); + }; + const [totalPages, setTotalPages] = useState(0); const pageSize = 20; const [city, setCity] = useState(''); @@ -73,6 +92,22 @@ function App() {

    Upcoming Events

    + + {/* Show event details when an event is selected */} + {showEventDetails && selectedEventId && ( +
    + + +
    + )} +
); diff --git a/src/EventDetails.tsx b/src/EventDetails.tsx new file mode 100644 index 0000000..0d7fbfd --- /dev/null +++ b/src/EventDetails.tsx @@ -0,0 +1,107 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; + +interface EventDetailsProps { + eventId: string; +} + +interface EventDetailsData { + name: string; + description?: string; + dates: { + start: { + localDate: string; + localTime: string; + }; + }; + _embedded?: { + venues?: { + name: string; + city: { + name: string; + }; + state: { + name: string; + }; + }[]; + }; +} + +const EventDetails: React.FC = ({ eventId }) => { + const [eventDetails, setEventDetails] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchEventDetails = async () => { + try { + setIsLoading(true); + setError(null); + const response = await axios.get(`/api/events/${eventId}`); + setEventDetails(response.data); + } catch (error) { + setError(error instanceof Error ? error.message : 'Failed to fetch event details'); + console.error('Failed to fetch event details:', error); + } finally { + setIsLoading(false); + } + }; + + if (eventId) { + fetchEventDetails(); + } + }, [eventId]); + + if (isLoading) { + return ( +
+
+
+
+
+
+
+
+ ); + } + + if (error) { + return ( +
+
{error}
+
+ ); + } + + if (!eventDetails) { + return null; + } + + return ( +
+

+ {eventDetails.name} +

+ {eventDetails.description && ( +

+ {eventDetails.description} +

+ )} +
+

+ {new Date(eventDetails.dates.start.localDate).toLocaleDateString()} at{' '} + {new Date(`2000-01-01T${eventDetails.dates.start.localTime}`).toLocaleTimeString()} +

+ {eventDetails._embedded?.venues?.[0] && ( +

+ {eventDetails._embedded.venues[0].name},{' '} + {eventDetails._embedded.venues[0].city.name},{' '} + {eventDetails._embedded.venues[0].state.name} +

+ )} +
+
+ ); +}; + +export default EventDetails; diff --git a/src/events.ts b/src/events.ts index bbfd5ec..55ab470 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,4 +1,5 @@ export interface Event { + id: string; name: string; type: string; dates: { From e98c6f01625ee49a82ffaac5f00e0c0eb4518e7e Mon Sep 17 00:00:00 2001 From: DC Date: Sun, 13 Apr 2025 10:48:17 -0600 Subject: [PATCH 13/29] refactor: move calendar and social links to event details - Move calendar functionality from event list to event details page - Add social links (YouTube, Spotify, website) to event details - Add classification icons to event list and details - Improve date/time formatting and layout - Add debug utilities for client-side logging - Implement debouncing for search inputs --- api_proxy.cjs | 49 +++--- memory-bank/activeContext.md | 3 +- memory-bank/progress.md | 4 +- src/App.tsx | 117 +++++++-------- src/EventDetails.tsx | 206 ++++++++++++++++++++++++-- src/components/ClassificationIcon.tsx | 41 +++++ src/events.ts | 33 +++++ src/hooks/useDebounce.ts | 17 +++ src/utils/debug.ts | 10 ++ 9 files changed, 382 insertions(+), 98 deletions(-) create mode 100644 src/components/ClassificationIcon.tsx create mode 100644 src/hooks/useDebounce.ts create mode 100644 src/utils/debug.ts diff --git a/api_proxy.cjs b/api_proxy.cjs index ceb346c..c3efec3 100644 --- a/api_proxy.cjs +++ b/api_proxy.cjs @@ -26,7 +26,6 @@ const debug = (...args) => { app.use(cors()); const API_KEY = process.env.API_KEY; -// const CITY = process.env.CITY; const RADIUS = process.env.RADIUS || '50'; const RADIUSUNIT = process.env.RADIUS_UNIT || 'miles'; // or 'km' // log the radius to console @@ -40,33 +39,45 @@ app.get('/api/events', async (req, res) => { const city = req.query.city; const state = req.query.state; + debug('Request params:', { page, size, city, state }); + // Make request to Ticketmaster API with pagination - // ref: https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/#overview - const response = await axios.get( - 'https://app.ticketmaster.com/discovery/v2/events.json', - { - params: { - apikey: API_KEY, - city: city, - stateCode: state, - radius: RADIUS, - unit: RADIUSUNIT, - page: page, - size: size, - sort: 'date,asc' // Optional: sort by date ascending - } + const url = 'https://app.ticketmaster.com/discovery/v2/events.json'; + debug(`Calling Ticketmaster API: ${url}`); + + const response = await axios.get(url, { + params: { + apikey: API_KEY, + city: city, + stateCode: state, + radius: RADIUS, + unit: RADIUSUNIT, + page: page, + size: size, + sort: 'date,asc' } - ); + }); + + debug('Response status:', response.status); + debug('Response structure:', { + hasData: !!response.data, + hasEmbedded: !!response.data?._embedded, + hasEvents: !!response.data?._embedded?.events, + eventCount: response.data?._embedded?.events?.length || 0 + }); // Validate response data - if (!response.data.page) { - throw new Error('Invalid API response: missing pagination data'); + if (!response.data || !response.data._embedded || !response.data._embedded.events) { + debug('Invalid response:', response.data); + throw new Error('Invalid API response: missing events data'); } + // Just send the response data directly res.json(response.data); + } catch (error) { console.error('API Error:', error.message); - + // Handle rate limiting specifically if (error.response?.status === 429) { return res.status(429).json({ diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index e33e949..48c5918 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,7 +1,7 @@ # Active Context ## Current Work Focus -Allowing the user to click on an event when browsing the list of events to see more details about the event. +Figure out what the events api returns so that we can style the list with some detail about what type of event each event is (eg music, sports, etc.) # Active Context @@ -23,6 +23,7 @@ Allowing the user to click on an event when browsing the list of events to see m ## Next Steps +- Add some detail about the type of event (eg sports vs music etc) in the event list - Allow the user to specify which region and radius to search for events in. Presently this is hard coded as an env variable. - Implemented first stab at city and state search functionality. (work in progress) - Investigate whether the radius parameter to the Ticketmaster API is being honored. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 1229717..f7ce306 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -1,6 +1,7 @@ # Progress ## What Works +- User can click on an event and see (some) event details. - Handle 429 rate limiting errors returned by the Ticketmaster API. - Allowing the user to search for events in a particular City and State. Note this is US centric and thus needs to be reworked. - An API proxy server implemented in node/express to prevent API keys from ending up in client side code @@ -15,7 +16,7 @@ - Described the technologies used and development setup in techContext.md. ## What's Left to Build -- Add docs for the Ticketmaster API into the memory bank. +- Add some detail about the type of event (eg sports vs music etc) in the event list - Rework the search functionality to be less US-centric. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. @@ -38,6 +39,7 @@ - Modified `src/App.tsx` to display event details when an event is clicked. - Installed `tailwindcss` and `@tailwindcss/vite` and added `@import "tailwindcss";` to `src/index.css`. - Search sort of works +- Added docs for the Ticketmaster API into the memory bank. ## Known Issues diff --git a/src/App.tsx b/src/App.tsx index f1e5146..46eecf0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,8 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { Event, getEvents, ApiResponse } from './events'; import EventDetails from './EventDetails'; +import ClassificationIcon from './components/ClassificationIcon'; +import { useDebounce } from './hooks/useDebounce'; function App() { const [events, setEvents] = useState([]); @@ -29,34 +31,9 @@ function App() { const [city, setCity] = useState(''); const [state, setState] = useState(''); - const createPerplexitySearchUrl = (event: Event) => { - const searchQuery = encodeURIComponent( - `${event.name} ${event._embedded?.venues?.[0]?.name || ''}` - ); - return `https://www.perplexity.ai/search?q=${searchQuery}`; - }; - - const createGoogleCalendarUrl = (event: Event) => { - const startDate = new Date(event.dates.start.localDate); - if (event.dates.start.localTime) { - startDate.setHours( - parseInt(event.dates.start.localTime.split(':')[0]), - parseInt(event.dates.start.localTime.split(':')[1]) - ); - } - - const endDate = new Date(startDate.getTime() + (3 * 60 * 60 * 1000)); // Default 3 hour duration - - const params = new URLSearchParams({ - action: 'TEMPLATE', - text: event.name, - dates: `${startDate.toISOString().replace(/[-:]/g, '').split('.')[0]}Z/${endDate.toISOString().replace(/[-:]/g, '').split('.')[0]}Z`, - location: event._embedded?.venues?.[0]?.name || '', - details: `Event details: ${event.url || ''}` - }); - - return `https://calendar.google.com/calendar/render?${params.toString()}`; - }; + // Add debounced values + const debouncedCity = useDebounce(city); + const debouncedState = useDebounce(state); async function fetchEvents() { try { @@ -69,18 +46,29 @@ function App() { } useEffect(() => { - fetchEvents(); - }, [currentPage, pageSize, city, state]); + if (debouncedCity || debouncedState) { + setCurrentPage(0); // Reset to first page when search terms change + fetchEvents(); + } + }, [debouncedCity, debouncedState]); + + // Update existing useEffect for pagination + useEffect(() => { + if (currentPage > 0) { // Only fetch for page changes if we're past page 0 + fetchEvents(); + } + }, [currentPage]); const handlePageChange = (newPage: number) => { setCurrentPage(newPage); - // Scroll to top of events list + // Scroll to top of events list for both next and previous window.scrollTo({ top: 0, behavior: 'smooth' }); }; + // Modify handleSearch to use current input values immediately const handleSearch = () => { setCurrentPage(0); fetchEvents(); @@ -136,22 +124,43 @@ function App() {
  • - handleEventClick(event.id)} - className="text-lg font-semibold text-indigo-600 dark:text-indigo-400 hover:text-indigo-800 dark:hover:text-indigo-300 transition-colors duration-150" - > - {event.name} - - - {new Date(event.dates.start.localDate).toLocaleDateString('en-US', { - weekday: 'short', - month: 'short', - day: 'numeric' - })} - + +
    +
    + {new Date(event.dates.start.localDate).toLocaleDateString('en-US', { + weekday: 'short', + month: 'short', + day: 'numeric' + })} +
    +
    + {event.dates.start.localTime ? + new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }) + : 'Time TBA' + } +
    +
    -
    +
    {event._embedded?.venues?.[0]?.name || 'Unknown Venue'} - - {event.dates.start.localTime ? new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { - hour: 'numeric', - minute: '2-digit' - }) : 'Time TBA'}
    - - - - - Add to Calendar -
  • diff --git a/src/EventDetails.tsx b/src/EventDetails.tsx index 0d7fbfd..77f2bab 100644 --- a/src/EventDetails.tsx +++ b/src/EventDetails.tsx @@ -1,5 +1,7 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; +import ClassificationIcon from './components/ClassificationIcon'; +import { debug } from './utils/debug'; interface EventDetailsProps { eventId: string; @@ -24,9 +26,80 @@ interface EventDetailsData { name: string; }; }[]; + attractions?: { + name: string; + externalLinks?: { + youtube?: { + url: string; + }[]; + spotify?: { + url: string; + }[]; + twitter?: { + url: string; + }[]; + facebook?: { + url: string; + }[]; + homepage?: { + url: string; + }[]; + }; + }[]; }; + classifications?: { + segment?: { + name: string; + }; + genre?: { + name: string; + }; + subGenre?: { + name: string; + }; + }[]; + attractions?: { + name: string; + externalLinks?: { + spotify?: { + url: string; + }[]; + youtube?: { + url: string; + }[]; + }; + }[]; } +const createGoogleCalendarUrl = (event: EventDetailsData) => { + if (!event.dates.start.localDate) return ''; + + const startDate = new Date(event.dates.start.localDate); + if (event.dates.start.localTime) { + startDate.setHours( + parseInt(event.dates.start.localTime.split(':')[0]), + parseInt(event.dates.start.localTime.split(':')[1]) + ); + } + + const endDate = new Date(startDate); + endDate.setHours(startDate.getHours() + 3); // Default to 3 hour duration + + const venue = event._embedded?.venues?.[0]; + const location = venue ? `${venue.name}, ${venue.city.name}, ${venue.state.name}` : ''; + + const params = new URLSearchParams({ + action: 'TEMPLATE', + text: event.name, + dates: `${startDate.toISOString().replace(/[-:]/g, '').replace('.000', '')}/` + + `${endDate.toISOString().replace(/[-:]/g, '').replace('.000', '')}`, + details: event.description || '', + location: location + }); + + return `https://www.google.com/calendar/render?${params.toString()}`; +}; + const EventDetails: React.FC = ({ eventId }) => { const [eventDetails, setEventDetails] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -38,6 +111,23 @@ const EventDetails: React.FC = ({ eventId }) => { setIsLoading(true); setError(null); const response = await axios.get(`/api/events/${eventId}`); + + debug('Event details:', { + id: eventId, + name: response.data.name, + hasAttractions: !!response.data._embedded?.attractions, + attractions: response.data._embedded?.attractions?.map(a => ({ + name: a.name, + externalLinks: a.externalLinks, + youtubeLinks: a.externalLinks?.youtube?.map(y => y.url), + socialLinks: { + facebook: a.externalLinks?.facebook?.[0]?.url, + twitter: a.externalLinks?.twitter?.[0]?.url, + homepage: a.externalLinks?.homepage?.[0]?.url + } + })) + }); + setEventDetails(response.data); } catch (error) { setError(error instanceof Error ? error.message : 'Failed to fetch event details'); @@ -79,26 +169,112 @@ const EventDetails: React.FC = ({ eventId }) => { return (
    -

    - {eventDetails.name} -

    - {eventDetails.description && ( +
    +
    + {eventDetails?.classifications?.[0]?.segment?.name && ( + + )} +

    + {eventDetails?.name} +

    +
    +
    + +
    +
    + {new Date(eventDetails?.dates.start.localDate).toLocaleDateString('en-US', { + weekday: 'short', + month: 'short', + day: 'numeric' + })} +
    +
    + {eventDetails?.dates.start.localTime ? + new Date(`2000-01-01T${eventDetails.dates.start.localTime}`).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }) + : 'Time TBA' + } +
    +
    + {eventDetails?.description && (

    {eventDetails.description}

    )} -
    -

    - {new Date(eventDetails.dates.start.localDate).toLocaleDateString()} at{' '} - {new Date(`2000-01-01T${eventDetails.dates.start.localTime}`).toLocaleTimeString()} -

    - {eventDetails._embedded?.venues?.[0] && ( -

    - {eventDetails._embedded.venues[0].name},{' '} - {eventDetails._embedded.venues[0].city.name},{' '} - {eventDetails._embedded.venues[0].state.name} -

    +
    + {eventDetails?._embedded?.venues?.[0] && ( +
    + + + + +

    + {eventDetails._embedded.venues[0].name},{' '} + {eventDetails._embedded.venues[0].city.name},{' '} + {eventDetails._embedded.venues[0].state.name} +

    +
    )} +
    + {eventDetails?.attractions?.[0]?.externalLinks?.spotify?.[0]?.url && ( + + + + + Listen on Spotify + + )} + {eventDetails?._embedded?.attractions?.[0]?.externalLinks?.youtube?.[0]?.url && ( + + + + + Watch on YouTube + + )} + + + + + Add to Calendar + + {eventDetails?._embedded?.attractions?.[0]?.externalLinks?.homepage?.[0]?.url && ( + + + + + Visit Website + + )} +
    ); diff --git a/src/components/ClassificationIcon.tsx b/src/components/ClassificationIcon.tsx new file mode 100644 index 0000000..182dd6b --- /dev/null +++ b/src/components/ClassificationIcon.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +interface ClassificationIconProps { + segmentName?: string; + className?: string; +} + +const ClassificationIcon: React.FC = ({ segmentName, className = "" }) => { + const getIcon = (segment: string = '') => { + switch (segment.toLowerCase()) { + case 'music': + return ( + + + + ); + case 'sports': + return ( + + + + ); + case 'arts': + return ( + + + + ); + default: + return ( + + + + ); + } + }; + + return getIcon(segmentName); +}; + +export default ClassificationIcon; diff --git a/src/events.ts b/src/events.ts index 55ab470..05602f5 100644 --- a/src/events.ts +++ b/src/events.ts @@ -12,6 +12,30 @@ export interface Event { venues?: { name: string }[]; }; url?: string; + classifications?: { + primary: boolean; + segment: { + id: string; + name: string; + }; + genre: { + id: string; + name: string; + }; + subGenre: { + id: string; + name: string; + }; + type: { + id: string; + name: string; + }; + subType: { + id: string; + name: string; + }; + family: boolean; + }[]; // Add other properties as needed } @@ -51,6 +75,15 @@ export const getEvents = async (page: number = 0, size: number = 20, city: strin const data: ApiResponse = await response.json(); + // Debug log classifications + if (process.env.NODE_ENV === 'development') { + data._embedded?.events.forEach(event => { + console.log(`Event ${event.name} classifications:`, + event.classifications?.map(c => c.segment?.name) + ); + }); + } + // Validate pagination data if (!data.page) { throw new Error('Invalid API response: missing pagination data'); diff --git a/src/hooks/useDebounce.ts b/src/hooks/useDebounce.ts new file mode 100644 index 0000000..7112631 --- /dev/null +++ b/src/hooks/useDebounce.ts @@ -0,0 +1,17 @@ +import { useState, useEffect } from 'react'; + +export function useDebounce(value: T, delay: number = 500): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(timer); + }; + }, [value, delay]); + + return debouncedValue; +} \ No newline at end of file diff --git a/src/utils/debug.ts b/src/utils/debug.ts new file mode 100644 index 0000000..6f43708 --- /dev/null +++ b/src/utils/debug.ts @@ -0,0 +1,10 @@ +export const debug = (...args: any[]) => { + if (process.env.NODE_ENV === 'development') { + console.log('[Client Debug]', ...args); + } +}; + +// Optional: Add specific debug functions for different areas +export const debugEvents = (...args: any[]) => debug('[Events]', ...args); +export const debugAPI = (...args: any[]) => debug('[API]', ...args); +export const debugUI = (...args: any[]) => debug('[UI]', ...args); \ No newline at end of file From a21b9c78bd2380849824084e261a0fc0ac7dc72a Mon Sep 17 00:00:00 2001 From: DC Date: Mon, 14 Apr 2025 14:26:30 -0600 Subject: [PATCH 14/29] feat: Set default location to Boulder, CO and update memory bank - Set default city and state to Boulder, CO in src/App.tsx - Update activeContext.md and progress.md to reflect default location change - Update productContext.md to clarify Ticketmaster API limitations and expand music service options - Update projectbrief.md to include YouTube and artist website links --- memory-bank/activeContext.md | 17 ++++++++--------- memory-bank/productContext.md | 4 ++-- memory-bank/progress.md | 13 +++++++++++-- memory-bank/projectbrief.md | 3 ++- src/App.tsx | 4 ++-- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 48c5918..4323bb3 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,9 +1,8 @@ # Active Context -## Current Work Focus -Figure out what the events api returns so that we can style the list with some detail about what type of event each event is (eg music, sports, etc.) -# Active Context +## Current Work Focus +- Make the landing page return results for Boulder, CO by default, if no default location is stored in LocalStorage ## Recent Changes @@ -20,14 +19,15 @@ Figure out what the events api returns so that we can style the list with some d - Added a new component called `EventDetails.tsx` to display the event details. - Modified the `src/App.tsx` file to display the `EventDetails.tsx` component when an event is clicked. - Modified the `api_proxy.cjs` file to add a new endpoint to retrieve the details of a specific event. +- Added some detail about the type of event (eg sports vs music etc) in the event list (using styled icons) +- Implemented first stab at city and state search functionality. (work in progress). States are very US centric so we want to move on from that pattern. +- Handled 429 rate limit errors from the Ticketmaster API. There's probably a better way to do this, as we are presently surfacing the 429 in the UI. Going forward we should consider quietly retrying the request and showing a loading spinner while waiting for the retry. -## Next Steps -- Add some detail about the type of event (eg sports vs music etc) in the event list -- Allow the user to specify which region and radius to search for events in. Presently this is hard coded as an env variable. -- Implemented first stab at city and state search functionality. (work in progress) +## Next Steps +- Allow the user to filter events by event type (eg music/concert, sports, film, etc.) +- Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage. - Investigate whether the radius parameter to the Ticketmaster API is being honored. -- Handle 429 rate limit errors from the Ticketmaster API. - Determine the best way to integrate with Spotify for user preferences. ## Important Patterns and Preferences @@ -40,4 +40,3 @@ Figure out what the events api returns so that we can style the list with some d - The project requires a strong focus on personalization and user experience. - Integration with external APIs (music events, Spotify) will be crucial. - The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. -- We can use perplexity to create links for events we are interested in so we don't have to use ticketmaster links. The syntax is `https://www.perplexity.ai/search?q=boulder%20theater ` diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md index 740da17..f2ea7b6 100644 --- a/memory-bank/productContext.md +++ b/memory-bank/productContext.md @@ -6,7 +6,7 @@ This project aims to provide a platform for music lovers to discover live music ## Problems It Solves - Difficulty in finding live music events that match user preferences. - Bandsintown doesn't seem to work reliably. -- Lack of a centralized platform for discovering local music scenes. +- Lack of a centralized platform for discovering local music scenes. Note that the Ticketmaster API we are presently using is not a good choice for discovering "local" music. - Limited ability to personalize music event discovery based on user tastes. ## How It Should Work @@ -14,7 +14,7 @@ The app should allow users to: - Discover live music events based on location and musical preferences. - Create calendar entries and invitations for events of interest - Create a profile with their geographical area and musical tastes. -- Import musical preferences from Spotify. +- Import musical preferences from Spotify, Apple Music and maybe Amazon Music. - Save and share events with friends. ## User Experience Goals diff --git a/memory-bank/progress.md b/memory-bank/progress.md index f7ce306..1c974dc 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -8,15 +8,24 @@ - Pulling events for a hardcoded region and radius from ticketmaster API. - Rendering the events in a simple but styled UI. - Allowing user to add events of interest to Google Calendar. -- Allowing the user to click on an event when browsing the list of events to see more details about the event. - Initialized the memory bank with core files. - Defined the project scope and goals in projectbrief.md. - Outlined the product vision and user experience in productContext.md. - Documented the system architecture and technical decisions in systemPatterns.md. - Described the technologies used and development setup in techContext.md. +- Implemented the display of event types in the event list +- Implemented debouncing for the search input +- Created ClassificationIcon component +- Created useDebounce hook +- Implemented the display of event types in the event list +- Implemented debouncing for the search input +- Created ClassificationIcon component +- Created useDebounce hook +- Created debug utils +- Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage ## What's Left to Build -- Add some detail about the type of event (eg sports vs music etc) in the event list +- Allow the user to filter events by event type (eg music/concert, sports, film, etc.) - Rework the search functionality to be less US-centric. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md index c0cef19..156dbbf 100644 --- a/memory-bank/projectbrief.md +++ b/memory-bank/projectbrief.md @@ -8,7 +8,8 @@ Building a web and mobile app for discovering live music events of interest - Allow the user to scroll through multiple pages of events - Allow a user to select which city to show events for - Allow the user to create calendar entries for events of interest -- Allow the user to listen to music from artists that are coming to town via Spotify +- Allow the user to listen to music from artists that are coming to town via Spotify or Youtube +- Allow the user to learn more about the artist by providing a link to their website - Allow a user to login and create a profile that includes their geographical area and musical preferences - Allow a user to specify their musical preferences by importing likes and followed artists from Spotify diff --git a/src/App.tsx b/src/App.tsx index 46eecf0..487c04e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -28,8 +28,8 @@ function App() { const [totalPages, setTotalPages] = useState(0); const pageSize = 20; - const [city, setCity] = useState(''); - const [state, setState] = useState(''); + const [city, setCity] = useState(localStorage.getItem('city') || 'Boulder'); + const [state, setState] = useState(localStorage.getItem('state') || 'CO'); // Add debounced values const debouncedCity = useDebounce(city); From 2049eb909b2a88e7fc947eb63b9d632304e8bdaa Mon Sep 17 00:00:00 2001 From: DC Date: Mon, 14 Apr 2025 15:06:20 -0600 Subject: [PATCH 15/29] feat: Configure events per page and API proxy port via environment variables This commit introduces the following changes: - Configures the number of events displayed per page and the API proxy port using environment variables. - Updates the .env file to include DEFAULT_EVENTS_PER_PAGE, VITE_DEFAULT_EVENTS_PER_PAGE, and API_PROXY_PORT variables. - Modifies api_proxy.cjs to access DEFAULT_EVENTS_PER_PAGE and API_PROXY_PORT from process.env. - Updates vite.config.ts to use the API_PROXY_PORT variable for the proxy target. - Updates activeContext.md and progress.md to reflect the changes. These changes improve the application's configurability and make it easier to deploy in different environments. --- api_proxy.cjs | 4 ++-- memory-bank/activeContext.md | 6 ++++-- memory-bank/progress.md | 8 ++++++++ src/App.tsx | 2 +- vite.config.ts | 35 +++++++++++++++++++---------------- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/api_proxy.cjs b/api_proxy.cjs index c3efec3..ad3b507 100644 --- a/api_proxy.cjs +++ b/api_proxy.cjs @@ -13,7 +13,7 @@ const axios = require('axios'); require('dotenv').config(); const app = express(); -const port = 3000; +const port = process.env.API_PROXY_PORT || 3000; const isDev = process.env.NODE_ENV === 'development'; // Debug logger utility @@ -35,7 +35,7 @@ app.get('/api/events', async (req, res) => { try { // Extract pagination parameters and city and state from query const page = parseInt(req.query.page) || 0; - const size = parseInt(req.query.size) || 20; + const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; const city = req.query.city; const state = req.query.state; diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 4323bb3..02cde71 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -22,11 +22,13 @@ - Added some detail about the type of event (eg sports vs music etc) in the event list (using styled icons) - Implemented first stab at city and state search functionality. (work in progress). States are very US centric so we want to move on from that pattern. - Handled 429 rate limit errors from the Ticketmaster API. There's probably a better way to do this, as we are presently surfacing the 429 in the UI. Going forward we should consider quietly retrying the request and showing a loading spinner while waiting for the retry. - +- Updated the api_proxy.cjs and vite.config.ts files to use the API_PROXY_PORT variable. +- Updated the .env file to include DEFAULT_EVENTS_PER_PAGE=7 and VITE_DEFAULT_EVENTS_PER_PAGE=7. +- Updated the api_proxy.cjs file to access the DEFAULT_EVENTS_PER_PAGE variable from process.env. +- Updated the src/App.tsx file to read the VITE_DEFAULT_EVENTS_PER_PAGE variable from import.meta.env. ## Next Steps - Allow the user to filter events by event type (eg music/concert, sports, film, etc.) -- Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage. - Investigate whether the radius parameter to the Ticketmaster API is being honored. - Determine the best way to integrate with Spotify for user preferences. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 1c974dc..c4a191a 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -23,8 +23,12 @@ - Created useDebounce hook - Created debug utils - Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage +- Configured the default number of events per page using environment variables. +- Removed the hardcoded port for the api_proxy server. ## What's Left to Build +- Input validation for the search parameter(s) prior to the api_server making requests +- Allow user to "like" an event and store the like status in LocalStorage (for now) - Allow the user to filter events by event type (eg music/concert, sports, film, etc.) - Rework the search functionality to be less US-centric. - Implement the backend services for user authentication, music event discovery, and Spotify integration. @@ -52,6 +56,10 @@ ## Known Issues +- UI should return to the event in the list closing event details. Presently it scrolls back to top. +- UI is displaying house icon for events of type football game. +- UI doesn't render properly on mobile. The City and State text inputs plus the search button take up too much room. Let's get rid of the state search as well as the search button since we auto-search after 500ms. + - It is unclear whether the radius parameter to the Ticketmaster API is being honored. - The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. We are now handling this in code. diff --git a/src/App.tsx b/src/App.tsx index 487c04e..7269ee6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -27,7 +27,7 @@ function App() { }; const [totalPages, setTotalPages] = useState(0); - const pageSize = 20; + const pageSize = parseInt(import.meta.env.VITE_DEFAULT_EVENTS_PER_PAGE) || 10; const [city, setCity] = useState(localStorage.getItem('city') || 'Boulder'); const [state, setState] = useState(localStorage.getItem('state') || 'CO'); diff --git a/vite.config.ts b/vite.config.ts index 1c2cb1c..5d62ae3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,20 +1,23 @@ - -import { defineConfig } from 'vite' +import { defineConfig, loadEnv } from 'vite' import react from '@vitejs/plugin-react' -import tailwindcss from '@tailwindcss/vite'; +import tailwindcss from '@tailwindcss/vite' -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - tailwindcss(), - ], - server: { - proxy: { - '/api': { - target: 'http://localhost:3000', - changeOrigin: true, +export default defineConfig(({ mode }) => { + // Load env file based on mode + const env = loadEnv(mode, process.cwd(), '') + + return { + plugins: [ + react(), + tailwindcss(), + ], + server: { + proxy: { + '/api': { + target: `http://localhost:${env.API_PROXY_PORT || '3000'}`, + changeOrigin: true, + } } - } - }, + }, + } }) From 875eef0de3541d5554f84627ad4a66584b1f14d1 Mon Sep 17 00:00:00 2001 From: DC Date: Mon, 14 Apr 2025 16:15:10 -0600 Subject: [PATCH 16/29] feat: Remove state input and refactor city search This commit introduces the following changes: - Removes the state input box from the app to improve the UI on mobile devices. - Updates the src/App.tsx file to remove the state input, state variable, setState function, debouncedState variable, and the state parameter from the fetchEvents function. - Updates the api_proxy.cjs file to remove the state parameter from the getEvents function. - Updates memory-bank/activeContext.md and memory-bank/progress.md to reflect the changes. --- api_proxy.cjs | 6 ++---- memory-bank/activeContext.md | 1 + memory-bank/progress.md | 1 + src/App.tsx | 15 +++------------ 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/api_proxy.cjs b/api_proxy.cjs index ad3b507..a8c80c3 100644 --- a/api_proxy.cjs +++ b/api_proxy.cjs @@ -33,13 +33,12 @@ debug(`Search Radius: ${RADIUS}`); app.get('/api/events', async (req, res) => { try { - // Extract pagination parameters and city and state from query + // Extract pagination parameters and city from query const page = parseInt(req.query.page) || 0; const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; const city = req.query.city; - const state = req.query.state; - debug('Request params:', { page, size, city, state }); + debug('Request params:', { page, size, city }); // Make request to Ticketmaster API with pagination const url = 'https://app.ticketmaster.com/discovery/v2/events.json'; @@ -49,7 +48,6 @@ app.get('/api/events', async (req, res) => { params: { apikey: API_KEY, city: city, - stateCode: state, radius: RADIUS, unit: RADIUSUNIT, page: page, diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 02cde71..d65536c 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -26,6 +26,7 @@ - Updated the .env file to include DEFAULT_EVENTS_PER_PAGE=7 and VITE_DEFAULT_EVENTS_PER_PAGE=7. - Updated the api_proxy.cjs file to access the DEFAULT_EVENTS_PER_PAGE variable from process.env. - Updated the src/App.tsx file to read the VITE_DEFAULT_EVENTS_PER_PAGE variable from import.meta.env. +- Removed the state input from the app because it was making the UI unreadable on mobile. ## Next Steps - Allow the user to filter events by event type (eg music/concert, sports, film, etc.) diff --git a/memory-bank/progress.md b/memory-bank/progress.md index c4a191a..1adf93e 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -25,6 +25,7 @@ - Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage - Configured the default number of events per page using environment variables. - Removed the hardcoded port for the api_proxy server. +- Removed the state input box from the app because it was making the UI unusable on mobile. ## What's Left to Build - Input validation for the search parameter(s) prior to the api_server making requests diff --git a/src/App.tsx b/src/App.tsx index 7269ee6..809768b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -29,15 +29,13 @@ function App() { const [totalPages, setTotalPages] = useState(0); const pageSize = parseInt(import.meta.env.VITE_DEFAULT_EVENTS_PER_PAGE) || 10; const [city, setCity] = useState(localStorage.getItem('city') || 'Boulder'); - const [state, setState] = useState(localStorage.getItem('state') || 'CO'); // Add debounced values const debouncedCity = useDebounce(city); - const debouncedState = useDebounce(state); async function fetchEvents() { try { - const data: ApiResponse = await getEvents(currentPage, pageSize, city, state); + const data: ApiResponse = await getEvents(currentPage, pageSize, city); setEvents(data._embedded?.events || []); setTotalPages(data.page.totalPages); } catch (error) { @@ -46,11 +44,11 @@ function App() { } useEffect(() => { - if (debouncedCity || debouncedState) { + if (debouncedCity) { setCurrentPage(0); // Reset to first page when search terms change fetchEvents(); } - }, [debouncedCity, debouncedState]); + }, [debouncedCity]); // Update existing useEffect for pagination useEffect(() => { @@ -104,13 +102,6 @@ function App() { onChange={(e) => setCity(e.target.value)} className="px-4 py-2 mr-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600 dark:focus:ring-indigo-400" /> - setState(e.target.value)} - className="px-4 py-2 mr-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600 dark:focus:ring-indigo-400" - />
      diff --git a/src/EventDetails.tsx b/src/EventDetails.tsx index 77f2bab..10ed4f3 100644 --- a/src/EventDetails.tsx +++ b/src/EventDetails.tsx @@ -26,26 +26,7 @@ interface EventDetailsData { name: string; }; }[]; - attractions?: { - name: string; - externalLinks?: { - youtube?: { - url: string; - }[]; - spotify?: { - url: string; - }[]; - twitter?: { - url: string; - }[]; - facebook?: { - url: string; - }[]; - homepage?: { - url: string; - }[]; - }; - }[]; + attractions?: Attraction[]; }; classifications?: { segment?: { @@ -58,17 +39,23 @@ interface EventDetailsData { name: string; }; }[]; - attractions?: { - name: string; - externalLinks?: { - spotify?: { - url: string; - }[]; - youtube?: { - url: string; - }[]; - }; - }[]; + attractions?: Attraction[]; +} + +interface AttractionLink { + url: string; +} + +interface AttractionLinks { + youtube?: AttractionLink[]; + spotify?: AttractionLink[]; + homepage?: AttractionLink[]; +} + +interface Attraction { + name: string; + url: string; + externalLinks?: AttractionLinks; } const createGoogleCalendarUrl = (event: EventDetailsData) => { @@ -112,20 +99,19 @@ const EventDetails: React.FC = ({ eventId }) => { setError(null); const response = await axios.get(`/api/events/${eventId}`); + const attractionsData = response.data._embedded?.attractions?.map((a: Attraction) => ({ + name: a.name, + url: a.url, + youtubeLinks: a.externalLinks?.youtube?.map((y: AttractionLink) => y.url), + spotifyLinks: a.externalLinks?.spotify?.map((s: AttractionLink) => s.url), + homepageLinks: a.externalLinks?.homepage?.map((h: AttractionLink) => h.url) + })); + debug('Event details:', { id: eventId, name: response.data.name, hasAttractions: !!response.data._embedded?.attractions, - attractions: response.data._embedded?.attractions?.map(a => ({ - name: a.name, - externalLinks: a.externalLinks, - youtubeLinks: a.externalLinks?.youtube?.map(y => y.url), - socialLinks: { - facebook: a.externalLinks?.facebook?.[0]?.url, - twitter: a.externalLinks?.twitter?.[0]?.url, - homepage: a.externalLinks?.homepage?.[0]?.url - } - })) + attractions: attractionsData }); setEventDetails(response.data); diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..fc23ce9 --- /dev/null +++ b/vercel.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "builds": [ + { + "src": "package.json", + "use": "@vercel/static-build", + "config": { + "distDir": "dist" + } + } + ], + "routes": [ + { + "src": "/(.*)", + "dest": "/index.html" + } + ] +} From bfba957384380197f60ed92cc56f5e5c9bf538e4 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 12:10:41 -0600 Subject: [PATCH 22/29] feat(deploy): migrate to vercel serverless functions - Convert Express API proxy to Vercel serverless functions - Add Vercel configuration and deployment settings - Update environment variables for Vercel compatibility - Move API routes to /api directory structure - Add proper CORS headers for API endpoints - Configure Vite for Vercel development - Update documentation with Vercel deployment steps - Fix HMR and asset handling in development - Reduce default page size to 7 events - Add debug logging to serverless functions BREAKING CHANGE: API proxy now runs as Vercel serverless functions instead of Express server --- .env.template | 12 ++-- README.md | 44 ++++++++++++- api/events.js | 116 ++++++++++++++++++++++++++++++++++ api/events/[id].js | 105 ++++++++++++++++++++++++++++++ memory-bank/activeContext.md | 84 ++++++++++++------------ memory-bank/progress.md | 15 +++-- memory-bank/systemPatterns.md | 3 +- memory-bank/techContext.md | 8 ++- package.json | 5 +- vercel.json | 43 ++++++++++--- vite.config.ts | 16 +++-- 11 files changed, 375 insertions(+), 76 deletions(-) create mode 100644 api/events.js create mode 100644 api/events/[id].js diff --git a/.env.template b/.env.template index 9564680..6c47e27 100644 --- a/.env.template +++ b/.env.template @@ -2,11 +2,15 @@ API_KEY="YOUR_KEY" # How many events to show per page -DEFAULT_EVENTS_PER_PAGE=20 -VITE_DEFAULT_EVENTS_PER_PAGE=20 +DEFAULT_EVENTS_PER_PAGE=7 +VITE_DEFAULT_EVENTS_PER_PAGE=7 -# Port to run the Express API Proxy server on -API_PROXY_PORT=4444 +# Port to run the Vercel dev server on +VERCEL_DEV_PORT=3000 + +# Search radius settings +RADIUS=50 +RADIUS_UNIT=miles # Which hostnames to allow the Vite dev server to respond to ALLOWED_HOSTNAMES="musemeter.your.domain" diff --git a/README.md b/README.md index 87e17d9..b89a6b4 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,47 @@ npm run lint npm run build ``` -## 📝 License -[MIT](LICENSE) © 2025 MuseMeter +## 🚀 Deployment + +### Prerequisites +1. A [Vercel](https://vercel.com) account +2. [Vercel CLI](https://vercel.com/docs/cli) installed: `npm i -g vercel` +3. A Ticketmaster API key + +### Environment Variables +Set up the following environment variables in your Vercel project settings: + +- `API_KEY`: Your Ticketmaster API key +- `RADIUS`: Search radius for events (default: 50) +- `RADIUS_UNIT`: Unit for radius (default: miles) +- `DEFAULT_EVENTS_PER_PAGE`: Number of events per page (default: 7) + +### Deploy to Vercel +```bash +# Login to Vercel +vercel login + +# Deploy to Vercel +vercel + +# Deploy to production +vercel --prod +``` + +The project uses Vercel's serverless functions to handle API requests securely. The frontend will be automatically built and deployed as a static site. + +### Local Development +To test the serverless functions locally: +```bash +# Install Vercel CLI +npm i -g vercel + +# Start development server +vercel dev +``` + +## 📝 License + +[MIT](LICENSE) © 2025 MuseMeter \ No newline at end of file diff --git a/api/events.js b/api/events.js new file mode 100644 index 0000000..56a5ccc --- /dev/null +++ b/api/events.js @@ -0,0 +1,116 @@ +console.log("events.js function triggered"); +import axios from 'axios'; + +// Debug logger utility +const debug = (...args) => { + if (process.env.NODE_ENV === 'development') { + console.log('[Debug]', ...args); + } +}; + +// Default values +const RADIUS = process.env.RADIUS || '50'; +const RADIUSUNIT = process.env.RADIUS_UNIT || 'miles'; + +// Validate required environment variables +const validateEnv = () => { + if (!process.env.API_KEY) { + throw new Error('API_KEY environment variable is not set'); + } +}; + +export default async (req, res) => { + try { + // Enable CORS + res.setHeader('Access-Control-Allow-Credentials', true); + res.setHeader('Access-Control-Allow-Origin', '*'); + + // Handle preflight request + if (req.method === 'OPTIONS') { + res.setHeader('Access-Control-Allow-Methods', 'GET,OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + return res.status(200).json({ message: 'OK' }); + } + + // Validate environment variables + validateEnv(); + + // Extract pagination parameters and city from query + const page = parseInt(req.query.page) || 0; + const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; + const city = req.query.city; + + debug('Request params:', { page, size, city }); + debug('Environment:', { + radius: RADIUS, + radiusUnit: RADIUSUNIT, + hasApiKey: !!process.env.API_KEY, + nodeEnv: process.env.NODE_ENV + }); + + // Make request to Ticketmaster API with pagination + const url = 'https://app.ticketmaster.com/discovery/v2/events.json'; + debug(`Calling Ticketmaster API: ${url}`); + + const response = await axios.get(url, { + params: { + apikey: process.env.API_KEY, + city: city, + radius: RADIUS, + unit: RADIUSUNIT, + page: page, + size: size, + sort: 'date,asc' + } + }); + + debug('Response status:', response.status); + debug('Response structure:', { + hasData: !!response.data, + hasEmbedded: !!response.data?._embedded, + hasEvents: !!response.data?._embedded?.events, + eventCount: response.data?._embedded?.events?.length || 0 + }); + + // Validate response data + if (!response.data || !response.data._embedded || !response.data._embedded.events) { + debug('Invalid response:', response.data); + throw new Error('Invalid API response: missing events data'); + } + + // Return the response data + return res.status(200).json(response.data); + + } catch (error) { + console.error('API Error:', error.message); + debug('Error details:', { + message: error.message, + status: error.response?.status, + data: error.response?.data, + config: { + url: error.config?.url, + params: error.config?.params + } + }); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + + // Handle missing API key + if (error.message === 'API_KEY environment variable is not set') { + return res.status(500).json({ + error: 'Server configuration error. Please contact support.' + }); + } + + return res.status(error.response?.status || 500).json({ + error: 'Failed to fetch events', + message: error.message + }); + } +}; diff --git a/api/events/[id].js b/api/events/[id].js new file mode 100644 index 0000000..96257a8 --- /dev/null +++ b/api/events/[id].js @@ -0,0 +1,105 @@ +console.log("events[id].js serverless function triggered"); +import axios from 'axios'; + +// Debug logger utility +const debug = (...args) => { + if (process.env.NODE_ENV === 'development') { + console.log('[Debug]', ...args); + } +}; + +// Validate required environment variables +const validateEnv = () => { + if (!process.env.API_KEY) { + throw new Error('API_KEY environment variable is not set'); + } +}; + +export default async (req, res) => { + try { + // Enable CORS + res.setHeader('Access-Control-Allow-Credentials', true); + res.setHeader('Access-Control-Allow-Origin', '*'); + + // Handle preflight request + if (req.method === 'OPTIONS') { + res.setHeader('Access-Control-Allow-Methods', 'GET,OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + return res.status(200).json({ message: 'OK' }); + } + + // Validate environment variables + validateEnv(); + + const { id } = req.query; + debug(`Fetching event details for ID: ${id}`); + + const url = `https://app.ticketmaster.com/discovery/v2/events/${id}.json`; + debug(`Calling Ticketmaster API: ${url}`); + debug('Environment:', { + hasApiKey: !!process.env.API_KEY, + nodeEnv: process.env.NODE_ENV + }); + + const response = await axios.get(url, { + params: { + apikey: process.env.API_KEY + } + }); + + debug(`Ticketmaster API response status: ${response.status}`); + debug('Response structure:', { + hasData: !!response.data, + eventName: response.data?.name, + hasVenues: !!response.data?._embedded?.venues, + hasAttractions: !!response.data?._embedded?.attractions + }); + + // Add response data validation + if (!response.data) { + throw new Error('Invalid API response: missing data'); + } + + // Return the response data + return res.status(200).json(response.data); + + } catch (error) { + console.error('API Error:', error.message); + debug('Error details:', { + message: error.message, + status: error.response?.status, + data: error.response?.data, + config: { + url: error.config?.url, + params: error.config?.params + } + }); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + + // Handle missing API key + if (error.message === 'API_KEY environment variable is not set') { + return res.status(500).json({ + error: 'Server configuration error. Please contact support.' + }); + } + + // Handle event not found + if (error.response?.status === 404) { + return res.status(404).json({ + error: 'Event not found' + }); + } + + // Return an error response + return res.status(error.response?.status || 500).json({ + error: error.message || 'Failed to fetch event details' + }); + } +}; diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 623fdf7..3e419b9 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,50 +1,50 @@ # Active Context +## Current Development Focus +- Converting Express API to Vercel serverless functions +- Configuring local development environment to use Vercel dev server +- Integrating frontend with serverless functions -## Current Work Focus -- Make the landing page return results for Boulder, CO by default, if no default location is stored in LocalStorage +## Latest Changes +- Converted API endpoints to ES module syntax for Vercel serverless functions +- Updated Vite configuration to proxy API requests to Vercel dev server +- Added CORS headers and API route rewrites in vercel.json +- Implemented `/api/events` serverless function for paginated event retrieval +- Implemented `/api/events/:id` serverless function for event details retrieval +- Updated `.env.template` with new environment variables (`VERCEL_DEV_PORT`, `RADIUS`, `RADIUS_UNIT`) +- Updated `README.md` with deployment instructions for Vercel +- Removed Express API proxy server and replaced it with Vercel serverless functions +## Environment Setup +### Local Development +- Frontend runs on Vite dev server +- Backend uses Vercel dev server for serverless functions +- Environment variables defined in `.env.template`: + - `VERCEL_DEV_PORT=3000` + - `RADIUS=50` + - `RADIUS_UNIT=miles` + - `DEFAULT_EVENTS_PER_PAGE=7` -## Recent Changes -- Created projectbrief.md with core project details. -- Created productContext.md outlining the product vision and goals. -- Created systemPatterns.md to define the system architecture and key technical decisions. -- Created techContext.md to document the technologies used and development setup. -- Created progress.md to track the project's status and known issues. -- Create a separate Node/Express proxy server to handle authenticated API calls to third party API's (starting with Ticketmaster). This design was chosen to prevent putting API keys in client side code. -- Retrieve and display the name, date, time, and venue for all events from the Ticketmaster API for a given city and radius using Vite and React. -- Added dark mode support to the event view -- Added a google calendar link to allow the user to add an event of interest to their calendar -- Removed the link to Perplexity that was serving as the title for each event. -- Added a new component called `EventDetails.tsx` to display the event details. -- Modified the `src/App.tsx` file to display the `EventDetails.tsx` component when an event is clicked. -- Modified the `api_proxy.cjs` file to add a new endpoint to retrieve the details of a specific event. -- Added some detail about the type of event (eg sports vs music etc) in the event list (using styled icons) -- Implemented first stab at city and state search functionality. (work in progress). States are very US centric so we want to move on from that pattern. -- Handled 429 rate limit errors from the Ticketmaster API. There's probably a better way to do this, as we are presently surfacing the 429 in the UI. Going forward we should consider quietly retrying the request and showing a loading spinner while waiting for the retry. -- Updated the api_proxy.cjs and vite.config.ts files to use the API_PROXY_PORT variable. -- Updated the .env file to include DEFAULT_EVENTS_PER_PAGE=7 and VITE_DEFAULT_EVENTS_PER_PAGE=7. -- Updated the api_proxy.cjs file to access the DEFAULT_EVENTS_PER_PAGE variable from process.env. -- Updated the src/App.tsx file to read the VITE_DEFAULT_EVENTS_PER_PAGE variable from import.meta.env. -- Removed the state input from the app because it was making the UI unreadable on mobile. -- Implemented saving the city to local storage whenever the user searches for a city. -- Implemented making Boulder, CO the default city on page load (unless stored in local storage). -- Implemented saving the city to local storage whenever the user searches for a city. -- Implemented making Boulder, CO the default city on page load (unless stored in local storage). +### Configuration Files +- `vercel.json`: Routes API requests and handles CORS +- `vite.config.ts`: Proxies API requests during development +- Serverless functions in `/api` directory -## Next Steps -- Input validation for the search parameter(s) prior to the api_server making requests -- Allow the user to filter events by event type (eg music/concert, sports, film, etc.) -- Investigate whether the radius parameter to the Ticketmaster API is being honored. -- Determine the best way to integrate with Spotify for user preferences. +## Known Issues and Solutions +- Issue: HTML parsing in Vercel dev server + - Solution: Added `assetsInclude: ['**/*.html']` to Vite config +- Issue: ES module compatibility + - Solution: Converted serverless functions to use ES module syntax -## Important Patterns and Preferences -- Following the memory bank structure defined in .clinerules. -- Documenting all decisions and changes in the memory bank. -- Using `npm-run-all` to start both the Vite development server and the proxy server simultaneously. -- Using Tailwind to style HTML output +## Next Steps +1. Test local development setup with `vercel dev` +2. Verify API endpoints and frontend integration +3. Deploy to production and configure environment variables +4. Remove deprecated Express server files +5. Update documentation to reflect the migration to Vercel serverless functions +6. Monitor API rate limits and optimize caching strategies -## Learnings and Project Insights -- The project requires a strong focus on personalization and user experience. -- Integration with external APIs (music events, Spotify) will be crucial. -- The SeatGeek API also looks interesting and has been added to the list of music discovery APIs to explore. +## Development Workflow +1. Start Vercel dev server: `vercel dev` +2. Frontend automatically proxies API requests to Vercel dev server +3. Use browser dev tools to verify API requests and responses diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 1e83622..427442a 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -4,7 +4,11 @@ - User can click on an event and see (some) event details. - Handle 429 rate limiting errors returned by the Ticketmaster API. - Allowing the user to search for events in a particular City and State. Note this is US centric and thus needs to be reworked. -- An API proxy server implemented in node/express to prevent API keys from ending up in client side code +- Implemented `/api/events` serverless function for paginated event retrieval. +- Implemented `/api/events/:id` serverless function for event details retrieval. +- Updated `.env.template` with new environment variables (`VERCEL_DEV_PORT`, `RADIUS`, `RADIUS_UNIT`). +- Updated `README.md` with deployment instructions for Vercel. +- Removed Express API proxy server and replaced it with Vercel serverless functions. - Pulling events for a hardcoded region and radius from ticketmaster API. - Rendering the events in a simple but styled UI. - Allowing user to add events of interest to Google Calendar. @@ -35,14 +39,15 @@ - Implemented making Boulder, CO the default city on page load (unless stored in local storage). ## What's Left to Build -- Input validation for the search parameter(s) prior to the api_server making requests -- Allow user to "like" an event and store the like status in LocalStorage (for now) -- Allow the user to filter events by event type (eg music/concert, sports, film, etc.) +- Input validation for the search parameter(s) prior to the api_server making requests. +- Allow user to "like" an event and store the like status in LocalStorage (for now). +- Allow the user to filter events by event type (e.g., music/concert, sports, film, etc.). - Rework the search functionality to be less US-centric. - Implement the backend services for user authentication, music event discovery, and Spotify integration. - Develop the UI for the web and mobile app. - Integrate with third-party APIs for music events and Spotify. -- Deploy the app to Vercel. +- Monitor API rate limits and optimize caching strategies. +- Update documentation to reflect the migration to Vercel serverless functions. ## Current Status - Memory bank initialized. diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md index 9b5ff8f..8c214d6 100644 --- a/memory-bank/systemPatterns.md +++ b/memory-bank/systemPatterns.md @@ -10,8 +10,9 @@ - Dark mode support via Tailwind CSS ### API Layer -- Express proxy server for third-party API calls +- Vercel serverless functions for third-party API calls - RESTful endpoints for event data + - `/api/events`: Retrieves a paginated list of events based on city and radius. - `/api/events/:id`: Retrieves details for a specific event. - Rate limiting and caching implementation - Error handling and logging strategy diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index 14c07d1..38e4e48 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -52,9 +52,11 @@ The project uses environment variables to configure various settings. A `.env.te The following environment variables are used: - `API_KEY`: The API key for the Ticketmaster API. -- `DEFAULT_EVENTS_PER_PAGE`: The default number of events to display per page. -- `VITE_DEFAULT_EVENTS_PER_PAGE`: The default number of events to display per page (for Vite). -- `API_PROXY_PORT`: The port to run the Express API Proxy server on. +- `DEFAULT_EVENTS_PER_PAGE`: The default number of events to display per page (updated to 7). +- `VITE_DEFAULT_EVENTS_PER_PAGE`: The default number of events to display per page (updated to 7 for Vite). +- `VERCEL_DEV_PORT`: The port to run the Vercel dev server on (default: 3000). +- `RADIUS`: Search radius for events (default: 50). +- `RADIUS_UNIT`: Unit for the search radius (default: miles). - `ALLOWED_HOSTNAMES`: A comma-separated list of hostnames to allow the Vite dev server to respond to. - `VERCEL_ENV`: The environment variable for Vercel deployment (e.g., production, preview, development). diff --git a/package.json b/package.json index 7f9d788..e2d22b4 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,7 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "server": "NODE_ENV=production node api_proxy.cjs", - "dev:vite": "vite", - "dev:server": "NODE_ENV=development node api_proxy.cjs", - "dev": "npm-run-all --parallel --print-label dev:*" + "dev": "vite" }, "dependencies": { "@tailwindcss/vite": "^4.1.3", diff --git a/vercel.json b/vercel.json index fc23ce9..1148981 100644 --- a/vercel.json +++ b/vercel.json @@ -1,18 +1,43 @@ { + "framework": "vite", "version": 2, - "builds": [ + "buildCommand": "npm run build", + "outputDirectory": "dist", + "rewrites": [ { - "src": "package.json", - "use": "@vercel/static-build", - "config": { - "distDir": "dist" - } + "source": "/api/events/:id", + "destination": "/api/events/[id]" + }, + { + "source": "/api/events", + "destination": "/api/events" + }, + { + "source": "/(.*)", + "destination": "/index.html" } ], - "routes": [ + "headers": [ { - "src": "/(.*)", - "dest": "/index.html" + "source": "/api/(.*)", + "headers": [ + { + "key": "Access-Control-Allow-Credentials", + "value": "true" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "Access-Control-Allow-Methods", + "value": "GET,OPTIONS" + }, + { + "key": "Access-Control-Allow-Headers", + "value": "Content-Type" + } + ] } ] } diff --git a/vite.config.ts b/vite.config.ts index a5bd387..9c423bf 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,7 +4,7 @@ import tailwindcss from '@tailwindcss/vite' export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') - const apiProxyPort = env.API_PROXY_PORT || '3000' + const vercelDevPort = env.VERCEL_DEV_PORT || '3000' const allowedHostNames = env.ALLOWED_HOSTNAMES ? env.ALLOWED_HOSTNAMES.split(',') : [] if (command === 'serve') { @@ -13,7 +13,7 @@ export default defineConfig(({ command, mode }) => { console.table({ Mode: mode, 'Allowed Hosts': allowedHostNames.join(', ') || 'none', - 'API Proxy Port': apiProxyPort + 'Vercel Dev Port': vercelDevPort }) console.log() // Empty line for spacing } @@ -22,16 +22,20 @@ export default defineConfig(({ command, mode }) => { plugins: [react(), tailwindcss()], server: { allowedHosts: allowedHostNames, - proxy: { + proxy: command === 'serve' ? { '/api': { - target: `http://localhost:${apiProxyPort}`, + target: `http://127.0.0.1:${vercelDevPort}`, changeOrigin: true, + secure: false, + ws: true, + rewrite: (path) => path.replace(/^\/api/, '/api') // Explicitly rewrite paths if needed } - }, + } : undefined, logger: { info: true, debug: true } - } + }, + assetsInclude: ['**/*.html'] // Add this line } }) From 57131b6fb9be2f38148dc469692387d8c64c7d25 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 15:15:11 -0600 Subject: [PATCH 23/29] feat: set up testing framework, GitHub Actions, and Codecov integration - Added Jest as the testing framework and configured it for the project - Created test files for API endpoints (`events.js` and `[id].js`) with comprehensive test cases - Improved serverless functions (`events.js` and `[id].js`) with better input validation and error handling - Configured GitHub Actions workflow to run tests and upload coverage reports - Added Codecov integration with a custom `codecov.yml` file - Updated `README.md` with GitHub Actions and Codecov badges, and added test coverage instructions - Suggested adding `coverage/` to `.gitignore` to exclude coverage reports from version control --- .github/workflows/test.yml | 48 + .gitignore | 5 +- README.md | 9 +- __tests__/api/eventDetails.test.js | 177 + __tests__/api/events.test.js | 162 + __tests__/setup/testSetup.js | 21 + __tests__/utils/testUtils.js | 137 + api/events.js | 20 +- api/events/[id].js | 58 +- codecov.yml | 31 + jest.config.js | 21 + memory-bank/techContext.md | 3 + memory-bank/testing.md | 140 + package-lock.json | 13346 +++++++++++++++++++++++++++ package.json | 11 +- vite.config.ts | 3 +- 16 files changed, 14160 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 __tests__/api/eventDetails.test.js create mode 100644 __tests__/api/events.test.js create mode 100644 __tests__/setup/testSetup.js create mode 100644 __tests__/utils/testUtils.js create mode 100644 codecov.yml create mode 100644 jest.config.js create mode 100644 memory-bank/testing.md create mode 100644 package-lock.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..561fe23 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,48 @@ +name: Run Tests + +on: + push: + branches: + - main + - dev + pull_request: + branches: + - main + - dev + +jobs: + test: + runs-on: ubuntu-latest + + env: + VERCEL_DEV_PORT: 3000 + API_KEY: test-api-key + DEFAULT_EVENTS_PER_PAGE: 7 + RADIUS: 50 + RADIUS_UNIT: miles + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run tests with coverage + run: npm run test:coverage + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + directory: ./coverage + flags: unittests + name: musemeter-coverage + fail_ci_if_error: true + verbose: true + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 0cbf957..0dacf62 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ node_modules dist dist-ssr *.local -package-lock.json # Editor directories and files .vscode/* @@ -30,3 +29,7 @@ package-lock.json # private docs private/ + + +# testing +coverage/ diff --git a/README.md b/README.md index b89a6b4..db576be 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ [![React](https://img.shields.io/badge/React-19.0-blue.svg)](https://reactjs.org/) [![Vite](https://img.shields.io/badge/Vite-6.2-646CFF.svg)](https://vitejs.dev/) [![Tailwind](https://img.shields.io/badge/Tailwind-4.1-38B2AC.svg)](https://tailwindcss.com/) +[![Tests](https://github.com/alchemydc/musemeter/actions/workflows/test.yml/badge.svg)](https://github.com/alchemydc/musemeter/actions/workflows/test.yml) +[![codecov](https://codecov.io/gh/alchemydc/musemeter/branch/main/graph/badge.svg)](https://codecov.io/gh/alchemydc/musemeter)
    @@ -60,6 +62,9 @@ npm run dev # Run tests npm test +# Run tests with coverage +npm run test:coverage + # Lint code npm run lint @@ -67,8 +72,6 @@ npm run lint npm run build ``` - - ## 🚀 Deployment ### Prerequisites @@ -110,4 +113,4 @@ vercel dev ## 📝 License -[MIT](LICENSE) © 2025 MuseMeter \ No newline at end of file +[MIT](LICENSE) © 2025 MuseMeter diff --git a/__tests__/api/eventDetails.test.js b/__tests__/api/eventDetails.test.js new file mode 100644 index 0000000..856920a --- /dev/null +++ b/__tests__/api/eventDetails.test.js @@ -0,0 +1,177 @@ +import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; +import nock from 'nock'; +import handler from '../../api/events/[id].js'; + +describe('GET /api/events/:id', () => { + const mockEventId = '1'; + const mockEventDetails = { + id: mockEventId, + name: 'Concert A', + description: 'A great concert!', + url: 'http://example.com/event/1', + dates: { + start: { + localDate: '2025-05-01', + localTime: '19:00:00' + } + }, + priceRanges: [ + { + type: 'standard', + min: 45.0, + max: 125.0, + currency: 'USD' + } + ], + _embedded: { + venues: [{ + name: 'Venue A', + city: { name: 'Denver' }, + state: { stateCode: 'CO' }, + address: { + line1: '123 Main St' + } + }], + attractions: [{ + name: 'Artist A', + url: 'http://example.com/artist/1' + }] + } + }; + + beforeEach(() => { + // Set required environment variables + process.env.API_KEY = 'test-api-key'; + + // Clean up any existing nock interceptors + nock.cleanAll(); + + // Mock the Ticketmaster API + nock('https://app.ticketmaster.com') + .get(`/discovery/v2/events/${mockEventId}.json`) + .query(true) + .reply(200, mockEventDetails); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + it('should return details for a specific event', async () => { + const req = { + method: 'GET', + query: { id: mockEventId } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockEventDetails); + }); + + it('should handle non-existent event ID', async () => { + const nonExistentId = '999'; + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get(`/discovery/v2/events/${nonExistentId}.json`) + .query(true) + .reply(404, { error: 'Not Found' }); + + const req = { + method: 'GET', + query: { id: nonExistentId } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(404); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle Ticketmaster API errors', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get(`/discovery/v2/events/${mockEventId}.json`) + .query(true) + .reply(500, { error: 'Internal Server Error' }); + + const req = { + method: 'GET', + query: { id: mockEventId } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(500); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle rate limiting from Ticketmaster API', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get(`/discovery/v2/events/${mockEventId}.json`) + .query(true) + .reply(429, { error: 'Rate limit exceeded' }); + + const req = { + method: 'GET', + query: { id: mockEventId } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(429); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.stringContaining('Rate limit exceeded') + })); + }); + + it('should handle invalid event ID format', async () => { + const invalidId = 'invalid-id@#$'; + const req = { + method: 'GET', + query: { id: invalidId } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(400); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); +}); diff --git a/__tests__/api/events.test.js b/__tests__/api/events.test.js new file mode 100644 index 0000000..b87f5bc --- /dev/null +++ b/__tests__/api/events.test.js @@ -0,0 +1,162 @@ +import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; +import nock from 'nock'; +import handler from '../../api/events.js'; + +describe('GET /api/events', () => { + const mockEvents = { + _embedded: { + events: [ + { + id: '1', + name: 'Concert A', + url: 'http://example.com/a', + dates: { + start: { + localDate: '2025-05-01', + localTime: '19:00:00' + } + }, + _embedded: { + venues: [{ + name: 'Venue A', + city: { name: 'Denver' }, + state: { stateCode: 'CO' } + }] + } + }, + { + id: '2', + name: 'Concert B', + url: 'http://example.com/b', + dates: { + start: { + localDate: '2025-05-02', + localTime: '20:00:00' + } + }, + _embedded: { + venues: [{ + name: 'Venue B', + city: { name: 'Denver' }, + state: { stateCode: 'CO' } + }] + } + } + ] + }, + page: { + size: 20, + totalElements: 2, + totalPages: 1, + number: 0 + } + }; + + beforeEach(() => { + // Set required environment variables + process.env.API_KEY = 'test-api-key'; + process.env.DEFAULT_EVENTS_PER_PAGE = '2'; + + // Clean up any existing nock interceptors + nock.cleanAll(); + + // Mock the Ticketmaster API + nock('https://app.ticketmaster.com') + .get('/discovery/v2/events.json') + .query(true) + .reply(200, mockEvents); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + it('should return a list of events for Denver', async () => { + const req = { + method: 'GET', + query: { city: 'Denver' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockEvents); + }); + + it('should handle missing city parameter', async () => { + const req = { + method: 'GET', + query: {} + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle Ticketmaster API errors', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/events.json') + .query(true) + .reply(500, { error: 'Internal Server Error' }); + + const req = { + method: 'GET', + query: { city: 'Denver' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(500); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle rate limiting from Ticketmaster API', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/events.json') + .query(true) + .reply(429, { error: 'Rate limit exceeded' }); + + const req = { + method: 'GET', + query: { city: 'Denver' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(429); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.stringContaining('Rate limit exceeded') + })); + }); +}); diff --git a/__tests__/setup/testSetup.js b/__tests__/setup/testSetup.js new file mode 100644 index 0000000..8226664 --- /dev/null +++ b/__tests__/setup/testSetup.js @@ -0,0 +1,21 @@ +import { jest } from '@jest/globals'; +import nock from 'nock'; + +// Set up environment variables for tests +process.env.VERCEL_DEV_PORT = process.env.VERCEL_DEV_PORT || '3000'; +process.env.API_KEY = process.env.API_KEY || 'test-api-key'; +process.env.DEFAULT_EVENTS_PER_PAGE = process.env.DEFAULT_EVENTS_PER_PAGE || '7'; +process.env.RADIUS = process.env.RADIUS || '50'; +process.env.RADIUS_UNIT = process.env.RADIUS_UNIT || 'miles'; + +// Reset mocks and clean up before each test +beforeEach(() => { + jest.clearAllMocks(); + nock.cleanAll(); +}); + +// Clean up after all tests +afterAll(() => { + jest.clearAllMocks(); + nock.restore(); +}); diff --git a/__tests__/utils/testUtils.js b/__tests__/utils/testUtils.js new file mode 100644 index 0000000..9218b0f --- /dev/null +++ b/__tests__/utils/testUtils.js @@ -0,0 +1,137 @@ +import nock from 'nock'; + +// Base URL for API requests in tests +const TEST_API_URL = `http://localhost:${process.env.VERCEL_DEV_PORT}`; + +// Base URL for Ticketmaster API +const TICKETMASTER_API_URL = 'https://app.ticketmaster.com'; + +// Common mock data +const mockEvents = { + _embedded: { + events: [ + { + id: '1', + name: 'Concert A', + url: 'http://example.com/a', + dates: { + start: { + localDate: '2025-05-01', + localTime: '19:00:00' + } + }, + _embedded: { + venues: [{ + name: 'Venue A', + city: { name: 'Denver' }, + state: { stateCode: 'CO' } + }] + } + }, + { + id: '2', + name: 'Concert B', + url: 'http://example.com/b', + dates: { + start: { + localDate: '2025-05-02', + localTime: '20:00:00' + } + }, + _embedded: { + venues: [{ + name: 'Venue B', + city: { name: 'Denver' }, + state: { stateCode: 'CO' } + }] + } + } + ] + }, + page: { + size: 20, + totalElements: 2, + totalPages: 1, + number: 0 + } +}; + +const mockEventDetails = { + id: '1', + name: 'Concert A', + description: 'A great concert!', + url: 'http://example.com/event/1', + dates: { + start: { + localDate: '2025-05-01', + localTime: '19:00:00' + } + }, + priceRanges: [ + { + type: 'standard', + min: 45.0, + max: 125.0, + currency: 'USD' + } + ], + _embedded: { + venues: [{ + name: 'Venue A', + city: { name: 'Denver' }, + state: { stateCode: 'CO' }, + address: { + line1: '123 Main St' + } + }], + attractions: [{ + name: 'Artist A', + url: 'http://example.com/artist/1' + }] + } +}; + +// Helper functions for common test operations +const mockTicketmasterEvents = (city = 'Denver') => { + nock(TICKETMASTER_API_URL) + .get('/discovery/v2/events.json') + .query(true) + .reply(200, mockEvents); +}; + +const mockTicketmasterEventDetails = (eventId = '1') => { + nock(TICKETMASTER_API_URL) + .get(`/discovery/v2/events/${eventId}.json`) + .query(true) + .reply(200, mockEventDetails); +}; + +const mockTicketmasterError = (statusCode, endpoint = '/discovery/v2/events.json') => { + nock(TICKETMASTER_API_URL) + .get(endpoint) + .query(true) + .reply(statusCode, { error: getErrorMessage(statusCode) }); +}; + +const getErrorMessage = (statusCode) => { + switch (statusCode) { + case 404: + return 'Not Found'; + case 429: + return 'Rate limit exceeded'; + case 500: + return 'Internal Server Error'; + default: + return 'Unknown error'; + } +}; + +export { + TEST_API_URL, + TICKETMASTER_API_URL, + mockEvents, + mockEventDetails, + mockTicketmasterEvents, + mockTicketmasterEventDetails, + mockTicketmasterError, +}; diff --git a/api/events.js b/api/events.js index 56a5ccc..1e505c8 100644 --- a/api/events.js +++ b/api/events.js @@ -19,6 +19,17 @@ const validateEnv = () => { } }; +// Validate request parameters +const validateRequest = (req) => { + if (!req.query.city) { + return { + isValid: false, + error: 'City parameter is required' + }; + } + return { isValid: true }; +}; + export default async (req, res) => { try { // Enable CORS @@ -35,6 +46,12 @@ export default async (req, res) => { // Validate environment variables validateEnv(); + // Validate request parameters + const validation = validateRequest(req); + if (!validation.isValid) { + return res.status(400).json({ error: validation.error }); + } + // Extract pagination parameters and city from query const page = parseInt(req.query.page) || 0; const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; @@ -109,8 +126,7 @@ export default async (req, res) => { } return res.status(error.response?.status || 500).json({ - error: 'Failed to fetch events', - message: error.message + error: error.message || 'Failed to fetch events' }); } }; diff --git a/api/events/[id].js b/api/events/[id].js index 96257a8..b4dfb81 100644 --- a/api/events/[id].js +++ b/api/events/[id].js @@ -15,6 +15,26 @@ const validateEnv = () => { } }; +// Validate request parameters +const validateRequest = (req) => { + if (!req.query.id) { + return { + isValid: false, + error: 'Event ID is required' + }; + } + + // Check for valid event ID format (alphanumeric and hyphens only) + if (!/^[a-zA-Z0-9-]+$/.test(req.query.id)) { + return { + isValid: false, + error: 'Invalid event ID format' + }; + } + + return { isValid: true }; +}; + export default async (req, res) => { try { // Enable CORS @@ -31,34 +51,27 @@ export default async (req, res) => { // Validate environment variables validateEnv(); - const { id } = req.query; - debug(`Fetching event details for ID: ${id}`); + // Validate request parameters + const validation = validateRequest(req); + if (!validation.isValid) { + return res.status(400).json({ error: validation.error }); + } + + // Extract event ID from query + const eventId = req.query.id; - const url = `https://app.ticketmaster.com/discovery/v2/events/${id}.json`; + // Make request to Ticketmaster API + const url = `https://app.ticketmaster.com/discovery/v2/events/${eventId}.json`; debug(`Calling Ticketmaster API: ${url}`); - debug('Environment:', { - hasApiKey: !!process.env.API_KEY, - nodeEnv: process.env.NODE_ENV - }); const response = await axios.get(url, { params: { apikey: process.env.API_KEY } }); - - debug(`Ticketmaster API response status: ${response.status}`); - debug('Response structure:', { - hasData: !!response.data, - eventName: response.data?.name, - hasVenues: !!response.data?._embedded?.venues, - hasAttractions: !!response.data?._embedded?.attractions - }); - - // Add response data validation - if (!response.data) { - throw new Error('Invalid API response: missing data'); - } + + debug('Response status:', response.status); + debug('Response data:', response.data); // Return the response data return res.status(200).json(response.data); @@ -90,16 +103,15 @@ export default async (req, res) => { }); } - // Handle event not found + // Handle not found errors if (error.response?.status === 404) { return res.status(404).json({ error: 'Event not found' }); } - // Return an error response return res.status(error.response?.status || 500).json({ - error: error.message || 'Failed to fetch event details' + error: error.message || 'Failed to fetch event details' }); } }; diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..186f7e7 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,31 @@ +coverage: + precision: 2 + round: down + range: "70...100" + + status: + project: + default: + target: 70% + threshold: 5% + patch: + default: + target: 70% + threshold: 5% + changes: false + +comment: + layout: "reach, diff, flags, files" + behavior: default + require_changes: false + require_base: no + require_head: no + +ignore: + - "coverage/**/*" + - "dist/**/*" + - "**/*.d.ts" + - "**/*.test.ts" + - "**/*.test.tsx" + - "**/*.test.js" + - "jest.config.js" diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..847bdb6 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,21 @@ +export default { + testEnvironment: 'node', + testMatch: ['**/__tests__/**/*.test.js'], + extensionsToTreatAsEsm: ['.ts'], + transform: {}, + collectCoverage: true, + coverageDirectory: 'coverage', + // Configure moduleNameMapper for aliases and ES modules + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + '^@/(.*)$': '/src/$1', + }, + // Add globals needed by tests + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.json', + }, + }, + // Setup files to run after env initialization + setupFilesAfterEnv: ['/__tests__/setup/testSetup.js'], +}; diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index 38e4e48..fdca618 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -40,11 +40,14 @@ The Ticketmaster Discovery API uses the following structure for pagination: - Prettier ### Testing & Quality +Test methodology is described in detail in [testing.md](testing.md) + - Jest: JavaScript testing framework - React Testing Library: Component testing utilities - ESLint: Static code analysis - Prettier: Code formatting + ## Environment Variables The project uses environment variables to configure various settings. A `.env.template` file is provided to define the required environment variables. diff --git a/memory-bank/testing.md b/memory-bank/testing.md new file mode 100644 index 0000000..0774dc2 --- /dev/null +++ b/memory-bank/testing.md @@ -0,0 +1,140 @@ +# Testing Documentation + +## Overview +This project uses Jest as its testing framework, along with additional tools: +- `supertest` for HTTP assertions +- `nock` for mocking HTTP requests +- Custom test utilities for common testing scenarios + +## Test Structure +``` +__tests__/ +├── api/ # API endpoint tests +│ ├── events.test.js # Tests for /api/events +│ └── eventDetails.test.js # Tests for /api/events/:id +├── setup/ +│ └── testSetup.js # Global test configuration +└── utils/ + └── testUtils.js # Shared test utilities +``` + +## Running Tests + +### All Tests +```bash +npm test +``` + +### Watch Mode +Run tests in watch mode (tests re-run when files change): +```bash +npm run test:watch +``` + +### API Tests Only +Run only the API endpoint tests: +```bash +npm run test:api +``` + +Watch mode for API tests: +```bash +npm run test:api:watch +``` + +### Coverage Report +Generate a test coverage report: +```bash +npm run test:coverage +``` +The coverage report will be available in the `coverage/` directory. + +## Test Environment + +### Environment Variables +Tests use the following environment variables (with defaults): +- `VERCEL_DEV_PORT`: Port for the development server (default: 3000) +- `API_KEY`: Ticketmaster API key (default: 'test-api-key') +- `DEFAULT_EVENTS_PER_PAGE`: Number of events per page (default: 7) +- `RADIUS`: Search radius (default: 50) +- `RADIUS_UNIT`: Unit for search radius (default: 'miles') + +These defaults are set in `__tests__/setup/testSetup.js`. + +### Mocking +The project uses `nock` to mock HTTP requests to external APIs. Mock implementations are centralized in `__tests__/utils/testUtils.js`. + +Example of mocking an API call: +```javascript +const { mockTicketmasterEvents } = require('../utils/testUtils'); + +describe('Events API', () => { + beforeEach(() => { + mockTicketmasterEvents(); + }); + + it('returns events', async () => { + // Test implementation + }); +}); +``` + +## Writing Tests + +### API Tests +For API endpoints, follow this pattern: +1. Import necessary utilities +2. Set up mocks in `beforeEach` +3. Clean up mocks in `afterEach` +4. Test happy path +5. Test edge cases +6. Test error scenarios + +Example: +```javascript +const supertest = require('supertest'); +const { + TEST_API_URL, + mockTicketmasterEvents, + mockTicketmasterError +} = require('../utils/testUtils'); + +describe('GET /api/events', () => { + beforeEach(() => { + mockTicketmasterEvents(); + }); + + it('returns events for a city', async () => { + const response = await supertest(TEST_API_URL) + .get('/api/events') + .query({ city: 'Denver' }); + + expect(response.status).toBe(200); + expect(response.body._embedded.events).toBeTruthy(); + }); + + it('handles errors', async () => { + mockTicketmasterError(500); + const response = await supertest(TEST_API_URL) + .get('/api/events') + .query({ city: 'Denver' }); + + expect(response.status).toBe(500); + }); +}); +``` + +## Best Practices +1. Use the shared test utilities for common operations +2. Clean up mocks after each test +3. Test both success and error cases +4. Keep tests focused and meaningful +5. Use descriptive test names +6. Maintain test isolation (no test should depend on another) + +## Adding New Tests +1. Create test files in the appropriate directory +2. Import required utilities from `testUtils.js` +3. Follow the existing patterns for consistency +4. Add new utilities to `testUtils.js` if needed +5. Update this documentation when adding new patterns or conventions diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b45759a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13346 @@ +{ + "name": "musemeter", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "musemeter", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.3", + "axios": "^1.8.4", + "cors": "^2.8.5", + "dotenv": "^16.5.0", + "express": "^5.1.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.1.3" + }, + "devDependencies": { + "@babel/preset-env": "^7.26.9", + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "jest": "^29.7.0", + "nock": "^14.0.3", + "npm-run-all": "^4.1.5", + "supertest": "^7.1.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vercel": "^41.6.1", + "vite": "^6.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.2.tgz", + "integrity": "sha512-nwgc7jPn3LpZ4JWsoHtuwBsad1qSSLDDX634DdG0PBJofIuIEtSWk4KkRmuXyu178tjuHAbwiMNNzwqIyLYxZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@edge-runtime/format": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", + "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/node-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", + "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/ponyfill": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", + "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/primitives": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", + "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/vm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", + "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/primitives": "4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.5.tgz", + "integrity": "sha512-YSa0sYrniWIfsJBabu/YRVG10v5bqWk0PprwERFDEd776nAe/aafkUd68g7vOhVK1xG2H+Pb8e3sAnCOu/V47w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "jsdom": "^26.0.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", + "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", + "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-x64": "4.1.3", + "@tailwindcss/oxide-freebsd-x64": "4.1.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-x64-musl": "4.1.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", + "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", + "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", + "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", + "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", + "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", + "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", + "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", + "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", + "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", + "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", + "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", + "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", + "tailwindcss": "4.1.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.1.tgz", + "integrity": "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", + "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/type-utils": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", + "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", + "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", + "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", + "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", + "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", + "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", + "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/build-utils": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-10.5.1.tgz", + "integrity": "sha512-BtqwEmU1AoITpd0KxYrdQOwyKZL8RKba+bWxI8mr3gXPQZWRAE9ok1zF0AXfvMGCstYPHBPNolZGDSfWmY2jqg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/error-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/fun": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vercel/fun/-/fun-1.1.5.tgz", + "integrity": "sha512-vRuR7qlsl8CgdeQIhfgLDtbMEuxqltx6JWFahB7Q5VOKMo/sFZV1rCxIHsHsJP4yYY2hoZqlT/EUkfG1tfPicg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@tootallnate/once": "2.0.0", + "async-listen": "1.2.0", + "debug": "4.3.4", + "generic-pool": "3.4.2", + "micro": "9.3.5-canary.3", + "ms": "2.1.1", + "node-fetch": "2.6.7", + "path-match": "1.2.4", + "promisepipe": "3.0.0", + "semver": "7.5.4", + "stat-mode": "0.3.0", + "stream-to-promise": "2.2.0", + "tar": "6.2.1", + "tinyexec": "0.3.2", + "tree-kill": "1.2.2", + "uid-promise": "1.0.0", + "uuid": "3.3.2", + "xdg-app-paths": "5.1.0", + "yauzl-promise": "2.1.3" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@vercel/fun/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vercel/fun/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/fun/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vercel/fun/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/fun/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vercel/fun/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vercel/gatsby-plugin-vercel-analytics": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz", + "integrity": "sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "web-vitals": "0.2.4" + } + }, + "node_modules/@vercel/gatsby-plugin-vercel-builder": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.80.tgz", + "integrity": "sha512-MC1Gx6eRfmqaARL1DczldYzA3NdMlnC5vY/AXBSZuiHCoENS4++duEjhDjMtRSiidwSCrjuaz5Y9yxKTocRmzA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "0.25.24", + "@vercel/build-utils": "10.5.1", + "esbuild": "0.14.47", + "etag": "1.8.1", + "fs-extra": "11.1.0" + } + }, + "node_modules/@vercel/gatsby-plugin-vercel-builder/node_modules/esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "node_modules/@vercel/go": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.2.1.tgz", + "integrity": "sha512-ezjmuUvLigH9V4egEaX0SZ+phILx8lb+Zkp1iTqKI+yl/ibPAtVo5o+dLSRAXU9U01LBmaLu3O8Oxd/JpWYCOw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/hydrogen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.2.0.tgz", + "integrity": "sha512-kdZp8cTVLoNmnu24wtoQPu9ZO+uB00zvDMTOXlQmNdq/V3k0mQa/Q5k2B8nliBQ3BMiBasoXxMKv59+F8rYvDw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/static-config": "3.0.0", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/next": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.7.7.tgz", + "integrity": "sha512-PMLk2d7dha41ciXwJ9v2UsgoNl7ThaBOnb0vqtLoEzpnzNYiz71V7c31vLcI3us0LE/bSazPKNg0Ok9lgo5nJA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/nft": "0.27.10" + } + }, + "node_modules/@vercel/nft": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", + "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0-rc.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vercel/node": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.1.14.tgz", + "integrity": "sha512-kLXAR4ZtNSXJw5ffIzKPDAVHD4/Dwxw/287ZCnQlqtOQzY3IH1E5QM3nxn0LGfTkYxXpQFFOOcXL7fZW7MjC6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "16.18.11", + "@vercel/build-utils": "10.5.1", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "0.27.10", + "@vercel/static-config": "3.0.0", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.14.47", + "etag": "1.8.1", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "ts-node": "10.9.1", + "typescript": "4.9.5", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "16.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", + "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@vercel/node/node_modules/esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "node_modules/@vercel/node/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@vercel/node/node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@vercel/python": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@vercel/python/-/python-4.7.2.tgz", + "integrity": "sha512-i2QBNMvNxUZQ2e5vLIL7mUkLg5Qkl9nqxUNXCYezdyvk2Ql6xYKjg7tMhpK/uiy094KfZSOECpDbDxkIN0jUSw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/redwood": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.3.0.tgz", + "integrity": "sha512-MybbGdMZY0/CrpgEGafJZ+8HlqubWnEpl/KX3WClCZPrT2qcyZyJEh9AVN7/KIpQUdB2MQLIRVMQFQ+kKcRdsA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/nft": "0.27.10", + "@vercel/static-config": "3.0.0", + "semver": "6.3.1", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/remix-builder": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-5.4.3.tgz", + "integrity": "sha512-i+uPSIOBygkXLc6unOkfrJ0jNdqzRRZ8Esu+8kt/OPm4VCOHro3hyiMxFDtdvPWDQfulVOeDNkXnqlgLRDVdlw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "0.27.10", + "@vercel/static-config": "3.0.0", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/remix-builder/node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/ruby": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.2.0.tgz", + "integrity": "sha512-FJF9gKVNHAljGOgV6zS5ou2N7ZgjOqMMtcPA5lsJEUI5/AZzVDWCmtcowTP80wEtHuupkd7d7M399FA082kXYQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/static-build": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.7.6.tgz", + "integrity": "sha512-ezyZScIZgZIfzhNBBZroHIkcI6kP7WvBWKeLP1a8Vh2vipI+uuH6F52fDcjSH+uDpUxhfeml7HTMx2LVNTIXWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/gatsby-plugin-vercel-analytics": "1.0.11", + "@vercel/gatsby-plugin-vercel-builder": "2.0.80", + "@vercel/static-config": "3.0.0", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz", + "integrity": "sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-listen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-1.2.0.tgz", + "integrity": "sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.0.tgz", + "integrity": "sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "dev": true, + "license": "MIT" + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssstyle": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.1.1", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/edge-runtime": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", + "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/format": "2.2.1", + "@edge-runtime/ponyfill": "2.4.2", + "@edge-runtime/vm": "3.2.0", + "async-listen": "3.0.1", + "mri": "1.2.0", + "picocolors": "1.0.0", + "pretty-ms": "7.0.1", + "signal-exit": "4.0.2", + "time-span": "4.0.0" + }, + "bin": { + "edge-runtime": "dist/cli/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/edge-runtime/node_modules/async-listen": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", + "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/edge-runtime/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.136", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", + "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "integrity": "sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/end-of-stream/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", + "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", + "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", + "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", + "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", + "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", + "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", + "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", + "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", + "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", + "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", + "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", + "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", + "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", + "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", + "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", + "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", + "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", + "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", + "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", + "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events-intercept": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz", + "integrity": "sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.3.tgz", + "integrity": "sha512-pQEHGLZjLRyfLCe6r6n8IQGqHEceKfYR5tIf/iUDn5SabaitfVR/pIskxnyvSSl122J63rFY17i68hrfK0BVOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", + "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", + "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro": { + "version": "9.3.5-canary.3", + "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.5-canary.3.tgz", + "integrity": "sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "arg": "4.1.0", + "content-type": "1.0.4", + "raw-body": "2.4.1" + }, + "bin": { + "micro": "bin/micro.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/micro/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/micro/node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micro/node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/micro/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true, + "license": "ISC" + }, + "node_modules/micro/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro/node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nock": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.3.tgz", + "integrity": "sha512-sJ9RNmCuYBqXDmGZZHgZ1D1441MqFOU4T5aeLGVGEB4OWI/2LM0mZlkfBQzQKdOfJypL+2nPPBugXKjixBn4kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mswjs/interceptors": "^0.38.1", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">=18.20.0 <20 || >=20.12.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-paths": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", + "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-match": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/path-match/-/path-match-1.2.4.tgz", + "integrity": "sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-errors": "~1.4.0", + "path-to-regexp": "^1.0.0" + } + }, + "node_modules/path-match/node_modules/http-errors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz", + "integrity": "sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.1", + "statuses": ">= 1.2.1 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/path-match/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-match/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-match/node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-match/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/path-to-regexp-updated": { + "name": "path-to-regexp", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/promisepipe": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/promisepipe/-/promisepipe-3.0.0.tgz", + "integrity": "sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stat-mode": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", + "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/stream-to-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz", + "integrity": "sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "~1.3.0", + "end-of-stream": "~1.1.0", + "stream-to-array": "~2.3.0" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.0.tgz", + "integrity": "sha512-5QeSO8hSrKghtcWEoPiO036fxH0Ii2wVQfFZSP0oqQhmjk8bOLhDFXr4JrvaFmPuEWUoq4znY3uSi8UzLKxGqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", + "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", + "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.29.1", + "@typescript-eslint/parser": "8.29.1", + "@typescript-eslint/utils": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/uid-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz", + "integrity": "sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vercel": { + "version": "41.6.1", + "resolved": "https://registry.npmjs.org/vercel/-/vercel-41.6.1.tgz", + "integrity": "sha512-Xly6uozzOHm6VT2nB6l0IydEyhRNGvxU7aBnIA5CD2rt+HjLq+Dz9qIYC6XmcpBbR1EWkG2uCyM11k7pt+uHXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/build-utils": "10.5.1", + "@vercel/fun": "1.1.5", + "@vercel/go": "3.2.1", + "@vercel/hydrogen": "1.2.0", + "@vercel/next": "4.7.7", + "@vercel/node": "5.1.14", + "@vercel/python": "4.7.2", + "@vercel/redwood": "2.3.0", + "@vercel/remix-builder": "5.4.3", + "@vercel/ruby": "2.2.0", + "@vercel/static-build": "2.7.6", + "chokidar": "4.0.0", + "jose": "5.9.6" + }, + "bin": { + "vc": "dist/vc.js", + "vercel": "dist/vc.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/vite": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-vitals": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", + "integrity": "sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-app-paths": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz", + "integrity": "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xdg-portable": "^7.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/xdg-portable": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", + "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-paths": "^4.0.1" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yauzl-clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/yauzl-clone/-/yauzl-clone-1.0.4.tgz", + "integrity": "sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-intercept": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl-promise": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-2.1.3.tgz", + "integrity": "sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "yauzl": "^2.9.1", + "yauzl-clone": "^1.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index e2d22b4..bacde14 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,12 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "dev": "vite" + "dev": "vite", + "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js", + "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch", + "test:api": "node --experimental-vm-modules node_modules/jest/bin/jest.js __tests__/api/", + "test:api:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js __tests__/api/ --watch", + "test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage" }, "dependencies": { "@tailwindcss/vite": "^4.1.3", @@ -20,6 +25,7 @@ "tailwindcss": "^4.1.3" }, "devDependencies": { + "@babel/preset-env": "^7.26.9", "@eslint/js": "^9.21.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", @@ -28,7 +34,10 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", + "jest": "^29.7.0", + "nock": "^14.0.3", "npm-run-all": "^4.1.5", + "supertest": "^7.1.0", "typescript": "~5.7.2", "typescript-eslint": "^8.24.1", "vercel": "^41.6.1", diff --git a/vite.config.ts b/vite.config.ts index 9c423bf..e462ac0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -35,7 +35,6 @@ export default defineConfig(({ command, mode }) => { info: true, debug: true } - }, - assetsInclude: ['**/*.html'] // Add this line + } } }) From 3d4f18cd685addc321ba967edc740eef3d45b6bf Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 15:26:32 -0600 Subject: [PATCH 24/29] docs: update docs to reflect testing harness and (rudimentary) CI/CD integration --- memory-bank/activeContext.md | 61 ++++++++++++++++++++--------- memory-bank/techContext.md | 22 ++++++++++- memory-bank/testing.md | 75 +++++++++++++++++++++++++++--------- 3 files changed, 119 insertions(+), 39 deletions(-) diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 3e419b9..9be2ae8 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,19 +1,36 @@ # Active Context ## Current Development Focus -- Converting Express API to Vercel serverless functions -- Configuring local development environment to use Vercel dev server -- Integrating frontend with serverless functions +- Setting up automated testing infrastructure +- Implementing test coverage reporting and monitoring +- Improving API endpoint input validation and error handling ## Latest Changes -- Converted API endpoints to ES module syntax for Vercel serverless functions -- Updated Vite configuration to proxy API requests to Vercel dev server -- Added CORS headers and API route rewrites in vercel.json -- Implemented `/api/events` serverless function for paginated event retrieval -- Implemented `/api/events/:id` serverless function for event details retrieval -- Updated `.env.template` with new environment variables (`VERCEL_DEV_PORT`, `RADIUS`, `RADIUS_UNIT`) -- Updated `README.md` with deployment instructions for Vercel -- Removed Express API proxy server and replaced it with Vercel serverless functions +- Set up Jest testing framework with ES module support +- Created comprehensive test suite for API endpoints +- Configured GitHub Actions for automated testing +- Integrated Codecov for test coverage reporting +- Added input validation and error handling to serverless functions +- Updated documentation with testing instructions +- Added GitHub Actions and Codecov badges to README + +## Testing Infrastructure +### Local Testing +- Jest runs tests with ESM support +- Mock API responses using `nock` +- Environment variables configured in test setup + +### CI/CD Pipeline +- GitHub Actions runs tests on push and pull requests +- Coverage reports uploaded to Codecov +- Branch-specific coverage tracking +- Coverage thresholds set at 70% + +### Test Files +- `__tests__/api/events.test.js`: Event listing endpoint tests +- `__tests__/api/eventDetails.test.js`: Event details endpoint tests +- `__tests__/setup/testSetup.js`: Global test configuration +- `__tests__/utils/testUtils.js`: Shared test utilities ## Environment Setup ### Local Development @@ -28,6 +45,8 @@ ### Configuration Files - `vercel.json`: Routes API requests and handles CORS - `vite.config.ts`: Proxies API requests during development +- `jest.config.js`: Test configuration with ESM support +- `codecov.yml`: Coverage reporting configuration - Serverless functions in `/api` directory ## Known Issues and Solutions @@ -35,16 +54,20 @@ - Solution: Added `assetsInclude: ['**/*.html']` to Vite config - Issue: ES module compatibility - Solution: Converted serverless functions to use ES module syntax +- Issue: Test environment setup + - Solution: Added proper ESM support and test utilities ## Next Steps -1. Test local development setup with `vercel dev` -2. Verify API endpoints and frontend integration -3. Deploy to production and configure environment variables -4. Remove deprecated Express server files -5. Update documentation to reflect the migration to Vercel serverless functions -6. Monitor API rate limits and optimize caching strategies +1. Monitor test coverage and maintain/improve coverage levels +2. Add more edge case tests for API endpoints +3. Set up component testing for frontend +4. Implement API response caching +5. Add integration tests for frontend-API interaction +6. Consider adding end-to-end testing with Cypress or Playwright ## Development Workflow 1. Start Vercel dev server: `vercel dev` -2. Frontend automatically proxies API requests to Vercel dev server -3. Use browser dev tools to verify API requests and responses +2. Run tests: `npm run test:api` +3. Check coverage: `npm run test:coverage` +4. Frontend automatically proxies API requests to Vercel dev server +5. Use browser dev tools to verify API requests and responses diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index fdca618..42cd0c6 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -33,6 +33,8 @@ The Ticketmaster Discovery API uses the following structure for pagination: ### Development Tools - Git: Distributed version control system for code management - GitHub: Collaboration platform for code hosting and CI/CD + - GitHub Actions for automated testing and coverage reporting + - Codecov integration for test coverage analysis - VS Code: Primary IDE with extensions for: - TypeScript - Tailwind CSS @@ -42,11 +44,27 @@ The Ticketmaster Discovery API uses the following structure for pagination: ### Testing & Quality Test methodology is described in detail in [testing.md](testing.md) -- Jest: JavaScript testing framework +- Jest: JavaScript testing framework for unit and integration tests + - Mock API responses using `nock` + - Environment configuration for consistent testing + - ESM support for modern JavaScript - React Testing Library: Component testing utilities - ESLint: Static code analysis - Prettier: Code formatting - +- Codecov: Test coverage reporting and analysis + - Coverage thresholds configured at 70% + - Branch-specific coverage tracking + - Automated reporting via GitHub Actions + +### CI/CD Pipeline +- GitHub Actions configured for: + - Running tests on push and pull requests + - Generating and uploading coverage reports + - Automated quality checks +- Codecov integration for: + - Coverage reports and badges + - Pull request coverage analysis + - Historical coverage tracking ## Environment Variables diff --git a/memory-bank/testing.md b/memory-bank/testing.md index 0774dc2..8ae9e2f 100644 --- a/memory-bank/testing.md +++ b/memory-bank/testing.md @@ -5,6 +5,8 @@ This project uses Jest as its testing framework, along with additional tools: - `supertest` for HTTP assertions - `nock` for mocking HTTP requests - Custom test utilities for common testing scenarios +- GitHub Actions for automated testing +- Codecov for coverage reporting and analysis ## Test Structure ``` @@ -49,6 +51,24 @@ npm run test:coverage ``` The coverage report will be available in the `coverage/` directory. +## Continuous Integration + +### GitHub Actions +The project uses GitHub Actions for automated testing. The workflow is defined in `.github/workflows/test.yml` and: +- Runs on push and pull requests to main and dev branches +- Sets up Node.js environment +- Installs dependencies using `npm ci` +- Runs tests with coverage reporting +- Uploads coverage reports to Codecov + +### Codecov Integration +Coverage reports are automatically uploaded to Codecov, which provides: +- Coverage trend analysis +- Pull request coverage checks +- Branch-specific coverage tracking +- Coverage thresholds (configured at 70%) +- Visual coverage reports and badges + ## Test Environment ### Environment Variables @@ -66,7 +86,7 @@ The project uses `nock` to mock HTTP requests to external APIs. Mock implementat Example of mocking an API call: ```javascript -const { mockTicketmasterEvents } = require('../utils/testUtils'); +import { mockTicketmasterEvents } from '../utils/testUtils.js'; describe('Events API', () => { beforeEach(() => { @@ -92,12 +112,9 @@ For API endpoints, follow this pattern: Example: ```javascript -const supertest = require('supertest'); -const { - TEST_API_URL, - mockTicketmasterEvents, - mockTicketmasterError -} = require('../utils/testUtils'); +import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; +import { TEST_API_URL, mockTicketmasterEvents, mockTicketmasterError } from '../utils/testUtils.js'; +import handler from '../../api/events.js'; describe('GET /api/events', () => { beforeEach(() => { @@ -105,21 +122,36 @@ describe('GET /api/events', () => { }); it('returns events for a city', async () => { - const response = await supertest(TEST_API_URL) - .get('/api/events') - .query({ city: 'Denver' }); - - expect(response.status).toBe(200); - expect(response.body._embedded.events).toBeTruthy(); + const req = { + method: 'GET', + query: { city: 'Denver' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + expect(res.status).toHaveBeenCalledWith(200); }); it('handles errors', async () => { mockTicketmasterError(500); - const response = await supertest(TEST_API_URL) - .get('/api/events') - .query({ city: 'Denver' }); - - expect(response.status).toBe(500); + const req = { + method: 'GET', + query: { city: 'Denver' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + expect(res.status).toHaveBeenCalledWith(500); }); }); ``` @@ -131,6 +163,10 @@ describe('GET /api/events', () => { 4. Keep tests focused and meaningful 5. Use descriptive test names 6. Maintain test isolation (no test should depend on another) +7. Use ES module syntax consistently +8. Properly mock external dependencies +9. Include input validation tests +10. Test error handling scenarios ## Adding New Tests 1. Create test files in the appropriate directory @@ -138,3 +174,6 @@ describe('GET /api/events', () => { 3. Follow the existing patterns for consistency 4. Add new utilities to `testUtils.js` if needed 5. Update this documentation when adding new patterns or conventions +6. Ensure test coverage meets thresholds +7. Include both unit and integration tests as appropriate +8. Document any special test requirements or setup From b8622483873719a6ae5cc1e6c755f2157d113b79 Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 18:52:07 -0600 Subject: [PATCH 25/29] feat: add artist/attraction search capability - Add new attractions API endpoint and handler - Implement attraction search and event filtering - Add attraction details endpoint for individual lookups - Create AttractionList component for search results - Update search UI to toggle between city and artist modes - Add proper TypeScript interfaces for API responses - Enhance error handling and loading states - Update sports icon to use ball design - Add test coverage for new API endpoints - Add documentation for attractions API endpoints - Improve venue location display in event list BREAKING CHANGE: The events API now handles both city and keyword-based searches --- __tests__/api/attractionDetails.test.js | 137 +++++++++++++ __tests__/api/attractions.test.js | 155 ++++++++++++++ __tests__/api/events.test.js | 49 ++++- api/attractions.js | 123 ++++++++++++ api/attractions/[id].js | 104 ++++++++++ api/events.js | 68 ++++--- memory-bank/progress.md | 9 +- memory-bank/ticketmaster_api.md | 27 +++ src/App.tsx | 256 +++++++++++++++++++----- src/components/AttractionList.tsx | 72 +++++++ src/components/ClassificationIcon.tsx | 3 +- src/events.ts | 151 +++++++------- src/types.ts | 84 ++++++++ vercel.json | 4 + 14 files changed, 1088 insertions(+), 154 deletions(-) create mode 100644 __tests__/api/attractionDetails.test.js create mode 100644 __tests__/api/attractions.test.js create mode 100644 api/attractions.js create mode 100644 api/attractions/[id].js create mode 100644 src/components/AttractionList.tsx create mode 100644 src/types.ts diff --git a/__tests__/api/attractionDetails.test.js b/__tests__/api/attractionDetails.test.js new file mode 100644 index 0000000..bfcd237 --- /dev/null +++ b/__tests__/api/attractionDetails.test.js @@ -0,0 +1,137 @@ +import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; +import nock from 'nock'; +import handler from '../../api/attractions/[id].js'; + +describe('GET /api/attractions/[id]', () => { + const mockAttraction = { + id: '1', + name: 'Taylor Swift', + type: 'artist', + classifications: [ + { + primary: true, + segment: { + id: 'KZFzniwnSyZfZ7v7nJ', + name: 'Music' + } + } + ], + url: 'http://example.com/taylor-swift', + images: [ + { + url: 'http://example.com/taylor-swift.jpg', + ratio: '16_9', + width: 1024, + height: 576 + } + ] + }; + + beforeEach(() => { + // Set required environment variables + process.env.API_KEY = 'test-api-key'; + + // Clean up any existing nock interceptors + nock.cleanAll(); + + // Mock the Ticketmaster API + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions/1') + .query(true) + .reply(200, mockAttraction); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + it('should return attraction details', async () => { + const req = { + method: 'GET', + query: { id: '1' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockAttraction); + }); + + it('should handle missing attraction ID', async () => { + const req = { + method: 'GET', + query: {} + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(400); + expect(res.json).toHaveBeenCalledWith({ + error: 'Attraction ID is required' + }); + }); + + it('should handle Ticketmaster API errors', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions/1') + .query(true) + .reply(500, { error: 'Internal Server Error' }); + + const req = { + method: 'GET', + query: { id: '1' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(500); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle not found attractions', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions/999') + .query(true) + .reply(404, { error: 'Not Found' }); + + const req = { + method: 'GET', + query: { id: '999' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(404); + expect(res.json).toHaveBeenCalledWith({ + error: 'Attraction not found' + }); + }); +}); diff --git a/__tests__/api/attractions.test.js b/__tests__/api/attractions.test.js new file mode 100644 index 0000000..455ceae --- /dev/null +++ b/__tests__/api/attractions.test.js @@ -0,0 +1,155 @@ +import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; +import nock from 'nock'; +import handler from '../../api/attractions.js'; + +describe('GET /api/attractions', () => { + const mockAttractions = { + _embedded: { + attractions: [ + { + id: '1', + name: 'Taylor Swift', + type: 'artist', + classifications: [ + { + primary: true, + segment: { + id: 'KZFzniwnSyZfZ7v7nJ', + name: 'Music' + } + } + ], + url: 'http://example.com/taylor-swift', + images: [ + { + url: 'http://example.com/taylor-swift.jpg', + ratio: '16_9', + width: 1024, + height: 576 + } + ] + }, + { + id: '2', + name: 'Taylor Swift Experience', + type: 'attraction', + url: 'http://example.com/taylor-swift-experience' + } + ] + }, + page: { + size: 20, + totalElements: 2, + totalPages: 1, + number: 0 + } + }; + + beforeEach(() => { + // Set required environment variables + process.env.API_KEY = 'test-api-key'; + process.env.DEFAULT_EVENTS_PER_PAGE = '2'; + + // Clean up any existing nock interceptors + nock.cleanAll(); + + // Mock the Ticketmaster API + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions.json') + .query(true) + .reply(200, mockAttractions); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + it('should return a list of attractions for a keyword search', async () => { + const req = { + method: 'GET', + query: { keyword: 'Taylor Swift' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockAttractions); + }); + + it('should handle missing keyword parameter', async () => { + const req = { + method: 'GET', + query: {} + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: 'Keyword parameter is required' + })); + }); + + it('should handle Ticketmaster API errors', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions.json') + .query(true) + .reply(500, { error: 'Internal Server Error' }); + + const req = { + method: 'GET', + query: { keyword: 'Taylor Swift' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(500); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.any(String) + })); + }); + + it('should handle rate limiting from Ticketmaster API', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/attractions.json') + .query(true) + .reply(429, { error: 'Rate limit exceeded' }); + + const req = { + method: 'GET', + query: { keyword: 'Taylor Swift' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(429); + expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ + error: expect.stringContaining('Rate limit exceeded') + })); + }); +}); diff --git a/__tests__/api/events.test.js b/__tests__/api/events.test.js index b87f5bc..7483af1 100644 --- a/__tests__/api/events.test.js +++ b/__tests__/api/events.test.js @@ -89,7 +89,7 @@ describe('GET /api/events', () => { expect(res.json).toHaveBeenCalledWith(mockEvents); }); - it('should handle missing city parameter', async () => { + it('should handle missing search parameters', async () => { const req = { method: 'GET', query: {} @@ -104,10 +104,55 @@ describe('GET /api/events', () => { await handler(req, res); expect(res.json).toHaveBeenCalledWith(expect.objectContaining({ - error: expect.any(String) + error: 'Either city or keyword parameter is required' })); }); + it('should return events for keyword search', async () => { + const req = { + method: 'GET', + query: { keyword: 'Taylor Swift' } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockEvents); + }); + + it('should prioritize city over keyword when both are provided', async () => { + nock.cleanAll(); + nock('https://app.ticketmaster.com') + .get('/discovery/v2/events.json') + .query(params => params.city === 'Denver' && !params.keyword) + .reply(200, mockEvents); + + const req = { + method: 'GET', + query: { + city: 'Denver', + keyword: 'Taylor Swift' + } + }; + + const res = { + setHeader: jest.fn(), + status: jest.fn().mockReturnThis(), + json: jest.fn() + }; + + await handler(req, res); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith(mockEvents); + }); + it('should handle Ticketmaster API errors', async () => { nock.cleanAll(); nock('https://app.ticketmaster.com') diff --git a/api/attractions.js b/api/attractions.js new file mode 100644 index 0000000..1ad8f04 --- /dev/null +++ b/api/attractions.js @@ -0,0 +1,123 @@ +console.log("attractions.js function triggered"); +import axios from 'axios'; + +// Debug logger utility +const debug = (...args) => { + if (process.env.NODE_ENV === 'development') { + console.log('[Debug]', ...args); + } +}; + +// Validate required environment variables +const validateEnv = () => { + if (!process.env.API_KEY) { + throw new Error('API_KEY environment variable is not set'); + } +}; + +// Validate request parameters +const validateRequest = (req) => { + if (!req.query.keyword) { + return { + isValid: false, + error: 'Keyword parameter is required' + }; + } + return { isValid: true }; +}; + +export default async (req, res) => { + try { + // Enable CORS + res.setHeader('Access-Control-Allow-Credentials', true); + res.setHeader('Access-Control-Allow-Origin', '*'); + + // Handle preflight request + if (req.method === 'OPTIONS') { + res.setHeader('Access-Control-Allow-Methods', 'GET,OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + return res.status(200).json({ message: 'OK' }); + } + + // Validate environment variables + validateEnv(); + + // Validate request parameters + const validation = validateRequest(req); + if (!validation.isValid) { + return res.status(400).json({ error: validation.error }); + } + + // Extract parameters from query + const page = parseInt(req.query.page) || 0; + const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; + const keyword = req.query.keyword; + + debug('Request params:', { page, size, keyword }); + debug('Environment:', { + hasApiKey: !!process.env.API_KEY, + nodeEnv: process.env.NODE_ENV + }); + + // Make request to Ticketmaster API + const url = 'https://app.ticketmaster.com/discovery/v2/attractions.json'; + debug(`Calling Ticketmaster API: ${url}`); + + const response = await axios.get(url, { + params: { + apikey: process.env.API_KEY, + keyword: keyword, + page: page, + size: size + } + }); + + debug('Response status:', response.status); + debug('Response structure:', { + hasData: !!response.data, + hasEmbedded: !!response.data?._embedded, + hasAttractions: !!response.data?._embedded?.attractions, + attractionCount: response.data?._embedded?.attractions?.length || 0 + }); + + // Validate response data + if (!response.data) { + debug('Invalid response:', response.data); + throw new Error('Invalid API response: missing data'); + } + + // Return the response data + return res.status(200).json(response.data); + + } catch (error) { + console.error('API Error:', error.message); + debug('Error details:', { + message: error.message, + status: error.response?.status, + data: error.response?.data, + config: { + url: error.config?.url, + params: error.config?.params + } + }); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + + // Handle missing API key + if (error.message === 'API_KEY environment variable is not set') { + return res.status(500).json({ + error: 'Server configuration error. Please contact support.' + }); + } + + return res.status(error.response?.status || 500).json({ + error: error.message || 'Failed to fetch attractions' + }); + } +}; diff --git a/api/attractions/[id].js b/api/attractions/[id].js new file mode 100644 index 0000000..5c72edc --- /dev/null +++ b/api/attractions/[id].js @@ -0,0 +1,104 @@ +console.log("attraction details function triggered"); +import axios from 'axios'; + +// Debug logger utility +const debug = (...args) => { + if (process.env.NODE_ENV === 'development') { + console.log('[Debug]', ...args); + } +}; + +// Validate required environment variables +const validateEnv = () => { + if (!process.env.API_KEY) { + throw new Error('API_KEY environment variable is not set'); + } +}; + +export default async (req, res) => { + try { + // Enable CORS + res.setHeader('Access-Control-Allow-Credentials', true); + res.setHeader('Access-Control-Allow-Origin', '*'); + + // Handle preflight request + if (req.method === 'OPTIONS') { + res.setHeader('Access-Control-Allow-Methods', 'GET,OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + return res.status(200).json({ message: 'OK' }); + } + + // Validate environment variables + validateEnv(); + + const { id } = req.query; + if (!id) { + return res.status(400).json({ error: 'Attraction ID is required' }); + } + + debug('Request params:', { id }); + debug('Environment:', { + hasApiKey: !!process.env.API_KEY, + nodeEnv: process.env.NODE_ENV + }); + + // Make request to Ticketmaster API + const url = `https://app.ticketmaster.com/discovery/v2/attractions/${id}`; + debug(`Calling Ticketmaster API: ${url}`); + + const response = await axios.get(url, { + params: { + apikey: process.env.API_KEY + } + }); + + debug('Response status:', response.status); + + // Validate response data + if (!response.data) { + debug('Invalid response:', response.data); + throw new Error('Invalid API response: missing data'); + } + + // Return the response data + return res.status(200).json(response.data); + + } catch (error) { + console.error('API Error:', error.message); + debug('Error details:', { + message: error.message, + status: error.response?.status, + data: error.response?.data, + config: { + url: error.config?.url, + params: error.config?.params + } + }); + + // Handle rate limiting specifically + if (error.response?.status === 429) { + return res.status(429).json({ + error: 'Rate limit exceeded. Please try again later.', + retryAfter: error.response.headers['retry-after'] || 30 + }); + } + + // Handle missing API key + if (error.message === 'API_KEY environment variable is not set') { + return res.status(500).json({ + error: 'Server configuration error. Please contact support.' + }); + } + + // Handle not found + if (error.response?.status === 404) { + return res.status(404).json({ + error: 'Attraction not found' + }); + } + + return res.status(error.response?.status || 500).json({ + error: error.message || 'Failed to fetch attraction details' + }); + } +}; diff --git a/api/events.js b/api/events.js index 1e505c8..8ea7d4a 100644 --- a/api/events.js +++ b/api/events.js @@ -21,10 +21,10 @@ const validateEnv = () => { // Validate request parameters const validateRequest = (req) => { - if (!req.query.city) { + if (!req.query.city && !req.query.keyword) { return { isValid: false, - error: 'City parameter is required' + error: 'Either city or keyword parameter is required' }; } return { isValid: true }; @@ -52,12 +52,12 @@ export default async (req, res) => { return res.status(400).json({ error: validation.error }); } - // Extract pagination parameters and city from query + // Extract parameters from query const page = parseInt(req.query.page) || 0; const size = parseInt(req.query.size) || process.env.DEFAULT_EVENTS_PER_PAGE || 20; - const city = req.query.city; + const { city, keyword } = req.query; - debug('Request params:', { page, size, city }); + debug('Request params:', { page, size, city, keyword }); debug('Environment:', { radius: RADIUS, radiusUnit: RADIUSUNIT, @@ -69,17 +69,24 @@ export default async (req, res) => { const url = 'https://app.ticketmaster.com/discovery/v2/events.json'; debug(`Calling Ticketmaster API: ${url}`); - const response = await axios.get(url, { - params: { - apikey: process.env.API_KEY, - city: city, - radius: RADIUS, - unit: RADIUSUNIT, - page: page, - size: size, - sort: 'date,asc' - } - }); + // Prepare API request parameters + const params = { + apikey: process.env.API_KEY, + page: page, + size: size, + sort: 'date,asc' + }; + + // Add search parameters based on what was provided + if (city) { + params.city = city; + params.radius = RADIUS; + params.unit = RADIUSUNIT; + } else if (keyword) { + params.keyword = keyword; + } + + const response = await axios.get(url, { params }); debug('Response status:', response.status); debug('Response structure:', { @@ -89,14 +96,27 @@ export default async (req, res) => { eventCount: response.data?._embedded?.events?.length || 0 }); - // Validate response data - if (!response.data || !response.data._embedded || !response.data._embedded.events) { - debug('Invalid response:', response.data); - throw new Error('Invalid API response: missing events data'); + // Initialize response structure + const finalResponse = { + page: response.data.page || { totalElements: 0, totalPages: 0, number: page, size }, + _links: response.data._links || {}, + }; + + // Add events if they exist + // Handle case where Ticketmaster API returns success but no events + if (!response.data._embedded?.events) { + debug('No events found in response'); + return res.status(404).json({ + error: keyword ? + 'No events found for this artist/venue.' : + 'No events found in this location.', + _embedded: { events: [] }, + page: { totalElements: 0, totalPages: 0, number: page, size } + }); } - // Return the response data - return res.status(200).json(response.data); + finalResponse._embedded = { events: response.data._embedded.events }; + return res.status(200).json(finalResponse); } catch (error) { console.error('API Error:', error.message); @@ -107,7 +127,9 @@ export default async (req, res) => { config: { url: error.config?.url, params: error.config?.params - } + }, + isAxiosError: error.isAxiosError, + stack: error.stack }); // Handle rate limiting specifically diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 427442a..08d9d8e 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -37,9 +37,16 @@ - Modified the src/App.tsx file to return results for Boulder, CO by default, if no default location is stored in LocalStorage - Implemented saving the city to local storage whenever the user searches for a city. - Implemented making Boulder, CO the default city on page load (unless stored in local storage). +- Implemented the ability to search for events by city. +- Added functionality to search for artists, leveraging the attractions endpoint under the hood. +- Introduced a new attractions endpoint to support artist-based searches. +- Updated the API layer to handle both city-based and artist-based search queries seamlessly. +- Enhanced the search interface to display results for both events and artists. +- Adjusted components to accommodate the new search capabilities. +- Added unit tests for the attractions endpoint to ensure reliability. +- Verified the functionality of city-based and artist-based searches through integration tests. ## What's Left to Build -- Input validation for the search parameter(s) prior to the api_server making requests. - Allow user to "like" an event and store the like status in LocalStorage (for now). - Allow the user to filter events by event type (e.g., music/concert, sports, film, etc.). - Rework the search functionality to be less US-centric. diff --git a/memory-bank/ticketmaster_api.md b/memory-bank/ticketmaster_api.md index 8e52db4..f3c8016 100644 --- a/memory-bank/ticketmaster_api.md +++ b/memory-bank/ticketmaster_api.md @@ -14,6 +14,33 @@ API keys should be passed as a query parameter named `apikey` in each request. F ## API Endpoints +### Search Attractions API + +The Search Attractions API allows you to search for artists, venues, or other attractions. + +The base URL for the Search Attractions API is: + +`https://app.ticketmaster.com/discovery/v2/attractions.json` + +The following parameters can be used to filter the results: + +* `apikey`: Your API key. +* `keyword`: A keyword to search for (e.g., artist name, venue name). +* `page`: The page number to retrieve. +* `size`: The number of results to return per page. + +### Example Usage + +#### Example 1: Search for an artist +`https://app.ticketmaster.com/discovery/v2/attractions.json?apikey=YOUR_API_KEY&keyword=Taylor+Swift` + +This will return information about the artist "Taylor Swift." + +#### Example 2: Search for a venue +`https://app.ticketmaster.com/discovery/v2/attractions.json?apikey=YOUR_API_KEY&keyword=Madison+Square+Garden` + +This will return information about the venue "Madison Square Garden." + ### Event Discovery API The Event Discovery API allows you to search for events based on various criteria, such as keyword, city, state, and date. diff --git a/src/App.tsx b/src/App.tsx index 5cacd20..bb9a345 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,8 @@ -//import React, { useState, useEffect } from 'react'; import { useState, useEffect } from 'react'; -//import axios from 'axios'; -import { Event, getEvents, ApiResponse } from './events'; +import { Event, Attraction } from './types'; +import { getEvents, getAttractions, getEventsByAttraction, getAttractionDetails } from './events'; +import type { ApiResponse } from './types'; +import AttractionList from './components/AttractionList'; import EventDetails from './EventDetails'; import ClassificationIcon from './components/ClassificationIcon'; import { useDebounce } from './hooks/useDebounce'; @@ -9,11 +10,15 @@ import { debug } from './utils/debug'; function App() { const [events, setEvents] = useState([]); + const [attractions, setAttractions] = useState([]); const [selectedEventId, setSelectedEventId] = useState(null); + const [selectedAttractionId, setSelectedAttractionId] = useState(null); const [currentPage, setCurrentPage] = useState(0); + const [isSearchingAttractions, setIsSearchingAttractions] = useState(false); const [showEventDetails, setShowEventDetails] = useState(false); const [lastScrollPosition, setLastScrollPosition] = useState(0); const [lastClickedId, setLastClickedId] = useState(null); + const [error, setError] = useState(null); const handleEventClick = (eventId: string) => { setLastClickedId(eventId); @@ -38,42 +43,117 @@ function App() { const [totalPages, setTotalPages] = useState(0); const pageSize = parseInt(import.meta.env.VITE_DEFAULT_EVENTS_PER_PAGE) || 10; - const [city, setCity] = useState(() => { + const [searchType, setSearchType] = useState<'city' | 'attraction'>('city'); + const [searchValue, setSearchValue] = useState(() => { const savedCity = localStorage.getItem('city'); - debug('Initial city load:', { savedCity, defaulting: !savedCity }); + debug('Initial search value load:', { savedCity, defaulting: !savedCity }); return savedCity || 'Boulder'; }); // Add debounced values - const debouncedCity = useDebounce(city); + const debouncedSearchValue = useDebounce(searchValue); + + async function fetchAttractions() { + try { + setError(null); + debug('Fetching attractions:', { + keyword: debouncedSearchValue, + page: currentPage, + pageSize + }); + const data: ApiResponse = await getAttractions(debouncedSearchValue, currentPage, pageSize); + if (!data._embedded?.attractions || data._embedded.attractions.length === 0) { + setError('No attractions found for your search. Please try different keywords.'); + setAttractions([]); + setTotalPages(0); + } else { + setAttractions(data._embedded.attractions); + setTotalPages(data.page.totalPages); + } + } catch (error) { + console.error(error); + setError('Failed to fetch attractions. Please try again.'); + } + } async function fetchEvents() { try { + setError(null); debug('Fetching events:', { - city: debouncedCity, + searchType, + searchValue: debouncedSearchValue, page: currentPage, pageSize }); - const data: ApiResponse = await getEvents(currentPage, pageSize, debouncedCity); - setEvents(data._embedded?.events || []); - setTotalPages(data.page.totalPages); + const data: ApiResponse = await getEvents({ + page: currentPage, + size: pageSize, + searchType, + searchValue: debouncedSearchValue + }); + if (!data._embedded?.events || data._embedded.events.length === 0) { + setError(`No events found ${searchType === 'city' ? 'in this city' : 'for this search'}. Please try a different ${searchType === 'city' ? 'location' : 'keyword'}.`); + setEvents([]); + setTotalPages(0); + } else { + setEvents(data._embedded.events); + setTotalPages(data.page.totalPages); + } } catch (error) { console.error(error); + setError('Failed to fetch events. Please try again.'); } } - // Combine the two effects into one that handles both city changes and pagination useEffect(() => { debug('Effect triggered:', { - debouncedCity, + searchType, + debouncedSearchValue, currentPage, - isInitialLoad: !debouncedCity + isInitialLoad: !debouncedSearchValue }); - if (debouncedCity) { - fetchEvents(); + if (debouncedSearchValue) { + if (searchType === 'attraction') { + setIsSearchingAttractions(true); + fetchAttractions(); + setEvents([]); // Clear events while searching attractions + } else { + setIsSearchingAttractions(false); + setAttractions([]); // Clear attractions while searching events + fetchEvents(); + } } - }, [debouncedCity, currentPage]); // Only these two dependencies + }, [searchType, debouncedSearchValue, currentPage]); + + const handleAttractionSelect = async (attractionId: string) => { + setSelectedAttractionId(attractionId); + setIsSearchingAttractions(false); + setCurrentPage(0); + + try { + const attraction = await getAttractionDetails(attractionId); + debug('Selected attraction:', attraction); + + const data = await getEventsByAttraction(attractionId); + if (!data._embedded?.events || data._embedded.events.length === 0) { + setError('No upcoming events found for this artist/venue.'); + setEvents([]); + setTotalPages(0); + } else { + setEvents(data._embedded.events); + setTotalPages(data.page.totalPages); + } + + // Update the search value to show what we're searching for + setSearchValue(attraction.name); + } catch (error) { + console.error(error); + setError('Failed to load events for this artist/venue. Please try again.'); + setIsSearchingAttractions(true); + setSelectedAttractionId(null); + } + }; const handlePageChange = (newPage: number) => { debug('Page changing:', { from: currentPage, to: newPage }); @@ -84,22 +164,52 @@ function App() { }); }; - const handleCityChange = (newCity: string) => { - debug('City changing:', { - from: city, - to: newCity, - storedCity: localStorage.getItem('city') + const handleSearchTypeChange = (newType: 'city' | 'attraction') => { + setError(null); + setSearchType(newType); + setSearchValue(''); // Clear the search text + setCurrentPage(0); + }; + + const handleSearchValueChange = (newValue: string) => { + setError(null); + debug('Search value changing:', { + from: searchValue, + to: newValue, + type: searchType }); - setCity(newCity); - localStorage.setItem('city', newCity); - setCurrentPage(0); // Reset to first page on city change + setSearchValue(newValue); + if (searchType === 'city') { + localStorage.setItem('city', newValue); + } else if (searchType === 'attraction') { + // Reset any selected attraction when starting a new search + setSelectedAttractionId(null); + } + setCurrentPage(0); // Reset to first page on search change }; return (

    - Upcoming Events + {selectedAttractionId ? ( +
    + Events for {searchValue} + +
    + ) : 'MuseMeter'}

    {/* Show event details when an event is selected */} @@ -117,23 +227,42 @@ function App() {
    )} -
    + {error && ( +
    + {error} +
    + )} +
    + handleCityChange(e.target.value)} + placeholder={searchType === 'city' ? "City" : "Artist"} + value={searchValue} + onChange={(e) => handleSearchValueChange(e.target.value)} className="px-4 py-2 rounded-md border border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600 dark:focus:ring-indigo-400" />
    -
      - {events.map((event: Event, index: number) => ( -
    • + {isSearchingAttractions ? ( + + ) : ( +
        + {events.map((event: Event, index: number) => ( +
      • @@ -152,6 +281,19 @@ function App() { {event.name}
        + {event._embedded?.venues?.[0] && ( +
        + {[ + event._embedded.venues[0].city?.name, + event._embedded.venues[0].state?.stateCode, + event._embedded.venues[0].country?.name !== 'United States Of America' + ? event._embedded.venues[0].country?.name + : null + ] + .filter(Boolean) + .join(', ')} +
        + )}
        @@ -187,26 +329,30 @@ function App() {
      • ))}
      + )}
    -
    - - - Page {currentPage + 1} of {totalPages} - - -
    + {/* Pagination controls */} + {(events.length > 0 || attractions.length > 0) && ( +
    + + + Page {currentPage + 1} of {totalPages} + + +
    + )} {selectedEventId && }
    diff --git a/src/components/AttractionList.tsx b/src/components/AttractionList.tsx new file mode 100644 index 0000000..5477405 --- /dev/null +++ b/src/components/AttractionList.tsx @@ -0,0 +1,72 @@ +import { FC } from 'react'; + +interface Attraction { + id: string; + name: string; + type: string; + images?: { + url: string; + ratio: string; + width: number; + height: number; + }[]; + classifications?: { + primary: boolean; + segment: { + id: string; + name: string; + }; + }[]; +} + +interface AttractionListProps { + attractions: Attraction[]; + onSelect: (attractionId: string) => void; +} + +const AttractionList: FC = ({ attractions, onSelect }) => { + if (!attractions.length) { + return ( +
    + No attractions found +
    + ); + } + + return ( +
    + {attractions.map(attraction => ( +
    onSelect(attraction.id)} + > +
    + {attraction.images?.[0] && ( + {attraction.name} + )} +
    +

    + {attraction.name} +

    +
    + {attraction.type.charAt(0).toUpperCase() + attraction.type.slice(1)} +
    + {attraction.classifications?.[0]?.segment && ( +
    + {attraction.classifications[0].segment.name} +
    + )} +
    +
    +
    + ))} +
    + ); +}; + +export default AttractionList; diff --git a/src/components/ClassificationIcon.tsx b/src/components/ClassificationIcon.tsx index 182dd6b..843b766 100644 --- a/src/components/ClassificationIcon.tsx +++ b/src/components/ClassificationIcon.tsx @@ -17,7 +17,8 @@ const ClassificationIcon: React.FC = ({ segmentName, cl case 'sports': return ( - + + ); case 'arts': diff --git a/src/events.ts b/src/events.ts index 8b920be..263378f 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,87 +1,44 @@ -export interface Event { - id: string; - name: string; - type: string; - dates: { - start: { - localDate: string; - localTime: string; - }; - }; - _embedded?: { - venues?: { name: string }[]; - }; - url?: string; - classifications?: { - primary: boolean; - segment: { - id: string; - name: string; - }; - genre: { - id: string; - name: string; - }; - subGenre: { - id: string; - name: string; - }; - type: { - id: string; - name: string; - }; - subType: { - id: string; - name: string; - }; - family: boolean; - }[]; - // Add other properties as needed -} - -export interface ApiResponse { - _embedded?: { - events: Event[]; - }; - page: { - totalElements: number; - totalPages: number; - number: number; - size: number; - }; - _links?: { - self: { href: string }; - first?: { href: string }; - last?: { href: string }; - next?: { href: string }; - prev?: { href: string }; - }; -} +import { Event, Attraction, ApiResponse } from './types'; const defaultEventsPerPage = import.meta.env.VITE_DEFAULT_EVENTS_PER_PAGE || 10; -export const getEvents = async (page: number = 0, size: number = Number(defaultEventsPerPage), city: string = '', state: string = ''): Promise => { +export interface SearchParams { + page: number; + size: number; + searchType: 'city' | 'keyword' | 'attraction'; + searchValue: string; +} + +export const getEvents = async ({ + page = 0, + size = Number(defaultEventsPerPage), + searchType = 'city', + searchValue = '' +}: SearchParams): Promise> => { try { let url = `/api/events?page=${page}&size=${size}`; - if (city) { - url += `&city=${city}`; - } - if (state) { - url += `&state=${state}`; + if (searchValue) { + if (searchType === 'attraction') { + url += `&keyword=${searchValue}`; + } else { + url += `&${searchType}=${searchValue}`; + } } const response = await fetch(url); + const data: ApiResponse = await response.json(); + if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); + // Extract error message from response if available + const errorMessage = data.error || `HTTP error! status: ${response.status}`; + throw new Error(errorMessage); } - const data: ApiResponse = await response.json(); - // Debug log classifications if (process.env.NODE_ENV === 'development') { - data._embedded?.events.forEach(event => { + data._embedded?.events?.forEach((event: Event) => { console.log(`Event ${event.name} classifications:`, - event.classifications?.map(c => c.segment?.name) + event.classifications?.map((c) => c.segment?.name) ); }); } @@ -98,10 +55,60 @@ export const getEvents = async (page: number = 0, size: number = Number(defaultE } } -export const hasNextPage = (response: ApiResponse): boolean => { +export const getAttractions = async (keyword: string, page = 0, size = Number(defaultEventsPerPage)): Promise> => { + try { + const response = await fetch(`/api/attractions?keyword=${encodeURIComponent(keyword)}&page=${page}&size=${size}`); + + const data = await response.json(); + if (!response.ok) { + const errorMessage = data.error || `HTTP error! status: ${response.status}`; + throw new Error(errorMessage); + } + return data; + } catch (error) { + console.error('Failed to fetch attractions:', error); + throw error; + } +}; + +export const getAttractionDetails = async (attractionId: string): Promise => { + try { + const response = await fetch(`/api/attractions/${attractionId}`); + + const data = await response.json(); + if (!response.ok) { + const errorMessage = data.error || `HTTP error! status: ${response.status}`; + throw new Error(errorMessage); + } + return data; + } catch (error) { + console.error('Failed to fetch attraction details:', error); + throw error; + } +}; + +export const getEventsByAttraction = async (attractionId: string, page = 0, size = Number(defaultEventsPerPage)): Promise> => { + try { + const attraction = await getAttractionDetails(attractionId); + let url = `/api/events?page=${page}&size=${size}&keyword=${encodeURIComponent(attraction.name)}`; + const response = await fetch(url); + + const data = await response.json(); + if (!response.ok) { + const errorMessage = data.error || `HTTP error! status: ${response.status}`; + throw new Error(errorMessage); + } + return data; + } catch (error) { + console.error('Failed to fetch events for attraction:', error); + throw error; + } +}; + +export const hasNextPage = (response: ApiResponse): boolean => { return !!response._links?.next; } -export const hasPreviousPage = (response: ApiResponse): boolean => { +export const hasPreviousPage = (response: ApiResponse): boolean => { return !!response._links?.prev; } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..f950e52 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,84 @@ +export interface Event { + id: string; + name: string; + type: string; + dates: { + start: { + localDate: string; + localTime: string; + }; + }; + _embedded?: { + venues?: { + name: string; + markets?: { name: string }[]; + city?: { name: string }; + state?: { name: string; stateCode: string }; + country?: { name: string; countryCode: string }; + }[]; + }; + url?: string; + classifications?: { + primary: boolean; + segment: { + id: string; + name: string; + }; + genre: { + id: string; + name: string; + }; + subGenre: { + id: string; + name: string; + }; + type: { + id: string; + name: string; + }; + subType: { + id: string; + name: string; + }; + family: boolean; + }[]; +} + +export interface Attraction { + id: string; + name: string; + type: string; + images?: { + url: string; + ratio: string; + width: number; + height: number; + }[]; + classifications?: { + primary: boolean; + segment: { + id: string; + name: string; + }; + }[]; +} + +export interface ApiResponse { + _embedded?: { + events?: Event[]; + attractions?: Attraction[]; + }; + page: { + totalElements: number; + totalPages: number; + number: number; + size: number; + }; + _links?: { + self: { href: string }; + first?: { href: string }; + last?: { href: string }; + next?: { href: string }; + prev?: { href: string }; + }; +} diff --git a/vercel.json b/vercel.json index 1148981..3b06cce 100644 --- a/vercel.json +++ b/vercel.json @@ -4,6 +4,10 @@ "buildCommand": "npm run build", "outputDirectory": "dist", "rewrites": [ + { + "source": "/api/attractions/:id", + "destination": "/api/attractions/[id]" + }, { "source": "/api/events/:id", "destination": "/api/events/[id]" From 64b1a5239963422a4bcfceaa45e143eb23d4de1c Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 18:59:05 -0600 Subject: [PATCH 26/29] fix(types): improve API response type safety - Make page property optional in ApiResponse type - Add optional chaining for page.totalPages access - Add fallback value of 1 for undefined totalPages - Update ApiResponse to use generic type parameter - Remove unused first/last link properties - Add error property to ApiResponse interface This change improves type safety when handling API responses that may not include pagination data. --- src/App.tsx | 6 +++--- src/types.ts | 19 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index bb9a345..7cae819 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -68,7 +68,7 @@ function App() { setTotalPages(0); } else { setAttractions(data._embedded.attractions); - setTotalPages(data.page.totalPages); + setTotalPages(data.page?.totalPages || 1); } } catch (error) { console.error(error); @@ -97,7 +97,7 @@ function App() { setTotalPages(0); } else { setEvents(data._embedded.events); - setTotalPages(data.page.totalPages); + setTotalPages(data.page?.totalPages || 1); } } catch (error) { console.error(error); @@ -142,7 +142,7 @@ function App() { setTotalPages(0); } else { setEvents(data._embedded.events); - setTotalPages(data.page.totalPages); + setTotalPages(data.page?.totalPages || 1); } // Update the search value to show what we're searching for diff --git a/src/types.ts b/src/types.ts index f950e52..3cd848b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -65,20 +65,19 @@ export interface Attraction { export interface ApiResponse { _embedded?: { - events?: Event[]; - attractions?: Attraction[]; - }; - page: { - totalElements: number; - totalPages: number; - number: number; - size: number; + events?: T[]; + attractions?: T[]; }; _links?: { self: { href: string }; - first?: { href: string }; - last?: { href: string }; next?: { href: string }; prev?: { href: string }; }; + page?: { + size: number; + totalElements: number; + totalPages: number; + number: number; + }; + error?: string; // Add error property for error responses } From 26195acc3b87ecd70b32584602a04313678f7c1c Mon Sep 17 00:00:00 2001 From: DC Date: Sat, 19 Apr 2025 19:13:25 -0600 Subject: [PATCH 27/29] fix: mockEvents returned by /api/events needs to include _links: {} because the real API does --- __tests__/api/events.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/__tests__/api/events.test.js b/__tests__/api/events.test.js index 7483af1..a44eded 100644 --- a/__tests__/api/events.test.js +++ b/__tests__/api/events.test.js @@ -4,6 +4,7 @@ import handler from '../../api/events.js'; describe('GET /api/events', () => { const mockEvents = { + _links: {}, _embedded: { events: [ { From 761038356c72f90b5ceacbf0a3af90231db335bb Mon Sep 17 00:00:00 2001 From: DC Date: Thu, 11 Sep 2025 16:39:56 -0600 Subject: [PATCH 28/29] fix(date): construct local Date from components to avoid UTC off-by-one - Add src/utils/date.ts with buildLocalEventDate, formatDisplayDate, formatDisplayTime - Replace new Date('YYYY-MM-DD') usages in src/App.tsx and src/EventDetails.tsx - Update Google Calendar URL generation to use local date construction - Add unit tests: __tests__/utils/date.test.js - Update memory bank docs: memory-bank/activeContext.md, memory-bank/progress.md - Minor README update --- README.md | 7 +++++-- __tests__/utils/date.test.js | 35 ++++++++++++++++++++++++++++++++ memory-bank/activeContext.md | 2 ++ memory-bank/progress.md | 16 +++++++++------ src/App.tsx | 28 ++++++++++---------------- src/EventDetails.tsx | 24 ++++++---------------- src/utils/date.ts | 39 ++++++++++++++++++++++++++++++++++++ 7 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 __tests__/utils/date.test.js create mode 100644 src/utils/date.ts diff --git a/README.md b/README.md index db576be..1740a7b 100644 --- a/README.md +++ b/README.md @@ -107,8 +107,11 @@ To test the serverless functions locally: # Install Vercel CLI npm i -g vercel -# Start development server -vercel dev +# Start development server (for serverless functions) +npx vercel dev + +# Start frontend (in separate terminal) +npm run dev ``` ## 📝 License diff --git a/__tests__/utils/date.test.js b/__tests__/utils/date.test.js new file mode 100644 index 0000000..b69c2bf --- /dev/null +++ b/__tests__/utils/date.test.js @@ -0,0 +1,35 @@ +import { buildLocalEventDate, formatDisplayDate, formatDisplayTime } from '../../src/utils/date'; + +describe('date utils', () => { + test('buildLocalEventDate constructs a local Date with given date and time components', () => { + const dt = buildLocalEventDate('2025-09-12', '20:30'); + expect(dt.getFullYear()).toBe(2025); + expect(dt.getMonth()).toBe(8); // September -> monthIndex 8 + expect(dt.getDate()).toBe(12); + expect(dt.getHours()).toBe(20); + expect(dt.getMinutes()).toBe(30); + }); + + test('buildLocalEventDate defaults to midnight when time omitted', () => { + const dt = buildLocalEventDate('2025-01-05'); + expect(dt.getFullYear()).toBe(2025); + expect(dt.getMonth()).toBe(0); // January + expect(dt.getDate()).toBe(5); + expect(dt.getHours()).toBe(0); + expect(dt.getMinutes()).toBe(0); + }); + + test('formatDisplayDate returns a non-empty formatted string', () => { + const dt = buildLocalEventDate('2025-09-12', '20:30'); + const s = formatDisplayDate(dt); + expect(typeof s).toBe('string'); + expect(s.length).toBeGreaterThan(0); + }); + + test('formatDisplayTime returns a non-empty formatted time string', () => { + const dt = buildLocalEventDate('2025-09-12', '20:30'); + const s = formatDisplayTime(dt); + expect(typeof s).toBe('string'); + expect(s.length).toBeGreaterThan(0); + }); +}); diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 9be2ae8..4eae6da 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -11,6 +11,7 @@ - Configured GitHub Actions for automated testing - Integrated Codecov for test coverage reporting - Added input validation and error handling to serverless functions +- Fixed off-by-one event date bug by replacing naive Date('YYYY-MM-DD') parsing with component-based local construction (src/utils/date.ts) and updated calendar URL generation; added unit tests for the new date utilities. - Updated documentation with testing instructions - Added GitHub Actions and Codecov badges to README @@ -19,6 +20,7 @@ - Jest runs tests with ESM support - Mock API responses using `nock` - Environment variables configured in test setup +- Added unit tests for date utilities (src/utils/date.ts) to validate local date construction and formatting. ### CI/CD Pipeline - GitHub Actions runs tests on push and pull requests diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 08d9d8e..b067287 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -45,6 +45,10 @@ - Adjusted components to accommodate the new search capabilities. - Added unit tests for the attractions endpoint to ensure reliability. - Verified the functionality of city-based and artist-based searches through integration tests. +- UI now properly returns to the event in the list closing event details. +- UI was displaying house icon for events of type football game, now has a generic icon for all sports. +- The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. We are now handling this in code. +- Event dates now display correctly in all timezones (off-by-one bug fixed via src/utils/date.ts; calendar invitations use the corrected local date construction). ## What's Left to Build - Allow user to "like" an event and store the like status in LocalStorage (for now). @@ -76,14 +80,14 @@ ## Known Issues -- UI should return to the event in the list closing event details. Presently it scrolls back to top. -- UI is displaying house icon for events of type football game. -- UI doesn't render properly on mobile. The City and State text inputs plus the search button take up too much room. Let's get rid of the state search as well as the search button since we auto-search after 500ms. +- Pagination navigation for events and attractions is being confused. When looking at a multi-page list of events found by first searching for an artist, the next page button browses to the next page of artists rather than the next page of events. +- UI doesn't render properly on mobile. Need to truncate the descriptors to make the search less clunky on mobile. +- We are getting intermittent HTTP/400 errors when rendering event details but only for some events, and seemingly only when the events have been found by searching for a keyword, after searching for artist/attractions. - It is unclear whether the radius parameter to the Ticketmaster API is being honored. -- The Ticketmaster API returns 429 rate limit errors for larger cities like Denver. We are now handling this in code. + ## Evolution of Project Decisions -- The initial plan was to use a microservices architecture, but this may be reevaluated based on the complexity of the project. -- The choice of Supabase for the backend may be revisited if it does not meet the project's needs. - Not thrilled about the Ticketmaster API but it seems to be one of the few free and relatively open options available. +- Deep research has revealed that to get underground events we'll likely need to do some web scraping. +- Our Seatgeek API key was approved so will be taking a look at that API soonish. diff --git a/src/App.tsx b/src/App.tsx index 7cae819..949544c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,7 @@ import EventDetails from './EventDetails'; import ClassificationIcon from './components/ClassificationIcon'; import { useDebounce } from './hooks/useDebounce'; import { debug } from './utils/debug'; +import { buildLocalEventDate, formatDisplayDate, formatDisplayTime } from './utils/date'; function App() { const [events, setEvents] = useState([]); @@ -295,24 +296,17 @@ function App() {
    )}
    -
    -
    - {new Date(event.dates.start.localDate).toLocaleDateString('en-US', { - weekday: 'short', - month: 'short', - day: 'numeric' - })} +
    +
    + {formatDisplayDate(buildLocalEventDate(event.dates.start.localDate, event.dates.start.localTime))} +
    +
    + {event.dates.start.localTime ? + formatDisplayTime(buildLocalEventDate(event.dates.start.localDate, event.dates.start.localTime)) + : 'Time TBA' + } +
    -
    - {event.dates.start.localTime ? - new Date(`2000-01-01T${event.dates.start.localTime}`).toLocaleTimeString('en-US', { - hour: 'numeric', - minute: '2-digit' - }) - : 'Time TBA' - } -
    -
    diff --git a/src/EventDetails.tsx b/src/EventDetails.tsx index 10ed4f3..5d1679b 100644 --- a/src/EventDetails.tsx +++ b/src/EventDetails.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; import ClassificationIcon from './components/ClassificationIcon'; import { debug } from './utils/debug'; +import { buildLocalEventDate, formatDisplayDate, formatDisplayTime } from './utils/date'; interface EventDetailsProps { eventId: string; @@ -60,15 +61,9 @@ interface Attraction { const createGoogleCalendarUrl = (event: EventDetailsData) => { if (!event.dates.start.localDate) return ''; - - const startDate = new Date(event.dates.start.localDate); - if (event.dates.start.localTime) { - startDate.setHours( - parseInt(event.dates.start.localTime.split(':')[0]), - parseInt(event.dates.start.localTime.split(':')[1]) - ); - } + // Build a Date in the local timezone using components to avoid UTC parsing issues + const startDate = buildLocalEventDate(event.dates.start.localDate, event.dates.start.localTime); const endDate = new Date(startDate); endDate.setHours(startDate.getHours() + 3); // Default to 3 hour duration @@ -171,18 +166,11 @@ const EventDetails: React.FC = ({ eventId }) => {
    - {new Date(eventDetails?.dates.start.localDate).toLocaleDateString('en-US', { - weekday: 'short', - month: 'short', - day: 'numeric' - })} + {formatDisplayDate(buildLocalEventDate(eventDetails.dates.start.localDate, eventDetails.dates.start.localTime))}
    - {eventDetails?.dates.start.localTime ? - new Date(`2000-01-01T${eventDetails.dates.start.localTime}`).toLocaleTimeString('en-US', { - hour: 'numeric', - minute: '2-digit' - }) + {eventDetails.dates.start.localTime ? + formatDisplayTime(buildLocalEventDate(eventDetails.dates.start.localDate, eventDetails.dates.start.localTime)) : 'Time TBA' }
    diff --git a/src/utils/date.ts b/src/utils/date.ts new file mode 100644 index 0000000..aa52538 --- /dev/null +++ b/src/utils/date.ts @@ -0,0 +1,39 @@ +export const buildLocalEventDate = (localDate: string, localTime?: string): Date => { + // Validate basic YYYY-MM-DD format + if (!localDate || !/^\d{4}-\d{2}-\d{2}$/.test(localDate)) { + return new Date(NaN); + } + + const parts = localDate.split('-').map((p: string) => parseInt(p, 10)); + const year = parts[0]; + const month = (parts[1] || 1) - 1; // monthIndex + const day = parts[2] || 1; + + let hour = 0; + let minute = 0; + if (localTime) { + const timeParts = localTime.split(':').map((p: string) => parseInt(p, 10)); + hour = timeParts[0] || 0; + minute = timeParts[1] || 0; + } + + // Construct using Date(year, monthIndex, day, hour, minute) which creates a date in the local timezone + return new Date(year, month, day, hour, minute); +}; + +export const formatDisplayDate = (date: Date): string => { + if (!date || Number.isNaN(date.getTime())) return ''; + return date.toLocaleDateString('en-US', { + weekday: 'short', + month: 'short', + day: 'numeric' + }); +}; + +export const formatDisplayTime = (date: Date): string => { + if (!date || Number.isNaN(date.getTime())) return ''; + return date.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }); +}; From a6a13140cabf7746e1820c0cda6b6f3b04d45020 Mon Sep 17 00:00:00 2001 From: DC Date: Thu, 11 Sep 2025 16:51:13 -0600 Subject: [PATCH 29/29] fix(date): extend jest to use TS - Add __tests__/utils/date.test.js and adjust imports for ESM/ts-jest compatibility - Update jest.config.js and package.json devDependencies for ts-jest support --- __tests__/utils/date.test.js | 14 +-- jest.config.js | 11 +-- package-lock.json | 172 +++++++++++++++++++++++++++++++++++ package.json | 2 + 4 files changed, 185 insertions(+), 14 deletions(-) diff --git a/__tests__/utils/date.test.js b/__tests__/utils/date.test.js index b69c2bf..ffccf28 100644 --- a/__tests__/utils/date.test.js +++ b/__tests__/utils/date.test.js @@ -1,8 +1,8 @@ -import { buildLocalEventDate, formatDisplayDate, formatDisplayTime } from '../../src/utils/date'; +import * as dateUtils from '../../src/utils/date'; describe('date utils', () => { test('buildLocalEventDate constructs a local Date with given date and time components', () => { - const dt = buildLocalEventDate('2025-09-12', '20:30'); + const dt = dateUtils.buildLocalEventDate('2025-09-12', '20:30'); expect(dt.getFullYear()).toBe(2025); expect(dt.getMonth()).toBe(8); // September -> monthIndex 8 expect(dt.getDate()).toBe(12); @@ -11,7 +11,7 @@ describe('date utils', () => { }); test('buildLocalEventDate defaults to midnight when time omitted', () => { - const dt = buildLocalEventDate('2025-01-05'); + const dt = dateUtils.buildLocalEventDate('2025-01-05'); expect(dt.getFullYear()).toBe(2025); expect(dt.getMonth()).toBe(0); // January expect(dt.getDate()).toBe(5); @@ -20,15 +20,15 @@ describe('date utils', () => { }); test('formatDisplayDate returns a non-empty formatted string', () => { - const dt = buildLocalEventDate('2025-09-12', '20:30'); - const s = formatDisplayDate(dt); + const dt = dateUtils.buildLocalEventDate('2025-09-12', '20:30'); + const s = dateUtils.formatDisplayDate(dt); expect(typeof s).toBe('string'); expect(s.length).toBeGreaterThan(0); }); test('formatDisplayTime returns a non-empty formatted time string', () => { - const dt = buildLocalEventDate('2025-09-12', '20:30'); - const s = formatDisplayTime(dt); + const dt = dateUtils.buildLocalEventDate('2025-09-12', '20:30'); + const s = dateUtils.formatDisplayTime(dt); expect(typeof s).toBe('string'); expect(s.length).toBeGreaterThan(0); }); diff --git a/jest.config.js b/jest.config.js index 847bdb6..ea7a820 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,11 @@ export default { + testEnvironment: 'node', testMatch: ['**/__tests__/**/*.test.js'], extensionsToTreatAsEsm: ['.ts'], - transform: {}, + transform: { + '^.+\\.tsx?$': ['ts-jest', { useESM: true, tsconfig: 'tsconfig.app.json' }] + }, collectCoverage: true, coverageDirectory: 'coverage', // Configure moduleNameMapper for aliases and ES modules @@ -10,12 +13,6 @@ export default { '^(\\.{1,2}/.*)\\.js$': '$1', '^@/(.*)$': '/src/$1', }, - // Add globals needed by tests - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.json', - }, - }, // Setup files to run after env initialization setupFilesAfterEnv: ['/__tests__/setup/testSetup.js'], }; diff --git a/package-lock.json b/package-lock.json index b45759a..8022b76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "devDependencies": { "@babel/preset-env": "^7.26.9", "@eslint/js": "^9.21.0", + "@types/jest": "^29.5.14", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", @@ -31,6 +32,7 @@ "nock": "^14.0.3", "npm-run-all": "^4.1.5", "supertest": "^7.1.0", + "ts-jest": "^29.4.1", "typescript": "~5.7.2", "typescript-eslint": "^8.24.1", "vercel": "^41.6.1", @@ -4078,6 +4080,17 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -5379,6 +5392,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -7711,6 +7737,28 @@ "dev": true, "license": "MIT" }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -9681,6 +9729,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -10002,6 +10057,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -10109,6 +10174,13 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -12409,6 +12481,85 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-jest": { + "version": "29.4.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", + "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.2", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-morph": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", @@ -12636,6 +12787,20 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/uid-promise": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz", @@ -13125,6 +13290,13 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index bacde14..2e49ec1 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "devDependencies": { "@babel/preset-env": "^7.26.9", "@eslint/js": "^9.21.0", + "@types/jest": "^29.5.14", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", @@ -38,6 +39,7 @@ "nock": "^14.0.3", "npm-run-all": "^4.1.5", "supertest": "^7.1.0", + "ts-jest": "^29.4.1", "typescript": "~5.7.2", "typescript-eslint": "^8.24.1", "vercel": "^41.6.1",