Lanyards is a dedicated profile for researchers, built on the AT Protocol.

initial commit. server starts, most pages load, most forms work, time for tea and cake

+14338
+19
.env.example
··· 1 + # Authentication Method: 'oauth' or 'app_password' 2 + # Use 'app_password' for local development, 'oauth' for production 3 + AUTH_METHOD=app_password 4 + 5 + # AT Protocol OAuth Configuration (for AUTH_METHOD=oauth) 6 + NEXT_PUBLIC_CLIENT_ID= 7 + OAUTH_CLIENT_SECRET= 8 + NEXT_PUBLIC_REDIRECT_URI=http://localhost:3000/api/auth/callback 9 + 10 + # App Password Configuration (for AUTH_METHOD=app_password) 11 + # Get your app password from: https://bsky.app/settings/app-passwords 12 + BLUESKY_HANDLE=your-handle.bsky.social 13 + BLUESKY_APP_PASSWORD=your-app-password-here 14 + 15 + # Application URL 16 + NEXT_PUBLIC_APP_URL=http://localhost:3000 17 + 18 + # PDS Configuration 19 + PDS_URL=https://bsky.social
+13
.eslintrc.json
··· 1 + { 2 + "extends": ["next/core-web-vitals", "next/typescript"], 3 + "rules": { 4 + "@typescript-eslint/no-unused-vars": [ 5 + "warn", 6 + { 7 + "argsIgnorePattern": "^_", 8 + "varsIgnorePattern": "^_" 9 + } 10 + ], 11 + "@typescript-eslint/no-explicit-any": "warn" 12 + } 13 + }
+46
.gitignore
··· 1 + # dependencies 2 + /node_modules 3 + /.pnp 4 + .pnp.js 5 + 6 + # testing 7 + /coverage 8 + 9 + # next.js 10 + /.next/ 11 + /out/ 12 + 13 + # production 14 + /build 15 + 16 + # misc 17 + .DS_Store 18 + *.pem 19 + 20 + # debug 21 + npm-debug.log* 22 + yarn-debug.log* 23 + yarn-error.log* 24 + 25 + # local env files 26 + .env*.local 27 + .env 28 + 29 + # vercel 30 + .vercel 31 + 32 + # typescript 33 + *.tsbuildinfo 34 + next-env.d.ts 35 + /src/types/generated 36 + 37 + # IDE 38 + .vscode 39 + .idea 40 + *.swp 41 + *.swo 42 + *~ 43 + 44 + # mine 45 + .docs 46 + .claude
+11
.prettierignore
··· 1 + node_modules 2 + .next 3 + .vercel 4 + dist 5 + build 6 + coverage 7 + *.min.js 8 + *.min.css 9 + package-lock.json 10 + yarn.lock 11 + pnpm-lock.yaml
+10
.prettierrc.json
··· 1 + { 2 + "semi": true, 3 + "trailingComma": "es5", 4 + "singleQuote": true, 5 + "printWidth": 80, 6 + "tabWidth": 2, 7 + "useTabs": false, 8 + "arrowParens": "always", 9 + "endOfLine": "lf" 10 + }
+54
README.md
··· 1 + # Lanyard 2 + 3 + A dedicated profile for researchers, built on the AT Protocol. 4 + 5 + Researchers will use this as an alternative to the ORCID ID. 6 + 7 + ## Features 8 + 9 + - **Account Creation**: Sign in with your Bluesky account using OAuth 10 + - **Researcher Profile**: Mobile-first profile display with QR code sharing 11 + - **Profile Management**: Manage honorifics, location, affiliations, and more 12 + - **Social Networks**: Link to Twitter, LinkedIn, ResearchGate, Google Scholar, and Semble 13 + - **Scholarly Contributions**: Add research using DOIs 14 + - **Academic Events**: Track conference presentations and symposiums 15 + 16 + ## Technology Stack 17 + 18 + - Next.js (latest) 19 + - TypeScript 20 + - Tailwind CSS v4 21 + - AT Protocol (@atproto/*) 22 + - Zod for validation 23 + 24 + ## Getting Started 25 + 26 + ### Quick Start (App Password) 27 + 28 + 1. Install dependencies: 29 + ```bash 30 + npm install 31 + ``` 32 + 33 + 2. Set up your Bluesky app password: 34 + ```bash 35 + cp .env.example .env 36 + # Edit .env and add your BLUESKY_HANDLE and BLUESKY_APP_PASSWORD 37 + ``` 38 + 39 + 3. Run the development server: 40 + ```bash 41 + npm run dev 42 + ``` 43 + 44 + 4. Open [http://localhost:3000](http://localhost:3000) 45 + 46 + See [SETUP.md](SETUP.md) for detailed setup instructions and OAuth configuration. 47 + 48 + ## Development 49 + 50 + - `npm run dev` - Start development server 51 + - `npm run build` - Build for production 52 + - `npm run start` - Start production server 53 + - `npm run lint` - Run ESLint 54 + - `npm run format` - Format code with Prettier
+104
SETUP.md
··· 1 + # Lanyard Setup Guide 2 + 3 + ## Quick Start with App Password (Recommended for Development) 4 + 5 + ### 1. Create a Bluesky App Password 6 + 7 + 1. Go to [https://bsky.app/settings/app-passwords](https://bsky.app/settings/app-passwords) 8 + 2. Click "Add App Password" 9 + 3. Give it a name (e.g., "Lanyard Development") 10 + 4. Copy the generated password 11 + 12 + ### 2. Configure Environment Variables 13 + 14 + 1. Copy the example environment file: 15 + ```bash 16 + cp .env.example .env 17 + ``` 18 + 19 + 2. Edit `.env` and add your credentials: 20 + ```env 21 + # Set authentication method to app_password 22 + AUTH_METHOD=app_password 23 + 24 + # Add your Bluesky credentials 25 + BLUESKY_HANDLE=your-handle.bsky.social 26 + BLUESKY_APP_PASSWORD=your-app-password-here 27 + 28 + # Leave these as-is for now 29 + NEXT_PUBLIC_APP_URL=http://localhost:3000 30 + PDS_URL=https://bsky.social 31 + ``` 32 + 33 + ### 3. Install Dependencies 34 + 35 + ```bash 36 + npm install 37 + ``` 38 + 39 + ### 4. Run the Development Server 40 + 41 + ```bash 42 + npm run dev 43 + ``` 44 + 45 + Visit [http://localhost:3000](http://localhost:3000) and click "Sign In". You'll be automatically authenticated with your configured account. 46 + 47 + ## Authentication Methods 48 + 49 + Lanyard supports two authentication methods: 50 + 51 + ### App Password (Development) 52 + - **Pros**: Simple setup, no OAuth configuration needed 53 + - **Cons**: Single account only, credentials in .env file 54 + - **Use for**: Local development and testing 55 + - **Configuration**: Set `AUTH_METHOD=app_password` in `.env` 56 + 57 + ### OAuth (Production) 58 + - **Pros**: Multi-user support, secure authorization flow 59 + - **Cons**: Requires OAuth client setup and configuration 60 + - **Use for**: Production deployment 61 + - **Configuration**: Set `AUTH_METHOD=oauth` in `.env` 62 + 63 + ## Switching Between Authentication Methods 64 + 65 + Simply change the `AUTH_METHOD` value in your `.env` file: 66 + 67 + ```env 68 + # For App Password 69 + AUTH_METHOD=app_password 70 + 71 + # For OAuth 72 + AUTH_METHOD=oauth 73 + ``` 74 + 75 + Restart the development server after changing the method. 76 + 77 + ## Setting Up OAuth (Production) 78 + 79 + Coming soon - OAuth setup requires AT Protocol OAuth client configuration. 80 + 81 + ## Troubleshooting 82 + 83 + ### "App password not configured" error 84 + - Check that `BLUESKY_HANDLE` and `BLUESKY_APP_PASSWORD` are set in `.env` 85 + - Ensure there are no extra spaces or quotes around the values 86 + - Restart the development server after changing `.env` 87 + 88 + ### Authentication fails 89 + - Verify your app password is correct 90 + - Make sure your Bluesky account is active 91 + - Check that `PDS_URL` is set to `https://bsky.social` 92 + 93 + ### Can't access dashboard 94 + - Make sure you're signed in (check for session cookie) 95 + - Try clearing cookies and signing in again 96 + - Check the browser console for errors 97 + 98 + ## Next Steps 99 + 100 + Once authenticated, you can: 101 + 1. View your dashboard at `/dashboard` 102 + 2. Add affiliations, publications, and events 103 + 3. Configure your profile settings 104 + 4. View your public profile at `/{your-handle}`
+119
lexicons/README.md
··· 1 + # Lanyard Lexicons 2 + 3 + This directory contains the AT Protocol lexicon definitions for Lanyard. 4 + 5 + ## Namespace Structure 6 + 7 + All lexicons use the `at.lanyard.*` namespace in anticipation of the `lanyard.at` domain. 8 + 9 + ``` 10 + at.lanyard/ 11 + ├── actor/ - Researcher identity and relationships 12 + │ ├── profile - Core researcher profile 13 + │ └── affiliation - Professional affiliations 14 + ├── document/ - Research outputs 15 + │ └── work - Scholarly contributions (DOI-based) 16 + ├── event/ - Academic activities 17 + │ └── academic - Conferences, symposiums, workshops 18 + ├── link/ - External connections 19 + │ ├── social - Social network profiles 20 + │ └── web - Custom web links 21 + ├── location/ - Geographic data (reusable) 22 + │ └── place - ISO country/region/city codes 23 + └── organization/ - Institutions (reusable) 24 + └── institution - Universities, companies (Ringgold/GRID) 25 + ``` 26 + 27 + ## Lexicon Hierarchy 28 + 29 + ### Core Objects (Independent) 30 + 31 + **`at.lanyard.location.place`** 32 + - Geographic location using ISO codes 33 + - Used by: profile, institution, event 34 + - Fields: country (ISO 3166-1), region (ISO 3166-2), city 35 + 36 + **`at.lanyard.organization.institution`** 37 + - Academic/research institutions 38 + - Used by: affiliation, event (as organizer) 39 + - Identifiers: Ringgold ID, GRID ID 40 + - References: location.place 41 + 42 + ### Actor (Researcher) 43 + 44 + **`at.lanyard.actor.profile`** 45 + - Central researcher identity 46 + - Key: `self` (singleton record) 47 + - References: location.place 48 + - Synced from: Bluesky profile (avatar, displayName, description) 49 + - Additional: honorifics (Dr, Prof) 50 + 51 + **`at.lanyard.actor.affiliation`** 52 + - Professional relationships 53 + - Key: `tid` (multiple records) 54 + - References: organization.institution 55 + - Fields: role, startDate, endDate, isPrimary 56 + 57 + ### Links (External Connections) 58 + 59 + **`at.lanyard.link.social`** 60 + - Social network profiles 61 + - Platforms: bluesky, twitter, linkedin, researchgate, googlescholar, semble 62 + - One per platform (Bluesky is locked/auto-synced) 63 + 64 + **`at.lanyard.link.web`** 65 + - Custom web links 66 + - Maximum 3 per profile 67 + - Fields: title, url 68 + 69 + ### Research Output 70 + 71 + **`at.lanyard.document.work`** 72 + - Scholarly contributions 73 + - Primary identifier: DOI 74 + - Metadata auto-fetched from CrossRef/DataCite 75 + - Types: paper, poster, abstract, dataset, etc. 76 + 77 + ### Events 78 + 79 + **`at.lanyard.event.academic`** 80 + - Conferences, symposiums, workshops 81 + - References: location.place, organization.institution (organizer) 82 + - Can link to: document.work[] (presented works) 83 + 84 + ## Object Relationships 85 + 86 + ``` 87 + actor.profile 88 + ├─ refs → location.place (home location) 89 + ├─ has → actor.affiliation[] (multiple) 90 + └─ has → link.social[], link.web[] 91 + 92 + actor.affiliation 93 + └─ refs → organization.institution 94 + 95 + organization.institution 96 + └─ refs → location.place 97 + 98 + event.academic 99 + ├─ refs → organization.institution (organizer) 100 + ├─ refs → location.place (venue) 101 + └─ refs → document.work[] (presented) 102 + ``` 103 + 104 + ## Design Principles 105 + 106 + 1. **Reusability** - location and organization are shared objects 107 + 2. **Single Source of Truth** - No duplicated definitions 108 + 3. **Clear Ownership** - actor.* owns links, affiliations 109 + 4. **Modularity** - Each lexicon can evolve independently 110 + 5. **AT Protocol Conventions** - Follows app.bsky.* patterns 111 + 112 + ## Future Expansion 113 + 114 + The structure allows for growth: 115 + - `at.lanyard.actor.education` - Academic degrees 116 + - `at.lanyard.document.grant` - Research funding 117 + - `at.lanyard.document.patent` - Patents 118 + - `at.lanyard.event.workshop` - Specific workshop type 119 + - `at.lanyard.organization.funder` - Funding bodies
+74
lexicons/event/event.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.event", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "An academic event such as a conference, symposium, workshop, or seminar where research is presented or discussed", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["name", "type", "startDate", "createdAt"], 12 + "properties": { 13 + "name": { 14 + "type": "string", 15 + "maxLength": 300, 16 + "description": "Event name (e.g., 'NeurIPS 2024', 'Annual Biology Symposium')" 17 + }, 18 + "type": { 19 + "type": "string", 20 + "enum": [ 21 + "conference", 22 + "symposium", 23 + "workshop", 24 + "seminar", 25 + "lecture", 26 + "poster-session", 27 + "webinar", 28 + "other" 29 + ], 30 + "description": "Type of academic event" 31 + }, 32 + "startDate": { 33 + "type": "string", 34 + "format": "datetime", 35 + "description": "Event start date" 36 + }, 37 + "endDate": { 38 + "type": "string", 39 + "format": "datetime", 40 + "description": "Event end date (optional, for multi-day events)" 41 + }, 42 + "location": { 43 + "type": "ref", 44 + "ref": "at.lanyard.location#main", 45 + "description": "Event location (can be physical or virtual)" 46 + }, 47 + "organizer": { 48 + "type": "ref", 49 + "ref": "at.lanyard.organization#main", 50 + "description": "Organization that organized/hosted the event" 51 + }, 52 + "relatedWorks": { 53 + "type": "array", 54 + "items": { 55 + "type": "string", 56 + "format": "at-uri" 57 + }, 58 + "description": "AT-URI references to related work records presented at this event" 59 + }, 60 + "url": { 61 + "type": "string", 62 + "format": "uri", 63 + "description": "Event website URL" 64 + }, 65 + "createdAt": { 66 + "type": "string", 67 + "format": "datetime", 68 + "description": "Timestamp when this event record was created" 69 + } 70 + } 71 + } 72 + } 73 + } 74 + }
+64
lexicons/link/link.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.link", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A link to an external profile or website - can be a social network profile, academic profile, or custom web link. Limits per profile: 1 per social platform, max 3 custom web links", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["url", "type", "createdAt"], 12 + "properties": { 13 + "type": { 14 + "type": "string", 15 + "enum": [ 16 + "social", 17 + "academic", 18 + "web" 19 + ], 20 + "description": "Type of link - social (Twitter, LinkedIn), academic (ORCID, Scholar), or web (custom links)" 21 + }, 22 + "platform": { 23 + "type": "string", 24 + "enum": [ 25 + "bluesky", 26 + "twitter", 27 + "linkedin", 28 + "researchgate", 29 + "googlescholar", 30 + "orcid", 31 + "semble", 32 + "custom" 33 + ], 34 + "description": "Platform identifier for social/academic links (use 'custom' for web type)" 35 + }, 36 + "url": { 37 + "type": "string", 38 + "format": "uri", 39 + "description": "Full URL to the profile or website" 40 + }, 41 + "title": { 42 + "type": "string", 43 + "maxLength": 100, 44 + "description": "Display title for the link (primarily for custom web links)" 45 + }, 46 + "username": { 47 + "type": "string", 48 + "maxLength": 100, 49 + "description": "Username or identifier on the platform (for social/academic links)" 50 + }, 51 + "isLocked": { 52 + "type": "boolean", 53 + "description": "Whether this link can be edited/deleted (Bluesky profile is locked, derived from auth)" 54 + }, 55 + "createdAt": { 56 + "type": "string", 57 + "format": "datetime", 58 + "description": "Timestamp when this link was created" 59 + } 60 + } 61 + } 62 + } 63 + } 64 + }
+29
lexicons/location/location.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.location", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "A geographic location using ISO standard codes - can represent a researcher's home country, organization location, or event venue", 8 + "properties": { 9 + "country": { 10 + "type": "string", 11 + "description": "ISO 3166-1 alpha-2 country code (e.g., US, GB, AT, DE, JP)" 12 + }, 13 + "region": { 14 + "type": "string", 15 + "description": "ISO 3166-2 region/state/province code (e.g., US-CA for California, GB-ENG for England) - optional" 16 + }, 17 + "city": { 18 + "type": "string", 19 + "maxLength": 100, 20 + "description": "City name (optional)" 21 + }, 22 + "isVirtual": { 23 + "type": "boolean", 24 + "description": "Whether this is a virtual/online location (for virtual events)" 25 + } 26 + } 27 + } 28 + } 29 + }
+59
lexicons/organization/organization.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.organization", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "An organization in the academic ecosystem - can be an institution, publisher, society, or funder. Uses standard identifiers like Ringgold or GRID for institutions", 8 + "required": ["name"], 9 + "properties": { 10 + "name": { 11 + "type": "string", 12 + "maxLength": 300, 13 + "description": "Organization name (e.g., 'Stanford University', 'Springer Nature', 'Royal Society')" 14 + }, 15 + "type": { 16 + "type": "string", 17 + "enum": [ 18 + "institution", 19 + "publisher", 20 + "society", 21 + "funder", 22 + "company", 23 + "government", 24 + "other" 25 + ], 26 + "description": "Type of organization" 27 + }, 28 + "ringgoldId": { 29 + "type": "string", 30 + "description": "Ringgold identifier for the organization (primarily for academic institutions)" 31 + }, 32 + "gridId": { 33 + "type": "string", 34 + "description": "GRID (Global Research Identifier Database) identifier" 35 + }, 36 + "rorId": { 37 + "type": "string", 38 + "description": "ROR (Research Organization Registry) identifier" 39 + }, 40 + "location": { 41 + "type": "ref", 42 + "ref": "at.lanyard.location#main", 43 + "description": "Organization's primary location" 44 + }, 45 + "website": { 46 + "type": "string", 47 + "format": "uri", 48 + "description": "Organization's website URL" 49 + }, 50 + "logo": { 51 + "type": "blob", 52 + "accept": ["image/png", "image/jpeg", "image/svg+xml"], 53 + "maxSize": 1000000, 54 + "description": "Organization logo (PNG, JPEG, or SVG, max 1MB)" 55 + } 56 + } 57 + } 58 + } 59 + }
+53
lexicons/publication/publication.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.publication", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "A publication venue - a journal, conference proceedings, preprint server, or other venue where scholarly work is published. Examples: Nature, PLOS ONE, arXiv, NeurIPS Proceedings", 8 + "required": ["name"], 9 + "properties": { 10 + "name": { 11 + "type": "string", 12 + "maxLength": 300, 13 + "description": "Official name of the publication (e.g., 'Nature', 'PLOS ONE', 'arXiv', 'NeurIPS 2024 Proceedings')" 14 + }, 15 + "type": { 16 + "type": "string", 17 + "enum": [ 18 + "journal", 19 + "proceedings", 20 + "preprint", 21 + "repository", 22 + "book-series", 23 + "other" 24 + ], 25 + "description": "Type of publication venue" 26 + }, 27 + "issn": { 28 + "type": "string", 29 + "description": "International Standard Serial Number (ISSN) - format: 0028-0836" 30 + }, 31 + "publisher": { 32 + "type": "ref", 33 + "ref": "at.lanyard.organization#main", 34 + "description": "Optional reference to the publishing organization" 35 + }, 36 + "website": { 37 + "type": "string", 38 + "format": "uri", 39 + "description": "Publication's primary website URL" 40 + }, 41 + "subjects": { 42 + "type": "array", 43 + "items": { 44 + "type": "string", 45 + "maxLength": 100 46 + }, 47 + "maxLength": 10, 48 + "description": "Subject areas or disciplines covered by this publication" 49 + } 50 + } 51 + } 52 + } 53 + }
+103
lexicons/researcher/researcher.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.researcher", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A researcher's profile record - designed for academics to showcase their identity, affiliations, and professional presence", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": ["did", "handle", "createdAt"], 12 + "properties": { 13 + "did": { 14 + "type": "string", 15 + "format": "did", 16 + "description": "The user's AT Protocol decentralized identifier (DID)" 17 + }, 18 + "handle": { 19 + "type": "string", 20 + "description": "The user's handle (from Bluesky account)" 21 + }, 22 + "displayName": { 23 + "type": "string", 24 + "maxLength": 64, 25 + "description": "Display name (from Bluesky profile)" 26 + }, 27 + "avatar": { 28 + "type": "string", 29 + "description": "Avatar URL (from Bluesky profile, locked)" 30 + }, 31 + "description": { 32 + "type": "string", 33 + "maxGraphemes": 256, 34 + "maxLength": 2560, 35 + "description": "Profile description (from Bluesky profile, locked)" 36 + }, 37 + "honorifics": { 38 + "type": "array", 39 + "items": { 40 + "type": "string", 41 + "enum": ["Dr", "Prof"] 42 + }, 43 + "description": "Academic honorifics (Doctor, Professor)" 44 + }, 45 + "location": { 46 + "type": "ref", 47 + "ref": "at.lanyard.location#main", 48 + "description": "Researcher's home location using ISO codes" 49 + }, 50 + "affiliations": { 51 + "type": "array", 52 + "items": { 53 + "type": "ref", 54 + "ref": "#affiliation" 55 + }, 56 + "description": "Professional affiliations with institutions" 57 + }, 58 + "createdAt": { 59 + "type": "string", 60 + "format": "datetime", 61 + "description": "Timestamp when the profile was created" 62 + }, 63 + "updatedAt": { 64 + "type": "string", 65 + "format": "datetime", 66 + "description": "Timestamp when the profile was last updated" 67 + } 68 + } 69 + } 70 + }, 71 + "affiliation": { 72 + "type": "object", 73 + "description": "A professional affiliation with an organization", 74 + "required": ["organization", "startDate"], 75 + "properties": { 76 + "organization": { 77 + "type": "ref", 78 + "ref": "at.lanyard.organization#main", 79 + "description": "Reference to the affiliated organization" 80 + }, 81 + "role": { 82 + "type": "string", 83 + "maxLength": 100, 84 + "description": "Role or position at the organization (e.g., 'Research Fellow', 'Professor')" 85 + }, 86 + "startDate": { 87 + "type": "string", 88 + "format": "datetime", 89 + "description": "Start date of affiliation" 90 + }, 91 + "endDate": { 92 + "type": "string", 93 + "format": "datetime", 94 + "description": "End date of affiliation (null if current)" 95 + }, 96 + "isPrimary": { 97 + "type": "boolean", 98 + "description": "Whether this is the primary affiliation (maximum 1 primary)" 99 + } 100 + } 101 + } 102 + } 103 + }
+73
lexicons/work/work.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "at.lanyard.work", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A scholarly contribution or research work identified by DOI - represents academic output like papers, posters, conference proceedings, etc.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["doi", "type", "createdAt"], 12 + "properties": { 13 + "doi": { 14 + "type": "string", 15 + "description": "Digital Object Identifier (DOI) for the work - metadata will be fetched from this" 16 + }, 17 + "type": { 18 + "type": "string", 19 + "enum": [ 20 + "abstract", 21 + "poster", 22 + "paper", 23 + "conference-proceeding", 24 + "journal-article", 25 + "book-chapter", 26 + "book", 27 + "preprint", 28 + "dataset", 29 + "other" 30 + ], 31 + "description": "Type of scholarly work" 32 + }, 33 + "title": { 34 + "type": "string", 35 + "maxLength": 500, 36 + "description": "Work title (fetched from DOI metadata)" 37 + }, 38 + "authors": { 39 + "type": "array", 40 + "items": { 41 + "type": "string" 42 + }, 43 + "description": "List of authors (fetched from DOI metadata)" 44 + }, 45 + "publicationDate": { 46 + "type": "string", 47 + "description": "Publication date (fetched from DOI metadata)" 48 + }, 49 + "venue": { 50 + "type": "string", 51 + "maxLength": 200, 52 + "description": "Journal or publication venue (fetched from DOI metadata)" 53 + }, 54 + "publication": { 55 + "type": "ref", 56 + "ref": "at.lanyard.publication#main", 57 + "description": "Optional structured reference to publication venue record" 58 + }, 59 + "event": { 60 + "type": "string", 61 + "format": "at-uri", 62 + "description": "Optional AT-URI reference to related event record (for conference presentations)" 63 + }, 64 + "createdAt": { 65 + "type": "string", 66 + "format": "datetime", 67 + "description": "Timestamp when this work was added to the profile" 68 + } 69 + } 70 + } 71 + } 72 + } 73 + }
+27
next.config.ts
··· 1 + import type { NextConfig } from 'next'; 2 + 3 + const nextConfig: NextConfig = { 4 + reactStrictMode: true, 5 + images: { 6 + remotePatterns: [ 7 + { 8 + protocol: 'https', 9 + hostname: 'cdn.bsky.app', 10 + }, 11 + ], 12 + }, 13 + // Externalize packages to avoid bundling test files and node-specific code 14 + serverExternalPackages: [ 15 + 'pino', 16 + 'thread-stream', 17 + 'sonic-boom', 18 + '@atproto/common', 19 + 'multiformats', 20 + ], 21 + typescript: { 22 + // Type checking is enabled, but ignore build errors for external packages 23 + ignoreBuildErrors: false, 24 + }, 25 + }; 26 + 27 + export default nextConfig;
+8606
package-lock.json
··· 1 + { 2 + "name": "at-lanyard", 3 + "version": "0.1.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "at-lanyard", 9 + "version": "0.1.0", 10 + "dependencies": { 11 + "@atproto/api": "latest", 12 + "@atproto/common": "latest", 13 + "@atproto/identity": "latest", 14 + "@atproto/lexicon": "latest", 15 + "@atproto/oauth-client-node": "latest", 16 + "@atproto/syntax": "latest", 17 + "@atproto/xrpc-server": "latest", 18 + "clsx": "latest", 19 + "cors": "latest", 20 + "dotenv": "latest", 21 + "next": "latest", 22 + "qrcode": "latest", 23 + "react": "latest", 24 + "react-dom": "latest", 25 + "tailwind-merge": "latest", 26 + "uuid": "latest", 27 + "zod": "latest" 28 + }, 29 + "devDependencies": { 30 + "@atproto/lex-cli": "latest", 31 + "@tailwindcss/postcss": "latest", 32 + "@types/cors": "latest", 33 + "@types/node": "latest", 34 + "@types/qrcode": "latest", 35 + "@types/react": "latest", 36 + "@types/react-dom": "latest", 37 + "@types/uuid": "latest", 38 + "eslint": "latest", 39 + "eslint-config-next": "latest", 40 + "postcss": "latest", 41 + "prettier": "latest", 42 + "tailwindcss": "latest", 43 + "typescript": "latest" 44 + } 45 + }, 46 + "node_modules/@alloc/quick-lru": { 47 + "version": "5.2.0", 48 + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 49 + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 50 + "dev": true, 51 + "license": "MIT", 52 + "engines": { 53 + "node": ">=10" 54 + }, 55 + "funding": { 56 + "url": "https://github.com/sponsors/sindresorhus" 57 + } 58 + }, 59 + "node_modules/@atproto-labs/did-resolver": { 60 + "version": "0.2.2", 61 + "resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.2.2.tgz", 62 + "integrity": "sha512-ca2B7xR43tVoQ8XxBvha58DXwIH8cIyKQl6lpOKGkPUrJuFoO4iCLlDiSDi2Ueh+yE1rMDPP/qveHdajgDX3WQ==", 63 + "license": "MIT", 64 + "dependencies": { 65 + "@atproto-labs/fetch": "0.2.3", 66 + "@atproto-labs/pipe": "0.1.1", 67 + "@atproto-labs/simple-store": "0.3.0", 68 + "@atproto-labs/simple-store-memory": "0.1.4", 69 + "@atproto/did": "0.2.1", 70 + "zod": "^3.23.8" 71 + } 72 + }, 73 + "node_modules/@atproto-labs/did-resolver/node_modules/zod": { 74 + "version": "3.25.76", 75 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 76 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 77 + "license": "MIT", 78 + "funding": { 79 + "url": "https://github.com/sponsors/colinhacks" 80 + } 81 + }, 82 + "node_modules/@atproto-labs/fetch": { 83 + "version": "0.2.3", 84 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch/-/fetch-0.2.3.tgz", 85 + "integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==", 86 + "license": "MIT", 87 + "dependencies": { 88 + "@atproto-labs/pipe": "0.1.1" 89 + } 90 + }, 91 + "node_modules/@atproto-labs/fetch-node": { 92 + "version": "0.2.0", 93 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch-node/-/fetch-node-0.2.0.tgz", 94 + "integrity": "sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==", 95 + "license": "MIT", 96 + "dependencies": { 97 + "@atproto-labs/fetch": "0.2.3", 98 + "@atproto-labs/pipe": "0.1.1", 99 + "ipaddr.js": "^2.1.0", 100 + "undici": "^6.14.1" 101 + }, 102 + "engines": { 103 + "node": ">=18.7.0" 104 + } 105 + }, 106 + "node_modules/@atproto-labs/handle-resolver": { 107 + "version": "0.3.2", 108 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.3.2.tgz", 109 + "integrity": "sha512-KIerCzh3qb+zZoqWbIvTlvBY0XPq0r56kwViaJY/LTe/3oPO2JaqlYKS/F4dByWBhHK6YoUOJ0sWrh6PMJl40A==", 110 + "license": "MIT", 111 + "dependencies": { 112 + "@atproto-labs/simple-store": "0.3.0", 113 + "@atproto-labs/simple-store-memory": "0.1.4", 114 + "@atproto/did": "0.2.1", 115 + "zod": "^3.23.8" 116 + } 117 + }, 118 + "node_modules/@atproto-labs/handle-resolver-node": { 119 + "version": "0.1.21", 120 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.21.tgz", 121 + "integrity": "sha512-fuJy5Px5pGF3lJX/ATdurbT8tbmaFWtf+PPxAQDFy7ot2no3t+iaAgymhyxYymrssOuWs6BwOP8tyF3VrfdwtQ==", 122 + "license": "MIT", 123 + "dependencies": { 124 + "@atproto-labs/fetch-node": "0.2.0", 125 + "@atproto-labs/handle-resolver": "0.3.2", 126 + "@atproto/did": "0.2.1" 127 + }, 128 + "engines": { 129 + "node": ">=18.7.0" 130 + } 131 + }, 132 + "node_modules/@atproto-labs/handle-resolver/node_modules/zod": { 133 + "version": "3.25.76", 134 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 135 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 136 + "license": "MIT", 137 + "funding": { 138 + "url": "https://github.com/sponsors/colinhacks" 139 + } 140 + }, 141 + "node_modules/@atproto-labs/identity-resolver": { 142 + "version": "0.3.2", 143 + "resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.3.2.tgz", 144 + "integrity": "sha512-MYxO9pe0WsFyi5HFdKAwqIqHfiF2kBPoVhAIuH/4PYHzGr799ED47xLhNMxR3ZUYrJm5+TQzWXypGZ0Btw1Ffw==", 145 + "license": "MIT", 146 + "dependencies": { 147 + "@atproto-labs/did-resolver": "0.2.2", 148 + "@atproto-labs/handle-resolver": "0.3.2" 149 + } 150 + }, 151 + "node_modules/@atproto-labs/pipe": { 152 + "version": "0.1.1", 153 + "resolved": "https://registry.npmjs.org/@atproto-labs/pipe/-/pipe-0.1.1.tgz", 154 + "integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==", 155 + "license": "MIT" 156 + }, 157 + "node_modules/@atproto-labs/simple-store": { 158 + "version": "0.3.0", 159 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store/-/simple-store-0.3.0.tgz", 160 + "integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==", 161 + "license": "MIT" 162 + }, 163 + "node_modules/@atproto-labs/simple-store-memory": { 164 + "version": "0.1.4", 165 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store-memory/-/simple-store-memory-0.1.4.tgz", 166 + "integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==", 167 + "license": "MIT", 168 + "dependencies": { 169 + "@atproto-labs/simple-store": "0.3.0", 170 + "lru-cache": "^10.2.0" 171 + } 172 + }, 173 + "node_modules/@atproto/api": { 174 + "version": "0.18.0", 175 + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.18.0.tgz", 176 + "integrity": "sha512-2GxKPhhvMocDjRU7VpNj+cvCdmCHVAmRwyfNgRLMrJtPZvrosFoi9VATX+7eKN0FZvYvy8KdLSkCcpP2owH3IA==", 177 + "license": "MIT", 178 + "dependencies": { 179 + "@atproto/common-web": "^0.4.3", 180 + "@atproto/lexicon": "^0.5.1", 181 + "@atproto/syntax": "^0.4.1", 182 + "@atproto/xrpc": "^0.7.5", 183 + "await-lock": "^2.2.2", 184 + "multiformats": "^9.9.0", 185 + "tlds": "^1.234.0", 186 + "zod": "^3.23.8" 187 + } 188 + }, 189 + "node_modules/@atproto/api/node_modules/zod": { 190 + "version": "3.25.76", 191 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 192 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 193 + "license": "MIT", 194 + "funding": { 195 + "url": "https://github.com/sponsors/colinhacks" 196 + } 197 + }, 198 + "node_modules/@atproto/common": { 199 + "version": "0.4.12", 200 + "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.4.12.tgz", 201 + "integrity": "sha512-NC+TULLQiqs6MvNymhQS5WDms3SlbIKGLf4n33tpftRJcalh507rI+snbcUb7TLIkKw7VO17qMqxEXtIdd5auQ==", 202 + "license": "MIT", 203 + "dependencies": { 204 + "@atproto/common-web": "^0.4.3", 205 + "@ipld/dag-cbor": "^7.0.3", 206 + "cbor-x": "^1.5.1", 207 + "iso-datestring-validator": "^2.2.2", 208 + "multiformats": "^9.9.0", 209 + "pino": "^8.21.0" 210 + }, 211 + "engines": { 212 + "node": ">=18.7.0" 213 + } 214 + }, 215 + "node_modules/@atproto/common-web": { 216 + "version": "0.4.3", 217 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.3.tgz", 218 + "integrity": "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg==", 219 + "license": "MIT", 220 + "dependencies": { 221 + "graphemer": "^1.4.0", 222 + "multiformats": "^9.9.0", 223 + "uint8arrays": "3.0.0", 224 + "zod": "^3.23.8" 225 + } 226 + }, 227 + "node_modules/@atproto/common-web/node_modules/zod": { 228 + "version": "3.25.76", 229 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 230 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 231 + "license": "MIT", 232 + "funding": { 233 + "url": "https://github.com/sponsors/colinhacks" 234 + } 235 + }, 236 + "node_modules/@atproto/crypto": { 237 + "version": "0.4.4", 238 + "resolved": "https://registry.npmjs.org/@atproto/crypto/-/crypto-0.4.4.tgz", 239 + "integrity": "sha512-Yq9+crJ7WQl7sxStVpHgie5Z51R05etaK9DLWYG/7bR5T4bhdcIgF6IfklLShtZwLYdVVj+K15s0BqW9a8PSDA==", 240 + "license": "MIT", 241 + "dependencies": { 242 + "@noble/curves": "^1.7.0", 243 + "@noble/hashes": "^1.6.1", 244 + "uint8arrays": "3.0.0" 245 + }, 246 + "engines": { 247 + "node": ">=18.7.0" 248 + } 249 + }, 250 + "node_modules/@atproto/did": { 251 + "version": "0.2.1", 252 + "resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.2.1.tgz", 253 + "integrity": "sha512-1i5BTU2GnBaaeYWhxUOnuEKFVq9euT5+dQPFabHpa927BlJ54PmLGyBBaOI7/NbLmN5HWwBa18SBkMpg3jGZRA==", 254 + "license": "MIT", 255 + "dependencies": { 256 + "zod": "^3.23.8" 257 + } 258 + }, 259 + "node_modules/@atproto/did/node_modules/zod": { 260 + "version": "3.25.76", 261 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 262 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 263 + "license": "MIT", 264 + "funding": { 265 + "url": "https://github.com/sponsors/colinhacks" 266 + } 267 + }, 268 + "node_modules/@atproto/identity": { 269 + "version": "0.4.9", 270 + "resolved": "https://registry.npmjs.org/@atproto/identity/-/identity-0.4.9.tgz", 271 + "integrity": "sha512-pRYCaeaEJMZ4vQlRQYYTrF3cMiRp21n/k/pUT1o7dgKby56zuLErDmFXkbKfKWPf7SgWRgamSaNmsGLqAOD7lQ==", 272 + "license": "MIT", 273 + "dependencies": { 274 + "@atproto/common-web": "^0.4.3", 275 + "@atproto/crypto": "^0.4.4" 276 + }, 277 + "engines": { 278 + "node": ">=18.7.0" 279 + } 280 + }, 281 + "node_modules/@atproto/jwk": { 282 + "version": "0.6.0", 283 + "resolved": "https://registry.npmjs.org/@atproto/jwk/-/jwk-0.6.0.tgz", 284 + "integrity": "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==", 285 + "license": "MIT", 286 + "dependencies": { 287 + "multiformats": "^9.9.0", 288 + "zod": "^3.23.8" 289 + } 290 + }, 291 + "node_modules/@atproto/jwk-jose": { 292 + "version": "0.1.11", 293 + "resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.11.tgz", 294 + "integrity": "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==", 295 + "license": "MIT", 296 + "dependencies": { 297 + "@atproto/jwk": "0.6.0", 298 + "jose": "^5.2.0" 299 + } 300 + }, 301 + "node_modules/@atproto/jwk-webcrypto": { 302 + "version": "0.2.0", 303 + "resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.2.0.tgz", 304 + "integrity": "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==", 305 + "license": "MIT", 306 + "dependencies": { 307 + "@atproto/jwk": "0.6.0", 308 + "@atproto/jwk-jose": "0.1.11", 309 + "zod": "^3.23.8" 310 + } 311 + }, 312 + "node_modules/@atproto/jwk-webcrypto/node_modules/zod": { 313 + "version": "3.25.76", 314 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 315 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 316 + "license": "MIT", 317 + "funding": { 318 + "url": "https://github.com/sponsors/colinhacks" 319 + } 320 + }, 321 + "node_modules/@atproto/jwk/node_modules/zod": { 322 + "version": "3.25.76", 323 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 324 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 325 + "license": "MIT", 326 + "funding": { 327 + "url": "https://github.com/sponsors/colinhacks" 328 + } 329 + }, 330 + "node_modules/@atproto/lex-cli": { 331 + "version": "0.9.6", 332 + "resolved": "https://registry.npmjs.org/@atproto/lex-cli/-/lex-cli-0.9.6.tgz", 333 + "integrity": "sha512-EedEKmURoSP735YwSDHsFrLOhZ4P2it8goCHv5ApWi/R9DFpOKOpmYfIXJ9MAprK8cw+yBnjDJbzpLJy7UXlTg==", 334 + "dev": true, 335 + "license": "MIT", 336 + "dependencies": { 337 + "@atproto/lexicon": "^0.5.1", 338 + "@atproto/syntax": "^0.4.1", 339 + "chalk": "^4.1.2", 340 + "commander": "^9.4.0", 341 + "prettier": "^3.2.5", 342 + "ts-morph": "^24.0.0", 343 + "yesno": "^0.4.0", 344 + "zod": "^3.23.8" 345 + }, 346 + "bin": { 347 + "lex": "dist/index.js" 348 + }, 349 + "engines": { 350 + "node": ">=18.7.0" 351 + } 352 + }, 353 + "node_modules/@atproto/lex-cli/node_modules/zod": { 354 + "version": "3.25.76", 355 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 356 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 357 + "dev": true, 358 + "license": "MIT", 359 + "funding": { 360 + "url": "https://github.com/sponsors/colinhacks" 361 + } 362 + }, 363 + "node_modules/@atproto/lexicon": { 364 + "version": "0.5.1", 365 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.5.1.tgz", 366 + "integrity": "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A==", 367 + "license": "MIT", 368 + "dependencies": { 369 + "@atproto/common-web": "^0.4.3", 370 + "@atproto/syntax": "^0.4.1", 371 + "iso-datestring-validator": "^2.2.2", 372 + "multiformats": "^9.9.0", 373 + "zod": "^3.23.8" 374 + } 375 + }, 376 + "node_modules/@atproto/lexicon/node_modules/zod": { 377 + "version": "3.25.76", 378 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 379 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 380 + "license": "MIT", 381 + "funding": { 382 + "url": "https://github.com/sponsors/colinhacks" 383 + } 384 + }, 385 + "node_modules/@atproto/oauth-client": { 386 + "version": "0.5.8", 387 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.5.8.tgz", 388 + "integrity": "sha512-7YEym6d97+Dd73qGdkQTXi5La8xvCQxwRUDzzlR/NVAARa9a4YP7MCmqBJVeP2anT0By+DSAPyPDLTsxcjIcCg==", 389 + "license": "MIT", 390 + "dependencies": { 391 + "@atproto-labs/did-resolver": "0.2.2", 392 + "@atproto-labs/fetch": "0.2.3", 393 + "@atproto-labs/handle-resolver": "0.3.2", 394 + "@atproto-labs/identity-resolver": "0.3.2", 395 + "@atproto-labs/simple-store": "0.3.0", 396 + "@atproto-labs/simple-store-memory": "0.1.4", 397 + "@atproto/did": "0.2.1", 398 + "@atproto/jwk": "0.6.0", 399 + "@atproto/oauth-types": "0.5.0", 400 + "@atproto/xrpc": "0.7.5", 401 + "core-js": "^3", 402 + "multiformats": "^9.9.0", 403 + "zod": "^3.23.8" 404 + } 405 + }, 406 + "node_modules/@atproto/oauth-client-node": { 407 + "version": "0.3.10", 408 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.3.10.tgz", 409 + "integrity": "sha512-6khKlJqu1Ed5rt3rzcTD5hymB6JUjKdOHWYXwiphw4inkAIo6GxLCighI4eGOqZorYk2j8ueeTNB6KsgH0kcRw==", 410 + "license": "MIT", 411 + "dependencies": { 412 + "@atproto-labs/did-resolver": "0.2.2", 413 + "@atproto-labs/handle-resolver-node": "0.1.21", 414 + "@atproto-labs/simple-store": "0.3.0", 415 + "@atproto/did": "0.2.1", 416 + "@atproto/jwk": "0.6.0", 417 + "@atproto/jwk-jose": "0.1.11", 418 + "@atproto/jwk-webcrypto": "0.2.0", 419 + "@atproto/oauth-client": "0.5.8", 420 + "@atproto/oauth-types": "0.5.0" 421 + }, 422 + "engines": { 423 + "node": ">=18.7.0" 424 + } 425 + }, 426 + "node_modules/@atproto/oauth-client/node_modules/zod": { 427 + "version": "3.25.76", 428 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 429 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 430 + "license": "MIT", 431 + "funding": { 432 + "url": "https://github.com/sponsors/colinhacks" 433 + } 434 + }, 435 + "node_modules/@atproto/oauth-types": { 436 + "version": "0.5.0", 437 + "resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.5.0.tgz", 438 + "integrity": "sha512-33xz7HcXhbl+XRqbIMVu3GE02iK1nKe2oMWENASsfZEYbCz2b9ZOarOFuwi7g4LKqpGowGp0iRKsQHFcq4SDaQ==", 439 + "license": "MIT", 440 + "dependencies": { 441 + "@atproto/did": "0.2.1", 442 + "@atproto/jwk": "0.6.0", 443 + "zod": "^3.23.8" 444 + } 445 + }, 446 + "node_modules/@atproto/oauth-types/node_modules/zod": { 447 + "version": "3.25.76", 448 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 449 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 450 + "license": "MIT", 451 + "funding": { 452 + "url": "https://github.com/sponsors/colinhacks" 453 + } 454 + }, 455 + "node_modules/@atproto/syntax": { 456 + "version": "0.4.1", 457 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.1.tgz", 458 + "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==", 459 + "license": "MIT" 460 + }, 461 + "node_modules/@atproto/xrpc": { 462 + "version": "0.7.5", 463 + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.5.tgz", 464 + "integrity": "sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA==", 465 + "license": "MIT", 466 + "dependencies": { 467 + "@atproto/lexicon": "^0.5.1", 468 + "zod": "^3.23.8" 469 + } 470 + }, 471 + "node_modules/@atproto/xrpc-server": { 472 + "version": "0.9.5", 473 + "resolved": "https://registry.npmjs.org/@atproto/xrpc-server/-/xrpc-server-0.9.5.tgz", 474 + "integrity": "sha512-V0srjUgy6mQ5yf9+MSNBLs457m4qclEaWZsnqIE7RfYywvntexTAbMoo7J7ONfTNwdmA9Gw4oLak2z2cDAET4w==", 475 + "license": "MIT", 476 + "dependencies": { 477 + "@atproto/common": "^0.4.12", 478 + "@atproto/crypto": "^0.4.4", 479 + "@atproto/lexicon": "^0.5.1", 480 + "@atproto/xrpc": "^0.7.5", 481 + "cbor-x": "^1.5.1", 482 + "express": "^4.17.2", 483 + "http-errors": "^2.0.0", 484 + "mime-types": "^2.1.35", 485 + "rate-limiter-flexible": "^2.4.1", 486 + "uint8arrays": "3.0.0", 487 + "ws": "^8.12.0", 488 + "zod": "^3.23.8" 489 + }, 490 + "engines": { 491 + "node": ">=18.7.0" 492 + } 493 + }, 494 + "node_modules/@atproto/xrpc-server/node_modules/zod": { 495 + "version": "3.25.76", 496 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 497 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 498 + "license": "MIT", 499 + "funding": { 500 + "url": "https://github.com/sponsors/colinhacks" 501 + } 502 + }, 503 + "node_modules/@atproto/xrpc/node_modules/zod": { 504 + "version": "3.25.76", 505 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 506 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 507 + "license": "MIT", 508 + "funding": { 509 + "url": "https://github.com/sponsors/colinhacks" 510 + } 511 + }, 512 + "node_modules/@babel/code-frame": { 513 + "version": "7.27.1", 514 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 515 + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 516 + "dev": true, 517 + "license": "MIT", 518 + "dependencies": { 519 + "@babel/helper-validator-identifier": "^7.27.1", 520 + "js-tokens": "^4.0.0", 521 + "picocolors": "^1.1.1" 522 + }, 523 + "engines": { 524 + "node": ">=6.9.0" 525 + } 526 + }, 527 + "node_modules/@babel/compat-data": { 528 + "version": "7.28.5", 529 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", 530 + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", 531 + "dev": true, 532 + "license": "MIT", 533 + "engines": { 534 + "node": ">=6.9.0" 535 + } 536 + }, 537 + "node_modules/@babel/core": { 538 + "version": "7.28.5", 539 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", 540 + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", 541 + "dev": true, 542 + "license": "MIT", 543 + "dependencies": { 544 + "@babel/code-frame": "^7.27.1", 545 + "@babel/generator": "^7.28.5", 546 + "@babel/helper-compilation-targets": "^7.27.2", 547 + "@babel/helper-module-transforms": "^7.28.3", 548 + "@babel/helpers": "^7.28.4", 549 + "@babel/parser": "^7.28.5", 550 + "@babel/template": "^7.27.2", 551 + "@babel/traverse": "^7.28.5", 552 + "@babel/types": "^7.28.5", 553 + "@jridgewell/remapping": "^2.3.5", 554 + "convert-source-map": "^2.0.0", 555 + "debug": "^4.1.0", 556 + "gensync": "^1.0.0-beta.2", 557 + "json5": "^2.2.3", 558 + "semver": "^6.3.1" 559 + }, 560 + "engines": { 561 + "node": ">=6.9.0" 562 + }, 563 + "funding": { 564 + "type": "opencollective", 565 + "url": "https://opencollective.com/babel" 566 + } 567 + }, 568 + "node_modules/@babel/generator": { 569 + "version": "7.28.5", 570 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", 571 + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", 572 + "dev": true, 573 + "license": "MIT", 574 + "dependencies": { 575 + "@babel/parser": "^7.28.5", 576 + "@babel/types": "^7.28.5", 577 + "@jridgewell/gen-mapping": "^0.3.12", 578 + "@jridgewell/trace-mapping": "^0.3.28", 579 + "jsesc": "^3.0.2" 580 + }, 581 + "engines": { 582 + "node": ">=6.9.0" 583 + } 584 + }, 585 + "node_modules/@babel/helper-compilation-targets": { 586 + "version": "7.27.2", 587 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 588 + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 589 + "dev": true, 590 + "license": "MIT", 591 + "dependencies": { 592 + "@babel/compat-data": "^7.27.2", 593 + "@babel/helper-validator-option": "^7.27.1", 594 + "browserslist": "^4.24.0", 595 + "lru-cache": "^5.1.1", 596 + "semver": "^6.3.1" 597 + }, 598 + "engines": { 599 + "node": ">=6.9.0" 600 + } 601 + }, 602 + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { 603 + "version": "5.1.1", 604 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 605 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 606 + "dev": true, 607 + "license": "ISC", 608 + "dependencies": { 609 + "yallist": "^3.0.2" 610 + } 611 + }, 612 + "node_modules/@babel/helper-globals": { 613 + "version": "7.28.0", 614 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 615 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 616 + "dev": true, 617 + "license": "MIT", 618 + "engines": { 619 + "node": ">=6.9.0" 620 + } 621 + }, 622 + "node_modules/@babel/helper-module-imports": { 623 + "version": "7.27.1", 624 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 625 + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 626 + "dev": true, 627 + "license": "MIT", 628 + "dependencies": { 629 + "@babel/traverse": "^7.27.1", 630 + "@babel/types": "^7.27.1" 631 + }, 632 + "engines": { 633 + "node": ">=6.9.0" 634 + } 635 + }, 636 + "node_modules/@babel/helper-module-transforms": { 637 + "version": "7.28.3", 638 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", 639 + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", 640 + "dev": true, 641 + "license": "MIT", 642 + "dependencies": { 643 + "@babel/helper-module-imports": "^7.27.1", 644 + "@babel/helper-validator-identifier": "^7.27.1", 645 + "@babel/traverse": "^7.28.3" 646 + }, 647 + "engines": { 648 + "node": ">=6.9.0" 649 + }, 650 + "peerDependencies": { 651 + "@babel/core": "^7.0.0" 652 + } 653 + }, 654 + "node_modules/@babel/helper-string-parser": { 655 + "version": "7.27.1", 656 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 657 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 658 + "dev": true, 659 + "license": "MIT", 660 + "engines": { 661 + "node": ">=6.9.0" 662 + } 663 + }, 664 + "node_modules/@babel/helper-validator-identifier": { 665 + "version": "7.28.5", 666 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 667 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 668 + "dev": true, 669 + "license": "MIT", 670 + "engines": { 671 + "node": ">=6.9.0" 672 + } 673 + }, 674 + "node_modules/@babel/helper-validator-option": { 675 + "version": "7.27.1", 676 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 677 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 678 + "dev": true, 679 + "license": "MIT", 680 + "engines": { 681 + "node": ">=6.9.0" 682 + } 683 + }, 684 + "node_modules/@babel/helpers": { 685 + "version": "7.28.4", 686 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", 687 + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", 688 + "dev": true, 689 + "license": "MIT", 690 + "dependencies": { 691 + "@babel/template": "^7.27.2", 692 + "@babel/types": "^7.28.4" 693 + }, 694 + "engines": { 695 + "node": ">=6.9.0" 696 + } 697 + }, 698 + "node_modules/@babel/parser": { 699 + "version": "7.28.5", 700 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", 701 + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", 702 + "dev": true, 703 + "license": "MIT", 704 + "dependencies": { 705 + "@babel/types": "^7.28.5" 706 + }, 707 + "bin": { 708 + "parser": "bin/babel-parser.js" 709 + }, 710 + "engines": { 711 + "node": ">=6.0.0" 712 + } 713 + }, 714 + "node_modules/@babel/template": { 715 + "version": "7.27.2", 716 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 717 + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 718 + "dev": true, 719 + "license": "MIT", 720 + "dependencies": { 721 + "@babel/code-frame": "^7.27.1", 722 + "@babel/parser": "^7.27.2", 723 + "@babel/types": "^7.27.1" 724 + }, 725 + "engines": { 726 + "node": ">=6.9.0" 727 + } 728 + }, 729 + "node_modules/@babel/traverse": { 730 + "version": "7.28.5", 731 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", 732 + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", 733 + "dev": true, 734 + "license": "MIT", 735 + "dependencies": { 736 + "@babel/code-frame": "^7.27.1", 737 + "@babel/generator": "^7.28.5", 738 + "@babel/helper-globals": "^7.28.0", 739 + "@babel/parser": "^7.28.5", 740 + "@babel/template": "^7.27.2", 741 + "@babel/types": "^7.28.5", 742 + "debug": "^4.3.1" 743 + }, 744 + "engines": { 745 + "node": ">=6.9.0" 746 + } 747 + }, 748 + "node_modules/@babel/types": { 749 + "version": "7.28.5", 750 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", 751 + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", 752 + "dev": true, 753 + "license": "MIT", 754 + "dependencies": { 755 + "@babel/helper-string-parser": "^7.27.1", 756 + "@babel/helper-validator-identifier": "^7.28.5" 757 + }, 758 + "engines": { 759 + "node": ">=6.9.0" 760 + } 761 + }, 762 + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { 763 + "version": "2.2.0", 764 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", 765 + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", 766 + "cpu": [ 767 + "arm64" 768 + ], 769 + "license": "MIT", 770 + "optional": true, 771 + "os": [ 772 + "darwin" 773 + ] 774 + }, 775 + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { 776 + "version": "2.2.0", 777 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", 778 + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", 779 + "cpu": [ 780 + "x64" 781 + ], 782 + "license": "MIT", 783 + "optional": true, 784 + "os": [ 785 + "darwin" 786 + ] 787 + }, 788 + "node_modules/@cbor-extract/cbor-extract-linux-arm": { 789 + "version": "2.2.0", 790 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", 791 + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", 792 + "cpu": [ 793 + "arm" 794 + ], 795 + "license": "MIT", 796 + "optional": true, 797 + "os": [ 798 + "linux" 799 + ] 800 + }, 801 + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { 802 + "version": "2.2.0", 803 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", 804 + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", 805 + "cpu": [ 806 + "arm64" 807 + ], 808 + "license": "MIT", 809 + "optional": true, 810 + "os": [ 811 + "linux" 812 + ] 813 + }, 814 + "node_modules/@cbor-extract/cbor-extract-linux-x64": { 815 + "version": "2.2.0", 816 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", 817 + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", 818 + "cpu": [ 819 + "x64" 820 + ], 821 + "license": "MIT", 822 + "optional": true, 823 + "os": [ 824 + "linux" 825 + ] 826 + }, 827 + "node_modules/@cbor-extract/cbor-extract-win32-x64": { 828 + "version": "2.2.0", 829 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", 830 + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", 831 + "cpu": [ 832 + "x64" 833 + ], 834 + "license": "MIT", 835 + "optional": true, 836 + "os": [ 837 + "win32" 838 + ] 839 + }, 840 + "node_modules/@emnapi/core": { 841 + "version": "1.7.0", 842 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", 843 + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", 844 + "dev": true, 845 + "license": "MIT", 846 + "optional": true, 847 + "dependencies": { 848 + "@emnapi/wasi-threads": "1.1.0", 849 + "tslib": "^2.4.0" 850 + } 851 + }, 852 + "node_modules/@emnapi/runtime": { 853 + "version": "1.7.0", 854 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", 855 + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", 856 + "license": "MIT", 857 + "optional": true, 858 + "dependencies": { 859 + "tslib": "^2.4.0" 860 + } 861 + }, 862 + "node_modules/@emnapi/wasi-threads": { 863 + "version": "1.1.0", 864 + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", 865 + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", 866 + "dev": true, 867 + "license": "MIT", 868 + "optional": true, 869 + "dependencies": { 870 + "tslib": "^2.4.0" 871 + } 872 + }, 873 + "node_modules/@eslint-community/eslint-utils": { 874 + "version": "4.9.0", 875 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", 876 + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", 877 + "dev": true, 878 + "license": "MIT", 879 + "dependencies": { 880 + "eslint-visitor-keys": "^3.4.3" 881 + }, 882 + "engines": { 883 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 884 + }, 885 + "funding": { 886 + "url": "https://opencollective.com/eslint" 887 + }, 888 + "peerDependencies": { 889 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 890 + } 891 + }, 892 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 893 + "version": "3.4.3", 894 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 895 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 896 + "dev": true, 897 + "license": "Apache-2.0", 898 + "engines": { 899 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 900 + }, 901 + "funding": { 902 + "url": "https://opencollective.com/eslint" 903 + } 904 + }, 905 + "node_modules/@eslint-community/regexpp": { 906 + "version": "4.12.2", 907 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 908 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 909 + "dev": true, 910 + "license": "MIT", 911 + "engines": { 912 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 913 + } 914 + }, 915 + "node_modules/@eslint/config-array": { 916 + "version": "0.21.1", 917 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 918 + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 919 + "dev": true, 920 + "license": "Apache-2.0", 921 + "dependencies": { 922 + "@eslint/object-schema": "^2.1.7", 923 + "debug": "^4.3.1", 924 + "minimatch": "^3.1.2" 925 + }, 926 + "engines": { 927 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 928 + } 929 + }, 930 + "node_modules/@eslint/config-helpers": { 931 + "version": "0.4.2", 932 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 933 + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 934 + "dev": true, 935 + "license": "Apache-2.0", 936 + "dependencies": { 937 + "@eslint/core": "^0.17.0" 938 + }, 939 + "engines": { 940 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 941 + } 942 + }, 943 + "node_modules/@eslint/core": { 944 + "version": "0.17.0", 945 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 946 + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 947 + "dev": true, 948 + "license": "Apache-2.0", 949 + "dependencies": { 950 + "@types/json-schema": "^7.0.15" 951 + }, 952 + "engines": { 953 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 954 + } 955 + }, 956 + "node_modules/@eslint/eslintrc": { 957 + "version": "3.3.1", 958 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 959 + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 960 + "dev": true, 961 + "license": "MIT", 962 + "dependencies": { 963 + "ajv": "^6.12.4", 964 + "debug": "^4.3.2", 965 + "espree": "^10.0.1", 966 + "globals": "^14.0.0", 967 + "ignore": "^5.2.0", 968 + "import-fresh": "^3.2.1", 969 + "js-yaml": "^4.1.0", 970 + "minimatch": "^3.1.2", 971 + "strip-json-comments": "^3.1.1" 972 + }, 973 + "engines": { 974 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 975 + }, 976 + "funding": { 977 + "url": "https://opencollective.com/eslint" 978 + } 979 + }, 980 + "node_modules/@eslint/js": { 981 + "version": "9.39.1", 982 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", 983 + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", 984 + "dev": true, 985 + "license": "MIT", 986 + "engines": { 987 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 988 + }, 989 + "funding": { 990 + "url": "https://eslint.org/donate" 991 + } 992 + }, 993 + "node_modules/@eslint/object-schema": { 994 + "version": "2.1.7", 995 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 996 + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 997 + "dev": true, 998 + "license": "Apache-2.0", 999 + "engines": { 1000 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1001 + } 1002 + }, 1003 + "node_modules/@eslint/plugin-kit": { 1004 + "version": "0.4.1", 1005 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 1006 + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 1007 + "dev": true, 1008 + "license": "Apache-2.0", 1009 + "dependencies": { 1010 + "@eslint/core": "^0.17.0", 1011 + "levn": "^0.4.1" 1012 + }, 1013 + "engines": { 1014 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1015 + } 1016 + }, 1017 + "node_modules/@humanfs/core": { 1018 + "version": "0.19.1", 1019 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 1020 + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 1021 + "dev": true, 1022 + "license": "Apache-2.0", 1023 + "engines": { 1024 + "node": ">=18.18.0" 1025 + } 1026 + }, 1027 + "node_modules/@humanfs/node": { 1028 + "version": "0.16.7", 1029 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", 1030 + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", 1031 + "dev": true, 1032 + "license": "Apache-2.0", 1033 + "dependencies": { 1034 + "@humanfs/core": "^0.19.1", 1035 + "@humanwhocodes/retry": "^0.4.0" 1036 + }, 1037 + "engines": { 1038 + "node": ">=18.18.0" 1039 + } 1040 + }, 1041 + "node_modules/@humanwhocodes/module-importer": { 1042 + "version": "1.0.1", 1043 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1044 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 1045 + "dev": true, 1046 + "license": "Apache-2.0", 1047 + "engines": { 1048 + "node": ">=12.22" 1049 + }, 1050 + "funding": { 1051 + "type": "github", 1052 + "url": "https://github.com/sponsors/nzakas" 1053 + } 1054 + }, 1055 + "node_modules/@humanwhocodes/retry": { 1056 + "version": "0.4.3", 1057 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 1058 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 1059 + "dev": true, 1060 + "license": "Apache-2.0", 1061 + "engines": { 1062 + "node": ">=18.18" 1063 + }, 1064 + "funding": { 1065 + "type": "github", 1066 + "url": "https://github.com/sponsors/nzakas" 1067 + } 1068 + }, 1069 + "node_modules/@img/colour": { 1070 + "version": "1.0.0", 1071 + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", 1072 + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", 1073 + "license": "MIT", 1074 + "optional": true, 1075 + "engines": { 1076 + "node": ">=18" 1077 + } 1078 + }, 1079 + "node_modules/@img/sharp-darwin-arm64": { 1080 + "version": "0.34.5", 1081 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", 1082 + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", 1083 + "cpu": [ 1084 + "arm64" 1085 + ], 1086 + "license": "Apache-2.0", 1087 + "optional": true, 1088 + "os": [ 1089 + "darwin" 1090 + ], 1091 + "engines": { 1092 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1093 + }, 1094 + "funding": { 1095 + "url": "https://opencollective.com/libvips" 1096 + }, 1097 + "optionalDependencies": { 1098 + "@img/sharp-libvips-darwin-arm64": "1.2.4" 1099 + } 1100 + }, 1101 + "node_modules/@img/sharp-darwin-x64": { 1102 + "version": "0.34.5", 1103 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", 1104 + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", 1105 + "cpu": [ 1106 + "x64" 1107 + ], 1108 + "license": "Apache-2.0", 1109 + "optional": true, 1110 + "os": [ 1111 + "darwin" 1112 + ], 1113 + "engines": { 1114 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1115 + }, 1116 + "funding": { 1117 + "url": "https://opencollective.com/libvips" 1118 + }, 1119 + "optionalDependencies": { 1120 + "@img/sharp-libvips-darwin-x64": "1.2.4" 1121 + } 1122 + }, 1123 + "node_modules/@img/sharp-libvips-darwin-arm64": { 1124 + "version": "1.2.4", 1125 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", 1126 + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", 1127 + "cpu": [ 1128 + "arm64" 1129 + ], 1130 + "license": "LGPL-3.0-or-later", 1131 + "optional": true, 1132 + "os": [ 1133 + "darwin" 1134 + ], 1135 + "funding": { 1136 + "url": "https://opencollective.com/libvips" 1137 + } 1138 + }, 1139 + "node_modules/@img/sharp-libvips-darwin-x64": { 1140 + "version": "1.2.4", 1141 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", 1142 + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", 1143 + "cpu": [ 1144 + "x64" 1145 + ], 1146 + "license": "LGPL-3.0-or-later", 1147 + "optional": true, 1148 + "os": [ 1149 + "darwin" 1150 + ], 1151 + "funding": { 1152 + "url": "https://opencollective.com/libvips" 1153 + } 1154 + }, 1155 + "node_modules/@img/sharp-libvips-linux-arm": { 1156 + "version": "1.2.4", 1157 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", 1158 + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", 1159 + "cpu": [ 1160 + "arm" 1161 + ], 1162 + "license": "LGPL-3.0-or-later", 1163 + "optional": true, 1164 + "os": [ 1165 + "linux" 1166 + ], 1167 + "funding": { 1168 + "url": "https://opencollective.com/libvips" 1169 + } 1170 + }, 1171 + "node_modules/@img/sharp-libvips-linux-arm64": { 1172 + "version": "1.2.4", 1173 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", 1174 + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", 1175 + "cpu": [ 1176 + "arm64" 1177 + ], 1178 + "license": "LGPL-3.0-or-later", 1179 + "optional": true, 1180 + "os": [ 1181 + "linux" 1182 + ], 1183 + "funding": { 1184 + "url": "https://opencollective.com/libvips" 1185 + } 1186 + }, 1187 + "node_modules/@img/sharp-libvips-linux-ppc64": { 1188 + "version": "1.2.4", 1189 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", 1190 + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", 1191 + "cpu": [ 1192 + "ppc64" 1193 + ], 1194 + "license": "LGPL-3.0-or-later", 1195 + "optional": true, 1196 + "os": [ 1197 + "linux" 1198 + ], 1199 + "funding": { 1200 + "url": "https://opencollective.com/libvips" 1201 + } 1202 + }, 1203 + "node_modules/@img/sharp-libvips-linux-riscv64": { 1204 + "version": "1.2.4", 1205 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", 1206 + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", 1207 + "cpu": [ 1208 + "riscv64" 1209 + ], 1210 + "license": "LGPL-3.0-or-later", 1211 + "optional": true, 1212 + "os": [ 1213 + "linux" 1214 + ], 1215 + "funding": { 1216 + "url": "https://opencollective.com/libvips" 1217 + } 1218 + }, 1219 + "node_modules/@img/sharp-libvips-linux-s390x": { 1220 + "version": "1.2.4", 1221 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", 1222 + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", 1223 + "cpu": [ 1224 + "s390x" 1225 + ], 1226 + "license": "LGPL-3.0-or-later", 1227 + "optional": true, 1228 + "os": [ 1229 + "linux" 1230 + ], 1231 + "funding": { 1232 + "url": "https://opencollective.com/libvips" 1233 + } 1234 + }, 1235 + "node_modules/@img/sharp-libvips-linux-x64": { 1236 + "version": "1.2.4", 1237 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", 1238 + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", 1239 + "cpu": [ 1240 + "x64" 1241 + ], 1242 + "license": "LGPL-3.0-or-later", 1243 + "optional": true, 1244 + "os": [ 1245 + "linux" 1246 + ], 1247 + "funding": { 1248 + "url": "https://opencollective.com/libvips" 1249 + } 1250 + }, 1251 + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 1252 + "version": "1.2.4", 1253 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", 1254 + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", 1255 + "cpu": [ 1256 + "arm64" 1257 + ], 1258 + "license": "LGPL-3.0-or-later", 1259 + "optional": true, 1260 + "os": [ 1261 + "linux" 1262 + ], 1263 + "funding": { 1264 + "url": "https://opencollective.com/libvips" 1265 + } 1266 + }, 1267 + "node_modules/@img/sharp-libvips-linuxmusl-x64": { 1268 + "version": "1.2.4", 1269 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", 1270 + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", 1271 + "cpu": [ 1272 + "x64" 1273 + ], 1274 + "license": "LGPL-3.0-or-later", 1275 + "optional": true, 1276 + "os": [ 1277 + "linux" 1278 + ], 1279 + "funding": { 1280 + "url": "https://opencollective.com/libvips" 1281 + } 1282 + }, 1283 + "node_modules/@img/sharp-linux-arm": { 1284 + "version": "0.34.5", 1285 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", 1286 + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", 1287 + "cpu": [ 1288 + "arm" 1289 + ], 1290 + "license": "Apache-2.0", 1291 + "optional": true, 1292 + "os": [ 1293 + "linux" 1294 + ], 1295 + "engines": { 1296 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1297 + }, 1298 + "funding": { 1299 + "url": "https://opencollective.com/libvips" 1300 + }, 1301 + "optionalDependencies": { 1302 + "@img/sharp-libvips-linux-arm": "1.2.4" 1303 + } 1304 + }, 1305 + "node_modules/@img/sharp-linux-arm64": { 1306 + "version": "0.34.5", 1307 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", 1308 + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", 1309 + "cpu": [ 1310 + "arm64" 1311 + ], 1312 + "license": "Apache-2.0", 1313 + "optional": true, 1314 + "os": [ 1315 + "linux" 1316 + ], 1317 + "engines": { 1318 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1319 + }, 1320 + "funding": { 1321 + "url": "https://opencollective.com/libvips" 1322 + }, 1323 + "optionalDependencies": { 1324 + "@img/sharp-libvips-linux-arm64": "1.2.4" 1325 + } 1326 + }, 1327 + "node_modules/@img/sharp-linux-ppc64": { 1328 + "version": "0.34.5", 1329 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", 1330 + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", 1331 + "cpu": [ 1332 + "ppc64" 1333 + ], 1334 + "license": "Apache-2.0", 1335 + "optional": true, 1336 + "os": [ 1337 + "linux" 1338 + ], 1339 + "engines": { 1340 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1341 + }, 1342 + "funding": { 1343 + "url": "https://opencollective.com/libvips" 1344 + }, 1345 + "optionalDependencies": { 1346 + "@img/sharp-libvips-linux-ppc64": "1.2.4" 1347 + } 1348 + }, 1349 + "node_modules/@img/sharp-linux-riscv64": { 1350 + "version": "0.34.5", 1351 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", 1352 + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", 1353 + "cpu": [ 1354 + "riscv64" 1355 + ], 1356 + "license": "Apache-2.0", 1357 + "optional": true, 1358 + "os": [ 1359 + "linux" 1360 + ], 1361 + "engines": { 1362 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1363 + }, 1364 + "funding": { 1365 + "url": "https://opencollective.com/libvips" 1366 + }, 1367 + "optionalDependencies": { 1368 + "@img/sharp-libvips-linux-riscv64": "1.2.4" 1369 + } 1370 + }, 1371 + "node_modules/@img/sharp-linux-s390x": { 1372 + "version": "0.34.5", 1373 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", 1374 + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", 1375 + "cpu": [ 1376 + "s390x" 1377 + ], 1378 + "license": "Apache-2.0", 1379 + "optional": true, 1380 + "os": [ 1381 + "linux" 1382 + ], 1383 + "engines": { 1384 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1385 + }, 1386 + "funding": { 1387 + "url": "https://opencollective.com/libvips" 1388 + }, 1389 + "optionalDependencies": { 1390 + "@img/sharp-libvips-linux-s390x": "1.2.4" 1391 + } 1392 + }, 1393 + "node_modules/@img/sharp-linux-x64": { 1394 + "version": "0.34.5", 1395 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", 1396 + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", 1397 + "cpu": [ 1398 + "x64" 1399 + ], 1400 + "license": "Apache-2.0", 1401 + "optional": true, 1402 + "os": [ 1403 + "linux" 1404 + ], 1405 + "engines": { 1406 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1407 + }, 1408 + "funding": { 1409 + "url": "https://opencollective.com/libvips" 1410 + }, 1411 + "optionalDependencies": { 1412 + "@img/sharp-libvips-linux-x64": "1.2.4" 1413 + } 1414 + }, 1415 + "node_modules/@img/sharp-linuxmusl-arm64": { 1416 + "version": "0.34.5", 1417 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", 1418 + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", 1419 + "cpu": [ 1420 + "arm64" 1421 + ], 1422 + "license": "Apache-2.0", 1423 + "optional": true, 1424 + "os": [ 1425 + "linux" 1426 + ], 1427 + "engines": { 1428 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1429 + }, 1430 + "funding": { 1431 + "url": "https://opencollective.com/libvips" 1432 + }, 1433 + "optionalDependencies": { 1434 + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" 1435 + } 1436 + }, 1437 + "node_modules/@img/sharp-linuxmusl-x64": { 1438 + "version": "0.34.5", 1439 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", 1440 + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", 1441 + "cpu": [ 1442 + "x64" 1443 + ], 1444 + "license": "Apache-2.0", 1445 + "optional": true, 1446 + "os": [ 1447 + "linux" 1448 + ], 1449 + "engines": { 1450 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1451 + }, 1452 + "funding": { 1453 + "url": "https://opencollective.com/libvips" 1454 + }, 1455 + "optionalDependencies": { 1456 + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" 1457 + } 1458 + }, 1459 + "node_modules/@img/sharp-wasm32": { 1460 + "version": "0.34.5", 1461 + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", 1462 + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", 1463 + "cpu": [ 1464 + "wasm32" 1465 + ], 1466 + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 1467 + "optional": true, 1468 + "dependencies": { 1469 + "@emnapi/runtime": "^1.7.0" 1470 + }, 1471 + "engines": { 1472 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1473 + }, 1474 + "funding": { 1475 + "url": "https://opencollective.com/libvips" 1476 + } 1477 + }, 1478 + "node_modules/@img/sharp-win32-arm64": { 1479 + "version": "0.34.5", 1480 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", 1481 + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", 1482 + "cpu": [ 1483 + "arm64" 1484 + ], 1485 + "license": "Apache-2.0 AND LGPL-3.0-or-later", 1486 + "optional": true, 1487 + "os": [ 1488 + "win32" 1489 + ], 1490 + "engines": { 1491 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1492 + }, 1493 + "funding": { 1494 + "url": "https://opencollective.com/libvips" 1495 + } 1496 + }, 1497 + "node_modules/@img/sharp-win32-ia32": { 1498 + "version": "0.34.5", 1499 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", 1500 + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", 1501 + "cpu": [ 1502 + "ia32" 1503 + ], 1504 + "license": "Apache-2.0 AND LGPL-3.0-or-later", 1505 + "optional": true, 1506 + "os": [ 1507 + "win32" 1508 + ], 1509 + "engines": { 1510 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1511 + }, 1512 + "funding": { 1513 + "url": "https://opencollective.com/libvips" 1514 + } 1515 + }, 1516 + "node_modules/@img/sharp-win32-x64": { 1517 + "version": "0.34.5", 1518 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", 1519 + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", 1520 + "cpu": [ 1521 + "x64" 1522 + ], 1523 + "license": "Apache-2.0 AND LGPL-3.0-or-later", 1524 + "optional": true, 1525 + "os": [ 1526 + "win32" 1527 + ], 1528 + "engines": { 1529 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1530 + }, 1531 + "funding": { 1532 + "url": "https://opencollective.com/libvips" 1533 + } 1534 + }, 1535 + "node_modules/@ipld/dag-cbor": { 1536 + "version": "7.0.3", 1537 + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz", 1538 + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 1539 + "license": "(Apache-2.0 AND MIT)", 1540 + "dependencies": { 1541 + "cborg": "^1.6.0", 1542 + "multiformats": "^9.5.4" 1543 + } 1544 + }, 1545 + "node_modules/@jridgewell/gen-mapping": { 1546 + "version": "0.3.13", 1547 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 1548 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 1549 + "dev": true, 1550 + "license": "MIT", 1551 + "dependencies": { 1552 + "@jridgewell/sourcemap-codec": "^1.5.0", 1553 + "@jridgewell/trace-mapping": "^0.3.24" 1554 + } 1555 + }, 1556 + "node_modules/@jridgewell/remapping": { 1557 + "version": "2.3.5", 1558 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 1559 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 1560 + "dev": true, 1561 + "license": "MIT", 1562 + "dependencies": { 1563 + "@jridgewell/gen-mapping": "^0.3.5", 1564 + "@jridgewell/trace-mapping": "^0.3.24" 1565 + } 1566 + }, 1567 + "node_modules/@jridgewell/resolve-uri": { 1568 + "version": "3.1.2", 1569 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1570 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1571 + "dev": true, 1572 + "license": "MIT", 1573 + "engines": { 1574 + "node": ">=6.0.0" 1575 + } 1576 + }, 1577 + "node_modules/@jridgewell/sourcemap-codec": { 1578 + "version": "1.5.5", 1579 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 1580 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 1581 + "dev": true, 1582 + "license": "MIT" 1583 + }, 1584 + "node_modules/@jridgewell/trace-mapping": { 1585 + "version": "0.3.31", 1586 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 1587 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 1588 + "dev": true, 1589 + "license": "MIT", 1590 + "dependencies": { 1591 + "@jridgewell/resolve-uri": "^3.1.0", 1592 + "@jridgewell/sourcemap-codec": "^1.4.14" 1593 + } 1594 + }, 1595 + "node_modules/@napi-rs/wasm-runtime": { 1596 + "version": "0.2.12", 1597 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", 1598 + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", 1599 + "dev": true, 1600 + "license": "MIT", 1601 + "optional": true, 1602 + "dependencies": { 1603 + "@emnapi/core": "^1.4.3", 1604 + "@emnapi/runtime": "^1.4.3", 1605 + "@tybys/wasm-util": "^0.10.0" 1606 + } 1607 + }, 1608 + "node_modules/@next/env": { 1609 + "version": "16.0.3", 1610 + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.3.tgz", 1611 + "integrity": "sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==", 1612 + "license": "MIT" 1613 + }, 1614 + "node_modules/@next/eslint-plugin-next": { 1615 + "version": "16.0.3", 1616 + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.3.tgz", 1617 + "integrity": "sha512-6sPWmZetzFWMsz7Dhuxsdmbu3fK+/AxKRtj7OB0/3OZAI2MHB/v2FeYh271LZ9abvnM1WIwWc/5umYjx0jo5sQ==", 1618 + "dev": true, 1619 + "license": "MIT", 1620 + "dependencies": { 1621 + "fast-glob": "3.3.1" 1622 + } 1623 + }, 1624 + "node_modules/@next/swc-darwin-arm64": { 1625 + "version": "16.0.3", 1626 + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.3.tgz", 1627 + "integrity": "sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==", 1628 + "cpu": [ 1629 + "arm64" 1630 + ], 1631 + "license": "MIT", 1632 + "optional": true, 1633 + "os": [ 1634 + "darwin" 1635 + ], 1636 + "engines": { 1637 + "node": ">= 10" 1638 + } 1639 + }, 1640 + "node_modules/@next/swc-darwin-x64": { 1641 + "version": "16.0.3", 1642 + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.3.tgz", 1643 + "integrity": "sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==", 1644 + "cpu": [ 1645 + "x64" 1646 + ], 1647 + "license": "MIT", 1648 + "optional": true, 1649 + "os": [ 1650 + "darwin" 1651 + ], 1652 + "engines": { 1653 + "node": ">= 10" 1654 + } 1655 + }, 1656 + "node_modules/@next/swc-linux-arm64-gnu": { 1657 + "version": "16.0.3", 1658 + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.3.tgz", 1659 + "integrity": "sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==", 1660 + "cpu": [ 1661 + "arm64" 1662 + ], 1663 + "license": "MIT", 1664 + "optional": true, 1665 + "os": [ 1666 + "linux" 1667 + ], 1668 + "engines": { 1669 + "node": ">= 10" 1670 + } 1671 + }, 1672 + "node_modules/@next/swc-linux-arm64-musl": { 1673 + "version": "16.0.3", 1674 + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.3.tgz", 1675 + "integrity": "sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==", 1676 + "cpu": [ 1677 + "arm64" 1678 + ], 1679 + "license": "MIT", 1680 + "optional": true, 1681 + "os": [ 1682 + "linux" 1683 + ], 1684 + "engines": { 1685 + "node": ">= 10" 1686 + } 1687 + }, 1688 + "node_modules/@next/swc-linux-x64-gnu": { 1689 + "version": "16.0.3", 1690 + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.3.tgz", 1691 + "integrity": "sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==", 1692 + "cpu": [ 1693 + "x64" 1694 + ], 1695 + "license": "MIT", 1696 + "optional": true, 1697 + "os": [ 1698 + "linux" 1699 + ], 1700 + "engines": { 1701 + "node": ">= 10" 1702 + } 1703 + }, 1704 + "node_modules/@next/swc-linux-x64-musl": { 1705 + "version": "16.0.3", 1706 + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.3.tgz", 1707 + "integrity": "sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==", 1708 + "cpu": [ 1709 + "x64" 1710 + ], 1711 + "license": "MIT", 1712 + "optional": true, 1713 + "os": [ 1714 + "linux" 1715 + ], 1716 + "engines": { 1717 + "node": ">= 10" 1718 + } 1719 + }, 1720 + "node_modules/@next/swc-win32-arm64-msvc": { 1721 + "version": "16.0.3", 1722 + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.3.tgz", 1723 + "integrity": "sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==", 1724 + "cpu": [ 1725 + "arm64" 1726 + ], 1727 + "license": "MIT", 1728 + "optional": true, 1729 + "os": [ 1730 + "win32" 1731 + ], 1732 + "engines": { 1733 + "node": ">= 10" 1734 + } 1735 + }, 1736 + "node_modules/@next/swc-win32-x64-msvc": { 1737 + "version": "16.0.3", 1738 + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.3.tgz", 1739 + "integrity": "sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==", 1740 + "cpu": [ 1741 + "x64" 1742 + ], 1743 + "license": "MIT", 1744 + "optional": true, 1745 + "os": [ 1746 + "win32" 1747 + ], 1748 + "engines": { 1749 + "node": ">= 10" 1750 + } 1751 + }, 1752 + "node_modules/@noble/curves": { 1753 + "version": "1.9.7", 1754 + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", 1755 + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", 1756 + "license": "MIT", 1757 + "dependencies": { 1758 + "@noble/hashes": "1.8.0" 1759 + }, 1760 + "engines": { 1761 + "node": "^14.21.3 || >=16" 1762 + }, 1763 + "funding": { 1764 + "url": "https://paulmillr.com/funding/" 1765 + } 1766 + }, 1767 + "node_modules/@noble/hashes": { 1768 + "version": "1.8.0", 1769 + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", 1770 + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", 1771 + "license": "MIT", 1772 + "engines": { 1773 + "node": "^14.21.3 || >=16" 1774 + }, 1775 + "funding": { 1776 + "url": "https://paulmillr.com/funding/" 1777 + } 1778 + }, 1779 + "node_modules/@nodelib/fs.scandir": { 1780 + "version": "2.1.5", 1781 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1782 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1783 + "dev": true, 1784 + "license": "MIT", 1785 + "dependencies": { 1786 + "@nodelib/fs.stat": "2.0.5", 1787 + "run-parallel": "^1.1.9" 1788 + }, 1789 + "engines": { 1790 + "node": ">= 8" 1791 + } 1792 + }, 1793 + "node_modules/@nodelib/fs.stat": { 1794 + "version": "2.0.5", 1795 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1796 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1797 + "dev": true, 1798 + "license": "MIT", 1799 + "engines": { 1800 + "node": ">= 8" 1801 + } 1802 + }, 1803 + "node_modules/@nodelib/fs.walk": { 1804 + "version": "1.2.8", 1805 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1806 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1807 + "dev": true, 1808 + "license": "MIT", 1809 + "dependencies": { 1810 + "@nodelib/fs.scandir": "2.1.5", 1811 + "fastq": "^1.6.0" 1812 + }, 1813 + "engines": { 1814 + "node": ">= 8" 1815 + } 1816 + }, 1817 + "node_modules/@nolyfill/is-core-module": { 1818 + "version": "1.0.39", 1819 + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", 1820 + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", 1821 + "dev": true, 1822 + "license": "MIT", 1823 + "engines": { 1824 + "node": ">=12.4.0" 1825 + } 1826 + }, 1827 + "node_modules/@rtsao/scc": { 1828 + "version": "1.1.0", 1829 + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", 1830 + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", 1831 + "dev": true, 1832 + "license": "MIT" 1833 + }, 1834 + "node_modules/@swc/helpers": { 1835 + "version": "0.5.15", 1836 + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", 1837 + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", 1838 + "license": "Apache-2.0", 1839 + "dependencies": { 1840 + "tslib": "^2.8.0" 1841 + } 1842 + }, 1843 + "node_modules/@tailwindcss/node": { 1844 + "version": "4.1.17", 1845 + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", 1846 + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", 1847 + "dev": true, 1848 + "license": "MIT", 1849 + "dependencies": { 1850 + "@jridgewell/remapping": "^2.3.4", 1851 + "enhanced-resolve": "^5.18.3", 1852 + "jiti": "^2.6.1", 1853 + "lightningcss": "1.30.2", 1854 + "magic-string": "^0.30.21", 1855 + "source-map-js": "^1.2.1", 1856 + "tailwindcss": "4.1.17" 1857 + } 1858 + }, 1859 + "node_modules/@tailwindcss/oxide": { 1860 + "version": "4.1.17", 1861 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", 1862 + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", 1863 + "dev": true, 1864 + "license": "MIT", 1865 + "engines": { 1866 + "node": ">= 10" 1867 + }, 1868 + "optionalDependencies": { 1869 + "@tailwindcss/oxide-android-arm64": "4.1.17", 1870 + "@tailwindcss/oxide-darwin-arm64": "4.1.17", 1871 + "@tailwindcss/oxide-darwin-x64": "4.1.17", 1872 + "@tailwindcss/oxide-freebsd-x64": "4.1.17", 1873 + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", 1874 + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", 1875 + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", 1876 + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", 1877 + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", 1878 + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", 1879 + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", 1880 + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" 1881 + } 1882 + }, 1883 + "node_modules/@tailwindcss/oxide-android-arm64": { 1884 + "version": "4.1.17", 1885 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", 1886 + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", 1887 + "cpu": [ 1888 + "arm64" 1889 + ], 1890 + "dev": true, 1891 + "license": "MIT", 1892 + "optional": true, 1893 + "os": [ 1894 + "android" 1895 + ], 1896 + "engines": { 1897 + "node": ">= 10" 1898 + } 1899 + }, 1900 + "node_modules/@tailwindcss/oxide-darwin-arm64": { 1901 + "version": "4.1.17", 1902 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", 1903 + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", 1904 + "cpu": [ 1905 + "arm64" 1906 + ], 1907 + "dev": true, 1908 + "license": "MIT", 1909 + "optional": true, 1910 + "os": [ 1911 + "darwin" 1912 + ], 1913 + "engines": { 1914 + "node": ">= 10" 1915 + } 1916 + }, 1917 + "node_modules/@tailwindcss/oxide-darwin-x64": { 1918 + "version": "4.1.17", 1919 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", 1920 + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", 1921 + "cpu": [ 1922 + "x64" 1923 + ], 1924 + "dev": true, 1925 + "license": "MIT", 1926 + "optional": true, 1927 + "os": [ 1928 + "darwin" 1929 + ], 1930 + "engines": { 1931 + "node": ">= 10" 1932 + } 1933 + }, 1934 + "node_modules/@tailwindcss/oxide-freebsd-x64": { 1935 + "version": "4.1.17", 1936 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", 1937 + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", 1938 + "cpu": [ 1939 + "x64" 1940 + ], 1941 + "dev": true, 1942 + "license": "MIT", 1943 + "optional": true, 1944 + "os": [ 1945 + "freebsd" 1946 + ], 1947 + "engines": { 1948 + "node": ">= 10" 1949 + } 1950 + }, 1951 + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 1952 + "version": "4.1.17", 1953 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", 1954 + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", 1955 + "cpu": [ 1956 + "arm" 1957 + ], 1958 + "dev": true, 1959 + "license": "MIT", 1960 + "optional": true, 1961 + "os": [ 1962 + "linux" 1963 + ], 1964 + "engines": { 1965 + "node": ">= 10" 1966 + } 1967 + }, 1968 + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 1969 + "version": "4.1.17", 1970 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", 1971 + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", 1972 + "cpu": [ 1973 + "arm64" 1974 + ], 1975 + "dev": true, 1976 + "license": "MIT", 1977 + "optional": true, 1978 + "os": [ 1979 + "linux" 1980 + ], 1981 + "engines": { 1982 + "node": ">= 10" 1983 + } 1984 + }, 1985 + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 1986 + "version": "4.1.17", 1987 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", 1988 + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", 1989 + "cpu": [ 1990 + "arm64" 1991 + ], 1992 + "dev": true, 1993 + "license": "MIT", 1994 + "optional": true, 1995 + "os": [ 1996 + "linux" 1997 + ], 1998 + "engines": { 1999 + "node": ">= 10" 2000 + } 2001 + }, 2002 + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 2003 + "version": "4.1.17", 2004 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", 2005 + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", 2006 + "cpu": [ 2007 + "x64" 2008 + ], 2009 + "dev": true, 2010 + "license": "MIT", 2011 + "optional": true, 2012 + "os": [ 2013 + "linux" 2014 + ], 2015 + "engines": { 2016 + "node": ">= 10" 2017 + } 2018 + }, 2019 + "node_modules/@tailwindcss/oxide-linux-x64-musl": { 2020 + "version": "4.1.17", 2021 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", 2022 + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", 2023 + "cpu": [ 2024 + "x64" 2025 + ], 2026 + "dev": true, 2027 + "license": "MIT", 2028 + "optional": true, 2029 + "os": [ 2030 + "linux" 2031 + ], 2032 + "engines": { 2033 + "node": ">= 10" 2034 + } 2035 + }, 2036 + "node_modules/@tailwindcss/oxide-wasm32-wasi": { 2037 + "version": "4.1.17", 2038 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", 2039 + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", 2040 + "bundleDependencies": [ 2041 + "@napi-rs/wasm-runtime", 2042 + "@emnapi/core", 2043 + "@emnapi/runtime", 2044 + "@tybys/wasm-util", 2045 + "@emnapi/wasi-threads", 2046 + "tslib" 2047 + ], 2048 + "cpu": [ 2049 + "wasm32" 2050 + ], 2051 + "dev": true, 2052 + "license": "MIT", 2053 + "optional": true, 2054 + "dependencies": { 2055 + "@emnapi/core": "^1.6.0", 2056 + "@emnapi/runtime": "^1.6.0", 2057 + "@emnapi/wasi-threads": "^1.1.0", 2058 + "@napi-rs/wasm-runtime": "^1.0.7", 2059 + "@tybys/wasm-util": "^0.10.1", 2060 + "tslib": "^2.4.0" 2061 + }, 2062 + "engines": { 2063 + "node": ">=14.0.0" 2064 + } 2065 + }, 2066 + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 2067 + "version": "4.1.17", 2068 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", 2069 + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", 2070 + "cpu": [ 2071 + "arm64" 2072 + ], 2073 + "dev": true, 2074 + "license": "MIT", 2075 + "optional": true, 2076 + "os": [ 2077 + "win32" 2078 + ], 2079 + "engines": { 2080 + "node": ">= 10" 2081 + } 2082 + }, 2083 + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 2084 + "version": "4.1.17", 2085 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", 2086 + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", 2087 + "cpu": [ 2088 + "x64" 2089 + ], 2090 + "dev": true, 2091 + "license": "MIT", 2092 + "optional": true, 2093 + "os": [ 2094 + "win32" 2095 + ], 2096 + "engines": { 2097 + "node": ">= 10" 2098 + } 2099 + }, 2100 + "node_modules/@tailwindcss/postcss": { 2101 + "version": "4.1.17", 2102 + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", 2103 + "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", 2104 + "dev": true, 2105 + "license": "MIT", 2106 + "dependencies": { 2107 + "@alloc/quick-lru": "^5.2.0", 2108 + "@tailwindcss/node": "4.1.17", 2109 + "@tailwindcss/oxide": "4.1.17", 2110 + "postcss": "^8.4.41", 2111 + "tailwindcss": "4.1.17" 2112 + } 2113 + }, 2114 + "node_modules/@ts-morph/common": { 2115 + "version": "0.25.0", 2116 + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", 2117 + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", 2118 + "dev": true, 2119 + "license": "MIT", 2120 + "dependencies": { 2121 + "minimatch": "^9.0.4", 2122 + "path-browserify": "^1.0.1", 2123 + "tinyglobby": "^0.2.9" 2124 + } 2125 + }, 2126 + "node_modules/@ts-morph/common/node_modules/brace-expansion": { 2127 + "version": "2.0.2", 2128 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 2129 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 2130 + "dev": true, 2131 + "license": "MIT", 2132 + "dependencies": { 2133 + "balanced-match": "^1.0.0" 2134 + } 2135 + }, 2136 + "node_modules/@ts-morph/common/node_modules/minimatch": { 2137 + "version": "9.0.5", 2138 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2139 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2140 + "dev": true, 2141 + "license": "ISC", 2142 + "dependencies": { 2143 + "brace-expansion": "^2.0.1" 2144 + }, 2145 + "engines": { 2146 + "node": ">=16 || 14 >=14.17" 2147 + }, 2148 + "funding": { 2149 + "url": "https://github.com/sponsors/isaacs" 2150 + } 2151 + }, 2152 + "node_modules/@tybys/wasm-util": { 2153 + "version": "0.10.1", 2154 + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", 2155 + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", 2156 + "dev": true, 2157 + "license": "MIT", 2158 + "optional": true, 2159 + "dependencies": { 2160 + "tslib": "^2.4.0" 2161 + } 2162 + }, 2163 + "node_modules/@types/cors": { 2164 + "version": "2.8.19", 2165 + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", 2166 + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", 2167 + "dev": true, 2168 + "license": "MIT", 2169 + "dependencies": { 2170 + "@types/node": "*" 2171 + } 2172 + }, 2173 + "node_modules/@types/estree": { 2174 + "version": "1.0.8", 2175 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 2176 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 2177 + "dev": true, 2178 + "license": "MIT" 2179 + }, 2180 + "node_modules/@types/json-schema": { 2181 + "version": "7.0.15", 2182 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 2183 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 2184 + "dev": true, 2185 + "license": "MIT" 2186 + }, 2187 + "node_modules/@types/json5": { 2188 + "version": "0.0.29", 2189 + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 2190 + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", 2191 + "dev": true, 2192 + "license": "MIT" 2193 + }, 2194 + "node_modules/@types/node": { 2195 + "version": "24.10.1", 2196 + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", 2197 + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", 2198 + "dev": true, 2199 + "license": "MIT", 2200 + "dependencies": { 2201 + "undici-types": "~7.16.0" 2202 + } 2203 + }, 2204 + "node_modules/@types/qrcode": { 2205 + "version": "1.5.6", 2206 + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", 2207 + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", 2208 + "dev": true, 2209 + "license": "MIT", 2210 + "dependencies": { 2211 + "@types/node": "*" 2212 + } 2213 + }, 2214 + "node_modules/@types/react": { 2215 + "version": "19.2.4", 2216 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.4.tgz", 2217 + "integrity": "sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==", 2218 + "dev": true, 2219 + "license": "MIT", 2220 + "dependencies": { 2221 + "csstype": "^3.0.2" 2222 + } 2223 + }, 2224 + "node_modules/@types/react-dom": { 2225 + "version": "19.2.3", 2226 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", 2227 + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", 2228 + "dev": true, 2229 + "license": "MIT", 2230 + "peerDependencies": { 2231 + "@types/react": "^19.2.0" 2232 + } 2233 + }, 2234 + "node_modules/@types/uuid": { 2235 + "version": "11.0.0", 2236 + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-11.0.0.tgz", 2237 + "integrity": "sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==", 2238 + "deprecated": "This is a stub types definition. uuid provides its own type definitions, so you do not need this installed.", 2239 + "dev": true, 2240 + "license": "MIT", 2241 + "dependencies": { 2242 + "uuid": "*" 2243 + } 2244 + }, 2245 + "node_modules/@typescript-eslint/eslint-plugin": { 2246 + "version": "8.46.4", 2247 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", 2248 + "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", 2249 + "dev": true, 2250 + "license": "MIT", 2251 + "dependencies": { 2252 + "@eslint-community/regexpp": "^4.10.0", 2253 + "@typescript-eslint/scope-manager": "8.46.4", 2254 + "@typescript-eslint/type-utils": "8.46.4", 2255 + "@typescript-eslint/utils": "8.46.4", 2256 + "@typescript-eslint/visitor-keys": "8.46.4", 2257 + "graphemer": "^1.4.0", 2258 + "ignore": "^7.0.0", 2259 + "natural-compare": "^1.4.0", 2260 + "ts-api-utils": "^2.1.0" 2261 + }, 2262 + "engines": { 2263 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2264 + }, 2265 + "funding": { 2266 + "type": "opencollective", 2267 + "url": "https://opencollective.com/typescript-eslint" 2268 + }, 2269 + "peerDependencies": { 2270 + "@typescript-eslint/parser": "^8.46.4", 2271 + "eslint": "^8.57.0 || ^9.0.0", 2272 + "typescript": ">=4.8.4 <6.0.0" 2273 + } 2274 + }, 2275 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 2276 + "version": "7.0.5", 2277 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", 2278 + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", 2279 + "dev": true, 2280 + "license": "MIT", 2281 + "engines": { 2282 + "node": ">= 4" 2283 + } 2284 + }, 2285 + "node_modules/@typescript-eslint/parser": { 2286 + "version": "8.46.4", 2287 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", 2288 + "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", 2289 + "dev": true, 2290 + "license": "MIT", 2291 + "dependencies": { 2292 + "@typescript-eslint/scope-manager": "8.46.4", 2293 + "@typescript-eslint/types": "8.46.4", 2294 + "@typescript-eslint/typescript-estree": "8.46.4", 2295 + "@typescript-eslint/visitor-keys": "8.46.4", 2296 + "debug": "^4.3.4" 2297 + }, 2298 + "engines": { 2299 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2300 + }, 2301 + "funding": { 2302 + "type": "opencollective", 2303 + "url": "https://opencollective.com/typescript-eslint" 2304 + }, 2305 + "peerDependencies": { 2306 + "eslint": "^8.57.0 || ^9.0.0", 2307 + "typescript": ">=4.8.4 <6.0.0" 2308 + } 2309 + }, 2310 + "node_modules/@typescript-eslint/project-service": { 2311 + "version": "8.46.4", 2312 + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", 2313 + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", 2314 + "dev": true, 2315 + "license": "MIT", 2316 + "dependencies": { 2317 + "@typescript-eslint/tsconfig-utils": "^8.46.4", 2318 + "@typescript-eslint/types": "^8.46.4", 2319 + "debug": "^4.3.4" 2320 + }, 2321 + "engines": { 2322 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2323 + }, 2324 + "funding": { 2325 + "type": "opencollective", 2326 + "url": "https://opencollective.com/typescript-eslint" 2327 + }, 2328 + "peerDependencies": { 2329 + "typescript": ">=4.8.4 <6.0.0" 2330 + } 2331 + }, 2332 + "node_modules/@typescript-eslint/scope-manager": { 2333 + "version": "8.46.4", 2334 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", 2335 + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", 2336 + "dev": true, 2337 + "license": "MIT", 2338 + "dependencies": { 2339 + "@typescript-eslint/types": "8.46.4", 2340 + "@typescript-eslint/visitor-keys": "8.46.4" 2341 + }, 2342 + "engines": { 2343 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2344 + }, 2345 + "funding": { 2346 + "type": "opencollective", 2347 + "url": "https://opencollective.com/typescript-eslint" 2348 + } 2349 + }, 2350 + "node_modules/@typescript-eslint/tsconfig-utils": { 2351 + "version": "8.46.4", 2352 + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", 2353 + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", 2354 + "dev": true, 2355 + "license": "MIT", 2356 + "engines": { 2357 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2358 + }, 2359 + "funding": { 2360 + "type": "opencollective", 2361 + "url": "https://opencollective.com/typescript-eslint" 2362 + }, 2363 + "peerDependencies": { 2364 + "typescript": ">=4.8.4 <6.0.0" 2365 + } 2366 + }, 2367 + "node_modules/@typescript-eslint/type-utils": { 2368 + "version": "8.46.4", 2369 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", 2370 + "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", 2371 + "dev": true, 2372 + "license": "MIT", 2373 + "dependencies": { 2374 + "@typescript-eslint/types": "8.46.4", 2375 + "@typescript-eslint/typescript-estree": "8.46.4", 2376 + "@typescript-eslint/utils": "8.46.4", 2377 + "debug": "^4.3.4", 2378 + "ts-api-utils": "^2.1.0" 2379 + }, 2380 + "engines": { 2381 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2382 + }, 2383 + "funding": { 2384 + "type": "opencollective", 2385 + "url": "https://opencollective.com/typescript-eslint" 2386 + }, 2387 + "peerDependencies": { 2388 + "eslint": "^8.57.0 || ^9.0.0", 2389 + "typescript": ">=4.8.4 <6.0.0" 2390 + } 2391 + }, 2392 + "node_modules/@typescript-eslint/types": { 2393 + "version": "8.46.4", 2394 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", 2395 + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", 2396 + "dev": true, 2397 + "license": "MIT", 2398 + "engines": { 2399 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2400 + }, 2401 + "funding": { 2402 + "type": "opencollective", 2403 + "url": "https://opencollective.com/typescript-eslint" 2404 + } 2405 + }, 2406 + "node_modules/@typescript-eslint/typescript-estree": { 2407 + "version": "8.46.4", 2408 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", 2409 + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", 2410 + "dev": true, 2411 + "license": "MIT", 2412 + "dependencies": { 2413 + "@typescript-eslint/project-service": "8.46.4", 2414 + "@typescript-eslint/tsconfig-utils": "8.46.4", 2415 + "@typescript-eslint/types": "8.46.4", 2416 + "@typescript-eslint/visitor-keys": "8.46.4", 2417 + "debug": "^4.3.4", 2418 + "fast-glob": "^3.3.2", 2419 + "is-glob": "^4.0.3", 2420 + "minimatch": "^9.0.4", 2421 + "semver": "^7.6.0", 2422 + "ts-api-utils": "^2.1.0" 2423 + }, 2424 + "engines": { 2425 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2426 + }, 2427 + "funding": { 2428 + "type": "opencollective", 2429 + "url": "https://opencollective.com/typescript-eslint" 2430 + }, 2431 + "peerDependencies": { 2432 + "typescript": ">=4.8.4 <6.0.0" 2433 + } 2434 + }, 2435 + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 2436 + "version": "2.0.2", 2437 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 2438 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 2439 + "dev": true, 2440 + "license": "MIT", 2441 + "dependencies": { 2442 + "balanced-match": "^1.0.0" 2443 + } 2444 + }, 2445 + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { 2446 + "version": "3.3.3", 2447 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 2448 + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2449 + "dev": true, 2450 + "license": "MIT", 2451 + "dependencies": { 2452 + "@nodelib/fs.stat": "^2.0.2", 2453 + "@nodelib/fs.walk": "^1.2.3", 2454 + "glob-parent": "^5.1.2", 2455 + "merge2": "^1.3.0", 2456 + "micromatch": "^4.0.8" 2457 + }, 2458 + "engines": { 2459 + "node": ">=8.6.0" 2460 + } 2461 + }, 2462 + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { 2463 + "version": "5.1.2", 2464 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2465 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2466 + "dev": true, 2467 + "license": "ISC", 2468 + "dependencies": { 2469 + "is-glob": "^4.0.1" 2470 + }, 2471 + "engines": { 2472 + "node": ">= 6" 2473 + } 2474 + }, 2475 + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 2476 + "version": "9.0.5", 2477 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2478 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2479 + "dev": true, 2480 + "license": "ISC", 2481 + "dependencies": { 2482 + "brace-expansion": "^2.0.1" 2483 + }, 2484 + "engines": { 2485 + "node": ">=16 || 14 >=14.17" 2486 + }, 2487 + "funding": { 2488 + "url": "https://github.com/sponsors/isaacs" 2489 + } 2490 + }, 2491 + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 2492 + "version": "7.7.3", 2493 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 2494 + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 2495 + "dev": true, 2496 + "license": "ISC", 2497 + "bin": { 2498 + "semver": "bin/semver.js" 2499 + }, 2500 + "engines": { 2501 + "node": ">=10" 2502 + } 2503 + }, 2504 + "node_modules/@typescript-eslint/utils": { 2505 + "version": "8.46.4", 2506 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", 2507 + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", 2508 + "dev": true, 2509 + "license": "MIT", 2510 + "dependencies": { 2511 + "@eslint-community/eslint-utils": "^4.7.0", 2512 + "@typescript-eslint/scope-manager": "8.46.4", 2513 + "@typescript-eslint/types": "8.46.4", 2514 + "@typescript-eslint/typescript-estree": "8.46.4" 2515 + }, 2516 + "engines": { 2517 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2518 + }, 2519 + "funding": { 2520 + "type": "opencollective", 2521 + "url": "https://opencollective.com/typescript-eslint" 2522 + }, 2523 + "peerDependencies": { 2524 + "eslint": "^8.57.0 || ^9.0.0", 2525 + "typescript": ">=4.8.4 <6.0.0" 2526 + } 2527 + }, 2528 + "node_modules/@typescript-eslint/visitor-keys": { 2529 + "version": "8.46.4", 2530 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", 2531 + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", 2532 + "dev": true, 2533 + "license": "MIT", 2534 + "dependencies": { 2535 + "@typescript-eslint/types": "8.46.4", 2536 + "eslint-visitor-keys": "^4.2.1" 2537 + }, 2538 + "engines": { 2539 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2540 + }, 2541 + "funding": { 2542 + "type": "opencollective", 2543 + "url": "https://opencollective.com/typescript-eslint" 2544 + } 2545 + }, 2546 + "node_modules/@unrs/resolver-binding-android-arm-eabi": { 2547 + "version": "1.11.1", 2548 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", 2549 + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", 2550 + "cpu": [ 2551 + "arm" 2552 + ], 2553 + "dev": true, 2554 + "license": "MIT", 2555 + "optional": true, 2556 + "os": [ 2557 + "android" 2558 + ] 2559 + }, 2560 + "node_modules/@unrs/resolver-binding-android-arm64": { 2561 + "version": "1.11.1", 2562 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", 2563 + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", 2564 + "cpu": [ 2565 + "arm64" 2566 + ], 2567 + "dev": true, 2568 + "license": "MIT", 2569 + "optional": true, 2570 + "os": [ 2571 + "android" 2572 + ] 2573 + }, 2574 + "node_modules/@unrs/resolver-binding-darwin-arm64": { 2575 + "version": "1.11.1", 2576 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", 2577 + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", 2578 + "cpu": [ 2579 + "arm64" 2580 + ], 2581 + "dev": true, 2582 + "license": "MIT", 2583 + "optional": true, 2584 + "os": [ 2585 + "darwin" 2586 + ] 2587 + }, 2588 + "node_modules/@unrs/resolver-binding-darwin-x64": { 2589 + "version": "1.11.1", 2590 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", 2591 + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", 2592 + "cpu": [ 2593 + "x64" 2594 + ], 2595 + "dev": true, 2596 + "license": "MIT", 2597 + "optional": true, 2598 + "os": [ 2599 + "darwin" 2600 + ] 2601 + }, 2602 + "node_modules/@unrs/resolver-binding-freebsd-x64": { 2603 + "version": "1.11.1", 2604 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", 2605 + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", 2606 + "cpu": [ 2607 + "x64" 2608 + ], 2609 + "dev": true, 2610 + "license": "MIT", 2611 + "optional": true, 2612 + "os": [ 2613 + "freebsd" 2614 + ] 2615 + }, 2616 + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { 2617 + "version": "1.11.1", 2618 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", 2619 + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", 2620 + "cpu": [ 2621 + "arm" 2622 + ], 2623 + "dev": true, 2624 + "license": "MIT", 2625 + "optional": true, 2626 + "os": [ 2627 + "linux" 2628 + ] 2629 + }, 2630 + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { 2631 + "version": "1.11.1", 2632 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", 2633 + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", 2634 + "cpu": [ 2635 + "arm" 2636 + ], 2637 + "dev": true, 2638 + "license": "MIT", 2639 + "optional": true, 2640 + "os": [ 2641 + "linux" 2642 + ] 2643 + }, 2644 + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { 2645 + "version": "1.11.1", 2646 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", 2647 + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", 2648 + "cpu": [ 2649 + "arm64" 2650 + ], 2651 + "dev": true, 2652 + "license": "MIT", 2653 + "optional": true, 2654 + "os": [ 2655 + "linux" 2656 + ] 2657 + }, 2658 + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { 2659 + "version": "1.11.1", 2660 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", 2661 + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", 2662 + "cpu": [ 2663 + "arm64" 2664 + ], 2665 + "dev": true, 2666 + "license": "MIT", 2667 + "optional": true, 2668 + "os": [ 2669 + "linux" 2670 + ] 2671 + }, 2672 + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { 2673 + "version": "1.11.1", 2674 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", 2675 + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", 2676 + "cpu": [ 2677 + "ppc64" 2678 + ], 2679 + "dev": true, 2680 + "license": "MIT", 2681 + "optional": true, 2682 + "os": [ 2683 + "linux" 2684 + ] 2685 + }, 2686 + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { 2687 + "version": "1.11.1", 2688 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", 2689 + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", 2690 + "cpu": [ 2691 + "riscv64" 2692 + ], 2693 + "dev": true, 2694 + "license": "MIT", 2695 + "optional": true, 2696 + "os": [ 2697 + "linux" 2698 + ] 2699 + }, 2700 + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { 2701 + "version": "1.11.1", 2702 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", 2703 + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", 2704 + "cpu": [ 2705 + "riscv64" 2706 + ], 2707 + "dev": true, 2708 + "license": "MIT", 2709 + "optional": true, 2710 + "os": [ 2711 + "linux" 2712 + ] 2713 + }, 2714 + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { 2715 + "version": "1.11.1", 2716 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", 2717 + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", 2718 + "cpu": [ 2719 + "s390x" 2720 + ], 2721 + "dev": true, 2722 + "license": "MIT", 2723 + "optional": true, 2724 + "os": [ 2725 + "linux" 2726 + ] 2727 + }, 2728 + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { 2729 + "version": "1.11.1", 2730 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", 2731 + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", 2732 + "cpu": [ 2733 + "x64" 2734 + ], 2735 + "dev": true, 2736 + "license": "MIT", 2737 + "optional": true, 2738 + "os": [ 2739 + "linux" 2740 + ] 2741 + }, 2742 + "node_modules/@unrs/resolver-binding-linux-x64-musl": { 2743 + "version": "1.11.1", 2744 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", 2745 + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", 2746 + "cpu": [ 2747 + "x64" 2748 + ], 2749 + "dev": true, 2750 + "license": "MIT", 2751 + "optional": true, 2752 + "os": [ 2753 + "linux" 2754 + ] 2755 + }, 2756 + "node_modules/@unrs/resolver-binding-wasm32-wasi": { 2757 + "version": "1.11.1", 2758 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", 2759 + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", 2760 + "cpu": [ 2761 + "wasm32" 2762 + ], 2763 + "dev": true, 2764 + "license": "MIT", 2765 + "optional": true, 2766 + "dependencies": { 2767 + "@napi-rs/wasm-runtime": "^0.2.11" 2768 + }, 2769 + "engines": { 2770 + "node": ">=14.0.0" 2771 + } 2772 + }, 2773 + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { 2774 + "version": "1.11.1", 2775 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", 2776 + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", 2777 + "cpu": [ 2778 + "arm64" 2779 + ], 2780 + "dev": true, 2781 + "license": "MIT", 2782 + "optional": true, 2783 + "os": [ 2784 + "win32" 2785 + ] 2786 + }, 2787 + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { 2788 + "version": "1.11.1", 2789 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", 2790 + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", 2791 + "cpu": [ 2792 + "ia32" 2793 + ], 2794 + "dev": true, 2795 + "license": "MIT", 2796 + "optional": true, 2797 + "os": [ 2798 + "win32" 2799 + ] 2800 + }, 2801 + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { 2802 + "version": "1.11.1", 2803 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", 2804 + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", 2805 + "cpu": [ 2806 + "x64" 2807 + ], 2808 + "dev": true, 2809 + "license": "MIT", 2810 + "optional": true, 2811 + "os": [ 2812 + "win32" 2813 + ] 2814 + }, 2815 + "node_modules/abort-controller": { 2816 + "version": "3.0.0", 2817 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 2818 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 2819 + "license": "MIT", 2820 + "dependencies": { 2821 + "event-target-shim": "^5.0.0" 2822 + }, 2823 + "engines": { 2824 + "node": ">=6.5" 2825 + } 2826 + }, 2827 + "node_modules/accepts": { 2828 + "version": "1.3.8", 2829 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 2830 + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 2831 + "license": "MIT", 2832 + "dependencies": { 2833 + "mime-types": "~2.1.34", 2834 + "negotiator": "0.6.3" 2835 + }, 2836 + "engines": { 2837 + "node": ">= 0.6" 2838 + } 2839 + }, 2840 + "node_modules/acorn": { 2841 + "version": "8.15.0", 2842 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 2843 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 2844 + "dev": true, 2845 + "license": "MIT", 2846 + "bin": { 2847 + "acorn": "bin/acorn" 2848 + }, 2849 + "engines": { 2850 + "node": ">=0.4.0" 2851 + } 2852 + }, 2853 + "node_modules/acorn-jsx": { 2854 + "version": "5.3.2", 2855 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 2856 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 2857 + "dev": true, 2858 + "license": "MIT", 2859 + "peerDependencies": { 2860 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 2861 + } 2862 + }, 2863 + "node_modules/ajv": { 2864 + "version": "6.12.6", 2865 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 2866 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 2867 + "dev": true, 2868 + "license": "MIT", 2869 + "dependencies": { 2870 + "fast-deep-equal": "^3.1.1", 2871 + "fast-json-stable-stringify": "^2.0.0", 2872 + "json-schema-traverse": "^0.4.1", 2873 + "uri-js": "^4.2.2" 2874 + }, 2875 + "funding": { 2876 + "type": "github", 2877 + "url": "https://github.com/sponsors/epoberezkin" 2878 + } 2879 + }, 2880 + "node_modules/ansi-regex": { 2881 + "version": "5.0.1", 2882 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2883 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2884 + "license": "MIT", 2885 + "engines": { 2886 + "node": ">=8" 2887 + } 2888 + }, 2889 + "node_modules/ansi-styles": { 2890 + "version": "4.3.0", 2891 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2892 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2893 + "license": "MIT", 2894 + "dependencies": { 2895 + "color-convert": "^2.0.1" 2896 + }, 2897 + "engines": { 2898 + "node": ">=8" 2899 + }, 2900 + "funding": { 2901 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2902 + } 2903 + }, 2904 + "node_modules/argparse": { 2905 + "version": "2.0.1", 2906 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2907 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2908 + "dev": true, 2909 + "license": "Python-2.0" 2910 + }, 2911 + "node_modules/aria-query": { 2912 + "version": "5.3.2", 2913 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", 2914 + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", 2915 + "dev": true, 2916 + "license": "Apache-2.0", 2917 + "engines": { 2918 + "node": ">= 0.4" 2919 + } 2920 + }, 2921 + "node_modules/array-buffer-byte-length": { 2922 + "version": "1.0.2", 2923 + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 2924 + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 2925 + "dev": true, 2926 + "license": "MIT", 2927 + "dependencies": { 2928 + "call-bound": "^1.0.3", 2929 + "is-array-buffer": "^3.0.5" 2930 + }, 2931 + "engines": { 2932 + "node": ">= 0.4" 2933 + }, 2934 + "funding": { 2935 + "url": "https://github.com/sponsors/ljharb" 2936 + } 2937 + }, 2938 + "node_modules/array-flatten": { 2939 + "version": "1.1.1", 2940 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 2941 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 2942 + "license": "MIT" 2943 + }, 2944 + "node_modules/array-includes": { 2945 + "version": "3.1.9", 2946 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", 2947 + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", 2948 + "dev": true, 2949 + "license": "MIT", 2950 + "dependencies": { 2951 + "call-bind": "^1.0.8", 2952 + "call-bound": "^1.0.4", 2953 + "define-properties": "^1.2.1", 2954 + "es-abstract": "^1.24.0", 2955 + "es-object-atoms": "^1.1.1", 2956 + "get-intrinsic": "^1.3.0", 2957 + "is-string": "^1.1.1", 2958 + "math-intrinsics": "^1.1.0" 2959 + }, 2960 + "engines": { 2961 + "node": ">= 0.4" 2962 + }, 2963 + "funding": { 2964 + "url": "https://github.com/sponsors/ljharb" 2965 + } 2966 + }, 2967 + "node_modules/array.prototype.findlast": { 2968 + "version": "1.2.5", 2969 + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", 2970 + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", 2971 + "dev": true, 2972 + "license": "MIT", 2973 + "dependencies": { 2974 + "call-bind": "^1.0.7", 2975 + "define-properties": "^1.2.1", 2976 + "es-abstract": "^1.23.2", 2977 + "es-errors": "^1.3.0", 2978 + "es-object-atoms": "^1.0.0", 2979 + "es-shim-unscopables": "^1.0.2" 2980 + }, 2981 + "engines": { 2982 + "node": ">= 0.4" 2983 + }, 2984 + "funding": { 2985 + "url": "https://github.com/sponsors/ljharb" 2986 + } 2987 + }, 2988 + "node_modules/array.prototype.findlastindex": { 2989 + "version": "1.2.6", 2990 + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", 2991 + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", 2992 + "dev": true, 2993 + "license": "MIT", 2994 + "dependencies": { 2995 + "call-bind": "^1.0.8", 2996 + "call-bound": "^1.0.4", 2997 + "define-properties": "^1.2.1", 2998 + "es-abstract": "^1.23.9", 2999 + "es-errors": "^1.3.0", 3000 + "es-object-atoms": "^1.1.1", 3001 + "es-shim-unscopables": "^1.1.0" 3002 + }, 3003 + "engines": { 3004 + "node": ">= 0.4" 3005 + }, 3006 + "funding": { 3007 + "url": "https://github.com/sponsors/ljharb" 3008 + } 3009 + }, 3010 + "node_modules/array.prototype.flat": { 3011 + "version": "1.3.3", 3012 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", 3013 + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", 3014 + "dev": true, 3015 + "license": "MIT", 3016 + "dependencies": { 3017 + "call-bind": "^1.0.8", 3018 + "define-properties": "^1.2.1", 3019 + "es-abstract": "^1.23.5", 3020 + "es-shim-unscopables": "^1.0.2" 3021 + }, 3022 + "engines": { 3023 + "node": ">= 0.4" 3024 + }, 3025 + "funding": { 3026 + "url": "https://github.com/sponsors/ljharb" 3027 + } 3028 + }, 3029 + "node_modules/array.prototype.flatmap": { 3030 + "version": "1.3.3", 3031 + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", 3032 + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", 3033 + "dev": true, 3034 + "license": "MIT", 3035 + "dependencies": { 3036 + "call-bind": "^1.0.8", 3037 + "define-properties": "^1.2.1", 3038 + "es-abstract": "^1.23.5", 3039 + "es-shim-unscopables": "^1.0.2" 3040 + }, 3041 + "engines": { 3042 + "node": ">= 0.4" 3043 + }, 3044 + "funding": { 3045 + "url": "https://github.com/sponsors/ljharb" 3046 + } 3047 + }, 3048 + "node_modules/array.prototype.tosorted": { 3049 + "version": "1.1.4", 3050 + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", 3051 + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", 3052 + "dev": true, 3053 + "license": "MIT", 3054 + "dependencies": { 3055 + "call-bind": "^1.0.7", 3056 + "define-properties": "^1.2.1", 3057 + "es-abstract": "^1.23.3", 3058 + "es-errors": "^1.3.0", 3059 + "es-shim-unscopables": "^1.0.2" 3060 + }, 3061 + "engines": { 3062 + "node": ">= 0.4" 3063 + } 3064 + }, 3065 + "node_modules/arraybuffer.prototype.slice": { 3066 + "version": "1.0.4", 3067 + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 3068 + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 3069 + "dev": true, 3070 + "license": "MIT", 3071 + "dependencies": { 3072 + "array-buffer-byte-length": "^1.0.1", 3073 + "call-bind": "^1.0.8", 3074 + "define-properties": "^1.2.1", 3075 + "es-abstract": "^1.23.5", 3076 + "es-errors": "^1.3.0", 3077 + "get-intrinsic": "^1.2.6", 3078 + "is-array-buffer": "^3.0.4" 3079 + }, 3080 + "engines": { 3081 + "node": ">= 0.4" 3082 + }, 3083 + "funding": { 3084 + "url": "https://github.com/sponsors/ljharb" 3085 + } 3086 + }, 3087 + "node_modules/ast-types-flow": { 3088 + "version": "0.0.8", 3089 + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", 3090 + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", 3091 + "dev": true, 3092 + "license": "MIT" 3093 + }, 3094 + "node_modules/async-function": { 3095 + "version": "1.0.0", 3096 + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 3097 + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 3098 + "dev": true, 3099 + "license": "MIT", 3100 + "engines": { 3101 + "node": ">= 0.4" 3102 + } 3103 + }, 3104 + "node_modules/atomic-sleep": { 3105 + "version": "1.0.0", 3106 + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", 3107 + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", 3108 + "license": "MIT", 3109 + "engines": { 3110 + "node": ">=8.0.0" 3111 + } 3112 + }, 3113 + "node_modules/available-typed-arrays": { 3114 + "version": "1.0.7", 3115 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 3116 + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 3117 + "dev": true, 3118 + "license": "MIT", 3119 + "dependencies": { 3120 + "possible-typed-array-names": "^1.0.0" 3121 + }, 3122 + "engines": { 3123 + "node": ">= 0.4" 3124 + }, 3125 + "funding": { 3126 + "url": "https://github.com/sponsors/ljharb" 3127 + } 3128 + }, 3129 + "node_modules/await-lock": { 3130 + "version": "2.2.2", 3131 + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 3132 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 3133 + "license": "MIT" 3134 + }, 3135 + "node_modules/axe-core": { 3136 + "version": "4.11.0", 3137 + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", 3138 + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", 3139 + "dev": true, 3140 + "license": "MPL-2.0", 3141 + "engines": { 3142 + "node": ">=4" 3143 + } 3144 + }, 3145 + "node_modules/axobject-query": { 3146 + "version": "4.1.0", 3147 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 3148 + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 3149 + "dev": true, 3150 + "license": "Apache-2.0", 3151 + "engines": { 3152 + "node": ">= 0.4" 3153 + } 3154 + }, 3155 + "node_modules/balanced-match": { 3156 + "version": "1.0.2", 3157 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 3158 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 3159 + "dev": true, 3160 + "license": "MIT" 3161 + }, 3162 + "node_modules/base64-js": { 3163 + "version": "1.5.1", 3164 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 3165 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 3166 + "funding": [ 3167 + { 3168 + "type": "github", 3169 + "url": "https://github.com/sponsors/feross" 3170 + }, 3171 + { 3172 + "type": "patreon", 3173 + "url": "https://www.patreon.com/feross" 3174 + }, 3175 + { 3176 + "type": "consulting", 3177 + "url": "https://feross.org/support" 3178 + } 3179 + ], 3180 + "license": "MIT" 3181 + }, 3182 + "node_modules/baseline-browser-mapping": { 3183 + "version": "2.8.27", 3184 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.27.tgz", 3185 + "integrity": "sha512-2CXFpkjVnY2FT+B6GrSYxzYf65BJWEqz5tIRHCvNsZZ2F3CmsCB37h8SpYgKG7y9C4YAeTipIPWG7EmFmhAeXA==", 3186 + "dev": true, 3187 + "license": "Apache-2.0", 3188 + "bin": { 3189 + "baseline-browser-mapping": "dist/cli.js" 3190 + } 3191 + }, 3192 + "node_modules/body-parser": { 3193 + "version": "1.20.3", 3194 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 3195 + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 3196 + "license": "MIT", 3197 + "dependencies": { 3198 + "bytes": "3.1.2", 3199 + "content-type": "~1.0.5", 3200 + "debug": "2.6.9", 3201 + "depd": "2.0.0", 3202 + "destroy": "1.2.0", 3203 + "http-errors": "2.0.0", 3204 + "iconv-lite": "0.4.24", 3205 + "on-finished": "2.4.1", 3206 + "qs": "6.13.0", 3207 + "raw-body": "2.5.2", 3208 + "type-is": "~1.6.18", 3209 + "unpipe": "1.0.0" 3210 + }, 3211 + "engines": { 3212 + "node": ">= 0.8", 3213 + "npm": "1.2.8000 || >= 1.4.16" 3214 + } 3215 + }, 3216 + "node_modules/body-parser/node_modules/debug": { 3217 + "version": "2.6.9", 3218 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 3219 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 3220 + "license": "MIT", 3221 + "dependencies": { 3222 + "ms": "2.0.0" 3223 + } 3224 + }, 3225 + "node_modules/body-parser/node_modules/ms": { 3226 + "version": "2.0.0", 3227 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3228 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 3229 + "license": "MIT" 3230 + }, 3231 + "node_modules/brace-expansion": { 3232 + "version": "1.1.12", 3233 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 3234 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 3235 + "dev": true, 3236 + "license": "MIT", 3237 + "dependencies": { 3238 + "balanced-match": "^1.0.0", 3239 + "concat-map": "0.0.1" 3240 + } 3241 + }, 3242 + "node_modules/braces": { 3243 + "version": "3.0.3", 3244 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 3245 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 3246 + "dev": true, 3247 + "license": "MIT", 3248 + "dependencies": { 3249 + "fill-range": "^7.1.1" 3250 + }, 3251 + "engines": { 3252 + "node": ">=8" 3253 + } 3254 + }, 3255 + "node_modules/browserslist": { 3256 + "version": "4.28.0", 3257 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", 3258 + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", 3259 + "dev": true, 3260 + "funding": [ 3261 + { 3262 + "type": "opencollective", 3263 + "url": "https://opencollective.com/browserslist" 3264 + }, 3265 + { 3266 + "type": "tidelift", 3267 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3268 + }, 3269 + { 3270 + "type": "github", 3271 + "url": "https://github.com/sponsors/ai" 3272 + } 3273 + ], 3274 + "license": "MIT", 3275 + "dependencies": { 3276 + "baseline-browser-mapping": "^2.8.25", 3277 + "caniuse-lite": "^1.0.30001754", 3278 + "electron-to-chromium": "^1.5.249", 3279 + "node-releases": "^2.0.27", 3280 + "update-browserslist-db": "^1.1.4" 3281 + }, 3282 + "bin": { 3283 + "browserslist": "cli.js" 3284 + }, 3285 + "engines": { 3286 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 3287 + } 3288 + }, 3289 + "node_modules/buffer": { 3290 + "version": "6.0.3", 3291 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 3292 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 3293 + "funding": [ 3294 + { 3295 + "type": "github", 3296 + "url": "https://github.com/sponsors/feross" 3297 + }, 3298 + { 3299 + "type": "patreon", 3300 + "url": "https://www.patreon.com/feross" 3301 + }, 3302 + { 3303 + "type": "consulting", 3304 + "url": "https://feross.org/support" 3305 + } 3306 + ], 3307 + "license": "MIT", 3308 + "dependencies": { 3309 + "base64-js": "^1.3.1", 3310 + "ieee754": "^1.2.1" 3311 + } 3312 + }, 3313 + "node_modules/bytes": { 3314 + "version": "3.1.2", 3315 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 3316 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 3317 + "license": "MIT", 3318 + "engines": { 3319 + "node": ">= 0.8" 3320 + } 3321 + }, 3322 + "node_modules/call-bind": { 3323 + "version": "1.0.8", 3324 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 3325 + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 3326 + "dev": true, 3327 + "license": "MIT", 3328 + "dependencies": { 3329 + "call-bind-apply-helpers": "^1.0.0", 3330 + "es-define-property": "^1.0.0", 3331 + "get-intrinsic": "^1.2.4", 3332 + "set-function-length": "^1.2.2" 3333 + }, 3334 + "engines": { 3335 + "node": ">= 0.4" 3336 + }, 3337 + "funding": { 3338 + "url": "https://github.com/sponsors/ljharb" 3339 + } 3340 + }, 3341 + "node_modules/call-bind-apply-helpers": { 3342 + "version": "1.0.2", 3343 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 3344 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 3345 + "license": "MIT", 3346 + "dependencies": { 3347 + "es-errors": "^1.3.0", 3348 + "function-bind": "^1.1.2" 3349 + }, 3350 + "engines": { 3351 + "node": ">= 0.4" 3352 + } 3353 + }, 3354 + "node_modules/call-bound": { 3355 + "version": "1.0.4", 3356 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 3357 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 3358 + "license": "MIT", 3359 + "dependencies": { 3360 + "call-bind-apply-helpers": "^1.0.2", 3361 + "get-intrinsic": "^1.3.0" 3362 + }, 3363 + "engines": { 3364 + "node": ">= 0.4" 3365 + }, 3366 + "funding": { 3367 + "url": "https://github.com/sponsors/ljharb" 3368 + } 3369 + }, 3370 + "node_modules/callsites": { 3371 + "version": "3.1.0", 3372 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 3373 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 3374 + "dev": true, 3375 + "license": "MIT", 3376 + "engines": { 3377 + "node": ">=6" 3378 + } 3379 + }, 3380 + "node_modules/camelcase": { 3381 + "version": "5.3.1", 3382 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 3383 + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 3384 + "license": "MIT", 3385 + "engines": { 3386 + "node": ">=6" 3387 + } 3388 + }, 3389 + "node_modules/caniuse-lite": { 3390 + "version": "1.0.30001754", 3391 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", 3392 + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", 3393 + "funding": [ 3394 + { 3395 + "type": "opencollective", 3396 + "url": "https://opencollective.com/browserslist" 3397 + }, 3398 + { 3399 + "type": "tidelift", 3400 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 3401 + }, 3402 + { 3403 + "type": "github", 3404 + "url": "https://github.com/sponsors/ai" 3405 + } 3406 + ], 3407 + "license": "CC-BY-4.0" 3408 + }, 3409 + "node_modules/cbor-extract": { 3410 + "version": "2.2.0", 3411 + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", 3412 + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", 3413 + "hasInstallScript": true, 3414 + "license": "MIT", 3415 + "optional": true, 3416 + "dependencies": { 3417 + "node-gyp-build-optional-packages": "5.1.1" 3418 + }, 3419 + "bin": { 3420 + "download-cbor-prebuilds": "bin/download-prebuilds.js" 3421 + }, 3422 + "optionalDependencies": { 3423 + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", 3424 + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", 3425 + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", 3426 + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", 3427 + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", 3428 + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" 3429 + } 3430 + }, 3431 + "node_modules/cbor-x": { 3432 + "version": "1.6.0", 3433 + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz", 3434 + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", 3435 + "license": "MIT", 3436 + "optionalDependencies": { 3437 + "cbor-extract": "^2.2.0" 3438 + } 3439 + }, 3440 + "node_modules/cborg": { 3441 + "version": "1.10.2", 3442 + "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz", 3443 + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 3444 + "license": "Apache-2.0", 3445 + "bin": { 3446 + "cborg": "cli.js" 3447 + } 3448 + }, 3449 + "node_modules/chalk": { 3450 + "version": "4.1.2", 3451 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 3452 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 3453 + "dev": true, 3454 + "license": "MIT", 3455 + "dependencies": { 3456 + "ansi-styles": "^4.1.0", 3457 + "supports-color": "^7.1.0" 3458 + }, 3459 + "engines": { 3460 + "node": ">=10" 3461 + }, 3462 + "funding": { 3463 + "url": "https://github.com/chalk/chalk?sponsor=1" 3464 + } 3465 + }, 3466 + "node_modules/client-only": { 3467 + "version": "0.0.1", 3468 + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 3469 + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 3470 + "license": "MIT" 3471 + }, 3472 + "node_modules/cliui": { 3473 + "version": "6.0.0", 3474 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 3475 + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 3476 + "license": "ISC", 3477 + "dependencies": { 3478 + "string-width": "^4.2.0", 3479 + "strip-ansi": "^6.0.0", 3480 + "wrap-ansi": "^6.2.0" 3481 + } 3482 + }, 3483 + "node_modules/clsx": { 3484 + "version": "2.1.1", 3485 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 3486 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 3487 + "license": "MIT", 3488 + "engines": { 3489 + "node": ">=6" 3490 + } 3491 + }, 3492 + "node_modules/code-block-writer": { 3493 + "version": "13.0.3", 3494 + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", 3495 + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", 3496 + "dev": true, 3497 + "license": "MIT" 3498 + }, 3499 + "node_modules/color-convert": { 3500 + "version": "2.0.1", 3501 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3502 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3503 + "license": "MIT", 3504 + "dependencies": { 3505 + "color-name": "~1.1.4" 3506 + }, 3507 + "engines": { 3508 + "node": ">=7.0.0" 3509 + } 3510 + }, 3511 + "node_modules/color-name": { 3512 + "version": "1.1.4", 3513 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3514 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3515 + "license": "MIT" 3516 + }, 3517 + "node_modules/commander": { 3518 + "version": "9.5.0", 3519 + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 3520 + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 3521 + "dev": true, 3522 + "license": "MIT", 3523 + "engines": { 3524 + "node": "^12.20.0 || >=14" 3525 + } 3526 + }, 3527 + "node_modules/concat-map": { 3528 + "version": "0.0.1", 3529 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 3530 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 3531 + "dev": true, 3532 + "license": "MIT" 3533 + }, 3534 + "node_modules/content-disposition": { 3535 + "version": "0.5.4", 3536 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 3537 + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 3538 + "license": "MIT", 3539 + "dependencies": { 3540 + "safe-buffer": "5.2.1" 3541 + }, 3542 + "engines": { 3543 + "node": ">= 0.6" 3544 + } 3545 + }, 3546 + "node_modules/content-type": { 3547 + "version": "1.0.5", 3548 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 3549 + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 3550 + "license": "MIT", 3551 + "engines": { 3552 + "node": ">= 0.6" 3553 + } 3554 + }, 3555 + "node_modules/convert-source-map": { 3556 + "version": "2.0.0", 3557 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 3558 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 3559 + "dev": true, 3560 + "license": "MIT" 3561 + }, 3562 + "node_modules/cookie": { 3563 + "version": "0.7.1", 3564 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 3565 + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 3566 + "license": "MIT", 3567 + "engines": { 3568 + "node": ">= 0.6" 3569 + } 3570 + }, 3571 + "node_modules/cookie-signature": { 3572 + "version": "1.0.6", 3573 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 3574 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 3575 + "license": "MIT" 3576 + }, 3577 + "node_modules/core-js": { 3578 + "version": "3.46.0", 3579 + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", 3580 + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", 3581 + "hasInstallScript": true, 3582 + "license": "MIT", 3583 + "funding": { 3584 + "type": "opencollective", 3585 + "url": "https://opencollective.com/core-js" 3586 + } 3587 + }, 3588 + "node_modules/cors": { 3589 + "version": "2.8.5", 3590 + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 3591 + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 3592 + "license": "MIT", 3593 + "dependencies": { 3594 + "object-assign": "^4", 3595 + "vary": "^1" 3596 + }, 3597 + "engines": { 3598 + "node": ">= 0.10" 3599 + } 3600 + }, 3601 + "node_modules/cross-spawn": { 3602 + "version": "7.0.6", 3603 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 3604 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 3605 + "dev": true, 3606 + "license": "MIT", 3607 + "dependencies": { 3608 + "path-key": "^3.1.0", 3609 + "shebang-command": "^2.0.0", 3610 + "which": "^2.0.1" 3611 + }, 3612 + "engines": { 3613 + "node": ">= 8" 3614 + } 3615 + }, 3616 + "node_modules/csstype": { 3617 + "version": "3.1.3", 3618 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 3619 + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 3620 + "dev": true, 3621 + "license": "MIT" 3622 + }, 3623 + "node_modules/damerau-levenshtein": { 3624 + "version": "1.0.8", 3625 + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", 3626 + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", 3627 + "dev": true, 3628 + "license": "BSD-2-Clause" 3629 + }, 3630 + "node_modules/data-view-buffer": { 3631 + "version": "1.0.2", 3632 + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 3633 + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 3634 + "dev": true, 3635 + "license": "MIT", 3636 + "dependencies": { 3637 + "call-bound": "^1.0.3", 3638 + "es-errors": "^1.3.0", 3639 + "is-data-view": "^1.0.2" 3640 + }, 3641 + "engines": { 3642 + "node": ">= 0.4" 3643 + }, 3644 + "funding": { 3645 + "url": "https://github.com/sponsors/ljharb" 3646 + } 3647 + }, 3648 + "node_modules/data-view-byte-length": { 3649 + "version": "1.0.2", 3650 + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 3651 + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 3652 + "dev": true, 3653 + "license": "MIT", 3654 + "dependencies": { 3655 + "call-bound": "^1.0.3", 3656 + "es-errors": "^1.3.0", 3657 + "is-data-view": "^1.0.2" 3658 + }, 3659 + "engines": { 3660 + "node": ">= 0.4" 3661 + }, 3662 + "funding": { 3663 + "url": "https://github.com/sponsors/inspect-js" 3664 + } 3665 + }, 3666 + "node_modules/data-view-byte-offset": { 3667 + "version": "1.0.1", 3668 + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 3669 + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 3670 + "dev": true, 3671 + "license": "MIT", 3672 + "dependencies": { 3673 + "call-bound": "^1.0.2", 3674 + "es-errors": "^1.3.0", 3675 + "is-data-view": "^1.0.1" 3676 + }, 3677 + "engines": { 3678 + "node": ">= 0.4" 3679 + }, 3680 + "funding": { 3681 + "url": "https://github.com/sponsors/ljharb" 3682 + } 3683 + }, 3684 + "node_modules/debug": { 3685 + "version": "4.4.3", 3686 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 3687 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 3688 + "dev": true, 3689 + "license": "MIT", 3690 + "dependencies": { 3691 + "ms": "^2.1.3" 3692 + }, 3693 + "engines": { 3694 + "node": ">=6.0" 3695 + }, 3696 + "peerDependenciesMeta": { 3697 + "supports-color": { 3698 + "optional": true 3699 + } 3700 + } 3701 + }, 3702 + "node_modules/decamelize": { 3703 + "version": "1.2.0", 3704 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 3705 + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 3706 + "license": "MIT", 3707 + "engines": { 3708 + "node": ">=0.10.0" 3709 + } 3710 + }, 3711 + "node_modules/deep-is": { 3712 + "version": "0.1.4", 3713 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 3714 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 3715 + "dev": true, 3716 + "license": "MIT" 3717 + }, 3718 + "node_modules/define-data-property": { 3719 + "version": "1.1.4", 3720 + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 3721 + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 3722 + "dev": true, 3723 + "license": "MIT", 3724 + "dependencies": { 3725 + "es-define-property": "^1.0.0", 3726 + "es-errors": "^1.3.0", 3727 + "gopd": "^1.0.1" 3728 + }, 3729 + "engines": { 3730 + "node": ">= 0.4" 3731 + }, 3732 + "funding": { 3733 + "url": "https://github.com/sponsors/ljharb" 3734 + } 3735 + }, 3736 + "node_modules/define-properties": { 3737 + "version": "1.2.1", 3738 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 3739 + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 3740 + "dev": true, 3741 + "license": "MIT", 3742 + "dependencies": { 3743 + "define-data-property": "^1.0.1", 3744 + "has-property-descriptors": "^1.0.0", 3745 + "object-keys": "^1.1.1" 3746 + }, 3747 + "engines": { 3748 + "node": ">= 0.4" 3749 + }, 3750 + "funding": { 3751 + "url": "https://github.com/sponsors/ljharb" 3752 + } 3753 + }, 3754 + "node_modules/depd": { 3755 + "version": "2.0.0", 3756 + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 3757 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 3758 + "license": "MIT", 3759 + "engines": { 3760 + "node": ">= 0.8" 3761 + } 3762 + }, 3763 + "node_modules/destroy": { 3764 + "version": "1.2.0", 3765 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 3766 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 3767 + "license": "MIT", 3768 + "engines": { 3769 + "node": ">= 0.8", 3770 + "npm": "1.2.8000 || >= 1.4.16" 3771 + } 3772 + }, 3773 + "node_modules/detect-libc": { 3774 + "version": "2.1.2", 3775 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 3776 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 3777 + "devOptional": true, 3778 + "license": "Apache-2.0", 3779 + "engines": { 3780 + "node": ">=8" 3781 + } 3782 + }, 3783 + "node_modules/dijkstrajs": { 3784 + "version": "1.0.3", 3785 + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", 3786 + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", 3787 + "license": "MIT" 3788 + }, 3789 + "node_modules/doctrine": { 3790 + "version": "2.1.0", 3791 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 3792 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 3793 + "dev": true, 3794 + "license": "Apache-2.0", 3795 + "dependencies": { 3796 + "esutils": "^2.0.2" 3797 + }, 3798 + "engines": { 3799 + "node": ">=0.10.0" 3800 + } 3801 + }, 3802 + "node_modules/dotenv": { 3803 + "version": "17.2.3", 3804 + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", 3805 + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", 3806 + "license": "BSD-2-Clause", 3807 + "engines": { 3808 + "node": ">=12" 3809 + }, 3810 + "funding": { 3811 + "url": "https://dotenvx.com" 3812 + } 3813 + }, 3814 + "node_modules/dunder-proto": { 3815 + "version": "1.0.1", 3816 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 3817 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 3818 + "license": "MIT", 3819 + "dependencies": { 3820 + "call-bind-apply-helpers": "^1.0.1", 3821 + "es-errors": "^1.3.0", 3822 + "gopd": "^1.2.0" 3823 + }, 3824 + "engines": { 3825 + "node": ">= 0.4" 3826 + } 3827 + }, 3828 + "node_modules/ee-first": { 3829 + "version": "1.1.1", 3830 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 3831 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 3832 + "license": "MIT" 3833 + }, 3834 + "node_modules/electron-to-chromium": { 3835 + "version": "1.5.250", 3836 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", 3837 + "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", 3838 + "dev": true, 3839 + "license": "ISC" 3840 + }, 3841 + "node_modules/emoji-regex": { 3842 + "version": "9.2.2", 3843 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 3844 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 3845 + "dev": true, 3846 + "license": "MIT" 3847 + }, 3848 + "node_modules/encodeurl": { 3849 + "version": "2.0.0", 3850 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 3851 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 3852 + "license": "MIT", 3853 + "engines": { 3854 + "node": ">= 0.8" 3855 + } 3856 + }, 3857 + "node_modules/enhanced-resolve": { 3858 + "version": "5.18.3", 3859 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", 3860 + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", 3861 + "dev": true, 3862 + "license": "MIT", 3863 + "dependencies": { 3864 + "graceful-fs": "^4.2.4", 3865 + "tapable": "^2.2.0" 3866 + }, 3867 + "engines": { 3868 + "node": ">=10.13.0" 3869 + } 3870 + }, 3871 + "node_modules/es-abstract": { 3872 + "version": "1.24.0", 3873 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", 3874 + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", 3875 + "dev": true, 3876 + "license": "MIT", 3877 + "dependencies": { 3878 + "array-buffer-byte-length": "^1.0.2", 3879 + "arraybuffer.prototype.slice": "^1.0.4", 3880 + "available-typed-arrays": "^1.0.7", 3881 + "call-bind": "^1.0.8", 3882 + "call-bound": "^1.0.4", 3883 + "data-view-buffer": "^1.0.2", 3884 + "data-view-byte-length": "^1.0.2", 3885 + "data-view-byte-offset": "^1.0.1", 3886 + "es-define-property": "^1.0.1", 3887 + "es-errors": "^1.3.0", 3888 + "es-object-atoms": "^1.1.1", 3889 + "es-set-tostringtag": "^2.1.0", 3890 + "es-to-primitive": "^1.3.0", 3891 + "function.prototype.name": "^1.1.8", 3892 + "get-intrinsic": "^1.3.0", 3893 + "get-proto": "^1.0.1", 3894 + "get-symbol-description": "^1.1.0", 3895 + "globalthis": "^1.0.4", 3896 + "gopd": "^1.2.0", 3897 + "has-property-descriptors": "^1.0.2", 3898 + "has-proto": "^1.2.0", 3899 + "has-symbols": "^1.1.0", 3900 + "hasown": "^2.0.2", 3901 + "internal-slot": "^1.1.0", 3902 + "is-array-buffer": "^3.0.5", 3903 + "is-callable": "^1.2.7", 3904 + "is-data-view": "^1.0.2", 3905 + "is-negative-zero": "^2.0.3", 3906 + "is-regex": "^1.2.1", 3907 + "is-set": "^2.0.3", 3908 + "is-shared-array-buffer": "^1.0.4", 3909 + "is-string": "^1.1.1", 3910 + "is-typed-array": "^1.1.15", 3911 + "is-weakref": "^1.1.1", 3912 + "math-intrinsics": "^1.1.0", 3913 + "object-inspect": "^1.13.4", 3914 + "object-keys": "^1.1.1", 3915 + "object.assign": "^4.1.7", 3916 + "own-keys": "^1.0.1", 3917 + "regexp.prototype.flags": "^1.5.4", 3918 + "safe-array-concat": "^1.1.3", 3919 + "safe-push-apply": "^1.0.0", 3920 + "safe-regex-test": "^1.1.0", 3921 + "set-proto": "^1.0.0", 3922 + "stop-iteration-iterator": "^1.1.0", 3923 + "string.prototype.trim": "^1.2.10", 3924 + "string.prototype.trimend": "^1.0.9", 3925 + "string.prototype.trimstart": "^1.0.8", 3926 + "typed-array-buffer": "^1.0.3", 3927 + "typed-array-byte-length": "^1.0.3", 3928 + "typed-array-byte-offset": "^1.0.4", 3929 + "typed-array-length": "^1.0.7", 3930 + "unbox-primitive": "^1.1.0", 3931 + "which-typed-array": "^1.1.19" 3932 + }, 3933 + "engines": { 3934 + "node": ">= 0.4" 3935 + }, 3936 + "funding": { 3937 + "url": "https://github.com/sponsors/ljharb" 3938 + } 3939 + }, 3940 + "node_modules/es-define-property": { 3941 + "version": "1.0.1", 3942 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 3943 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 3944 + "license": "MIT", 3945 + "engines": { 3946 + "node": ">= 0.4" 3947 + } 3948 + }, 3949 + "node_modules/es-errors": { 3950 + "version": "1.3.0", 3951 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 3952 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 3953 + "license": "MIT", 3954 + "engines": { 3955 + "node": ">= 0.4" 3956 + } 3957 + }, 3958 + "node_modules/es-iterator-helpers": { 3959 + "version": "1.2.1", 3960 + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", 3961 + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", 3962 + "dev": true, 3963 + "license": "MIT", 3964 + "dependencies": { 3965 + "call-bind": "^1.0.8", 3966 + "call-bound": "^1.0.3", 3967 + "define-properties": "^1.2.1", 3968 + "es-abstract": "^1.23.6", 3969 + "es-errors": "^1.3.0", 3970 + "es-set-tostringtag": "^2.0.3", 3971 + "function-bind": "^1.1.2", 3972 + "get-intrinsic": "^1.2.6", 3973 + "globalthis": "^1.0.4", 3974 + "gopd": "^1.2.0", 3975 + "has-property-descriptors": "^1.0.2", 3976 + "has-proto": "^1.2.0", 3977 + "has-symbols": "^1.1.0", 3978 + "internal-slot": "^1.1.0", 3979 + "iterator.prototype": "^1.1.4", 3980 + "safe-array-concat": "^1.1.3" 3981 + }, 3982 + "engines": { 3983 + "node": ">= 0.4" 3984 + } 3985 + }, 3986 + "node_modules/es-object-atoms": { 3987 + "version": "1.1.1", 3988 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 3989 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 3990 + "license": "MIT", 3991 + "dependencies": { 3992 + "es-errors": "^1.3.0" 3993 + }, 3994 + "engines": { 3995 + "node": ">= 0.4" 3996 + } 3997 + }, 3998 + "node_modules/es-set-tostringtag": { 3999 + "version": "2.1.0", 4000 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 4001 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 4002 + "dev": true, 4003 + "license": "MIT", 4004 + "dependencies": { 4005 + "es-errors": "^1.3.0", 4006 + "get-intrinsic": "^1.2.6", 4007 + "has-tostringtag": "^1.0.2", 4008 + "hasown": "^2.0.2" 4009 + }, 4010 + "engines": { 4011 + "node": ">= 0.4" 4012 + } 4013 + }, 4014 + "node_modules/es-shim-unscopables": { 4015 + "version": "1.1.0", 4016 + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 4017 + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 4018 + "dev": true, 4019 + "license": "MIT", 4020 + "dependencies": { 4021 + "hasown": "^2.0.2" 4022 + }, 4023 + "engines": { 4024 + "node": ">= 0.4" 4025 + } 4026 + }, 4027 + "node_modules/es-to-primitive": { 4028 + "version": "1.3.0", 4029 + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 4030 + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 4031 + "dev": true, 4032 + "license": "MIT", 4033 + "dependencies": { 4034 + "is-callable": "^1.2.7", 4035 + "is-date-object": "^1.0.5", 4036 + "is-symbol": "^1.0.4" 4037 + }, 4038 + "engines": { 4039 + "node": ">= 0.4" 4040 + }, 4041 + "funding": { 4042 + "url": "https://github.com/sponsors/ljharb" 4043 + } 4044 + }, 4045 + "node_modules/escalade": { 4046 + "version": "3.2.0", 4047 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 4048 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 4049 + "dev": true, 4050 + "license": "MIT", 4051 + "engines": { 4052 + "node": ">=6" 4053 + } 4054 + }, 4055 + "node_modules/escape-html": { 4056 + "version": "1.0.3", 4057 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 4058 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 4059 + "license": "MIT" 4060 + }, 4061 + "node_modules/escape-string-regexp": { 4062 + "version": "4.0.0", 4063 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 4064 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 4065 + "dev": true, 4066 + "license": "MIT", 4067 + "engines": { 4068 + "node": ">=10" 4069 + }, 4070 + "funding": { 4071 + "url": "https://github.com/sponsors/sindresorhus" 4072 + } 4073 + }, 4074 + "node_modules/eslint": { 4075 + "version": "9.39.1", 4076 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", 4077 + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", 4078 + "dev": true, 4079 + "license": "MIT", 4080 + "dependencies": { 4081 + "@eslint-community/eslint-utils": "^4.8.0", 4082 + "@eslint-community/regexpp": "^4.12.1", 4083 + "@eslint/config-array": "^0.21.1", 4084 + "@eslint/config-helpers": "^0.4.2", 4085 + "@eslint/core": "^0.17.0", 4086 + "@eslint/eslintrc": "^3.3.1", 4087 + "@eslint/js": "9.39.1", 4088 + "@eslint/plugin-kit": "^0.4.1", 4089 + "@humanfs/node": "^0.16.6", 4090 + "@humanwhocodes/module-importer": "^1.0.1", 4091 + "@humanwhocodes/retry": "^0.4.2", 4092 + "@types/estree": "^1.0.6", 4093 + "ajv": "^6.12.4", 4094 + "chalk": "^4.0.0", 4095 + "cross-spawn": "^7.0.6", 4096 + "debug": "^4.3.2", 4097 + "escape-string-regexp": "^4.0.0", 4098 + "eslint-scope": "^8.4.0", 4099 + "eslint-visitor-keys": "^4.2.1", 4100 + "espree": "^10.4.0", 4101 + "esquery": "^1.5.0", 4102 + "esutils": "^2.0.2", 4103 + "fast-deep-equal": "^3.1.3", 4104 + "file-entry-cache": "^8.0.0", 4105 + "find-up": "^5.0.0", 4106 + "glob-parent": "^6.0.2", 4107 + "ignore": "^5.2.0", 4108 + "imurmurhash": "^0.1.4", 4109 + "is-glob": "^4.0.0", 4110 + "json-stable-stringify-without-jsonify": "^1.0.1", 4111 + "lodash.merge": "^4.6.2", 4112 + "minimatch": "^3.1.2", 4113 + "natural-compare": "^1.4.0", 4114 + "optionator": "^0.9.3" 4115 + }, 4116 + "bin": { 4117 + "eslint": "bin/eslint.js" 4118 + }, 4119 + "engines": { 4120 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4121 + }, 4122 + "funding": { 4123 + "url": "https://eslint.org/donate" 4124 + }, 4125 + "peerDependencies": { 4126 + "jiti": "*" 4127 + }, 4128 + "peerDependenciesMeta": { 4129 + "jiti": { 4130 + "optional": true 4131 + } 4132 + } 4133 + }, 4134 + "node_modules/eslint-config-next": { 4135 + "version": "16.0.3", 4136 + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.3.tgz", 4137 + "integrity": "sha512-5F6qDjcZldf0Y0ZbqvWvap9xzYUxyDf7/of37aeyhvkrQokj/4bT1JYWZdlWUr283aeVa+s52mPq9ogmGg+5dw==", 4138 + "dev": true, 4139 + "license": "MIT", 4140 + "dependencies": { 4141 + "@next/eslint-plugin-next": "16.0.3", 4142 + "eslint-import-resolver-node": "^0.3.6", 4143 + "eslint-import-resolver-typescript": "^3.5.2", 4144 + "eslint-plugin-import": "^2.32.0", 4145 + "eslint-plugin-jsx-a11y": "^6.10.0", 4146 + "eslint-plugin-react": "^7.37.0", 4147 + "eslint-plugin-react-hooks": "^7.0.0", 4148 + "globals": "16.4.0", 4149 + "typescript-eslint": "^8.46.0" 4150 + }, 4151 + "peerDependencies": { 4152 + "eslint": ">=9.0.0", 4153 + "typescript": ">=3.3.1" 4154 + }, 4155 + "peerDependenciesMeta": { 4156 + "typescript": { 4157 + "optional": true 4158 + } 4159 + } 4160 + }, 4161 + "node_modules/eslint-config-next/node_modules/globals": { 4162 + "version": "16.4.0", 4163 + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", 4164 + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", 4165 + "dev": true, 4166 + "license": "MIT", 4167 + "engines": { 4168 + "node": ">=18" 4169 + }, 4170 + "funding": { 4171 + "url": "https://github.com/sponsors/sindresorhus" 4172 + } 4173 + }, 4174 + "node_modules/eslint-import-resolver-node": { 4175 + "version": "0.3.9", 4176 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", 4177 + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", 4178 + "dev": true, 4179 + "license": "MIT", 4180 + "dependencies": { 4181 + "debug": "^3.2.7", 4182 + "is-core-module": "^2.13.0", 4183 + "resolve": "^1.22.4" 4184 + } 4185 + }, 4186 + "node_modules/eslint-import-resolver-node/node_modules/debug": { 4187 + "version": "3.2.7", 4188 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 4189 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 4190 + "dev": true, 4191 + "license": "MIT", 4192 + "dependencies": { 4193 + "ms": "^2.1.1" 4194 + } 4195 + }, 4196 + "node_modules/eslint-import-resolver-typescript": { 4197 + "version": "3.10.1", 4198 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", 4199 + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", 4200 + "dev": true, 4201 + "license": "ISC", 4202 + "dependencies": { 4203 + "@nolyfill/is-core-module": "1.0.39", 4204 + "debug": "^4.4.0", 4205 + "get-tsconfig": "^4.10.0", 4206 + "is-bun-module": "^2.0.0", 4207 + "stable-hash": "^0.0.5", 4208 + "tinyglobby": "^0.2.13", 4209 + "unrs-resolver": "^1.6.2" 4210 + }, 4211 + "engines": { 4212 + "node": "^14.18.0 || >=16.0.0" 4213 + }, 4214 + "funding": { 4215 + "url": "https://opencollective.com/eslint-import-resolver-typescript" 4216 + }, 4217 + "peerDependencies": { 4218 + "eslint": "*", 4219 + "eslint-plugin-import": "*", 4220 + "eslint-plugin-import-x": "*" 4221 + }, 4222 + "peerDependenciesMeta": { 4223 + "eslint-plugin-import": { 4224 + "optional": true 4225 + }, 4226 + "eslint-plugin-import-x": { 4227 + "optional": true 4228 + } 4229 + } 4230 + }, 4231 + "node_modules/eslint-module-utils": { 4232 + "version": "2.12.1", 4233 + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", 4234 + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", 4235 + "dev": true, 4236 + "license": "MIT", 4237 + "dependencies": { 4238 + "debug": "^3.2.7" 4239 + }, 4240 + "engines": { 4241 + "node": ">=4" 4242 + }, 4243 + "peerDependenciesMeta": { 4244 + "eslint": { 4245 + "optional": true 4246 + } 4247 + } 4248 + }, 4249 + "node_modules/eslint-module-utils/node_modules/debug": { 4250 + "version": "3.2.7", 4251 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 4252 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 4253 + "dev": true, 4254 + "license": "MIT", 4255 + "dependencies": { 4256 + "ms": "^2.1.1" 4257 + } 4258 + }, 4259 + "node_modules/eslint-plugin-import": { 4260 + "version": "2.32.0", 4261 + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", 4262 + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", 4263 + "dev": true, 4264 + "license": "MIT", 4265 + "dependencies": { 4266 + "@rtsao/scc": "^1.1.0", 4267 + "array-includes": "^3.1.9", 4268 + "array.prototype.findlastindex": "^1.2.6", 4269 + "array.prototype.flat": "^1.3.3", 4270 + "array.prototype.flatmap": "^1.3.3", 4271 + "debug": "^3.2.7", 4272 + "doctrine": "^2.1.0", 4273 + "eslint-import-resolver-node": "^0.3.9", 4274 + "eslint-module-utils": "^2.12.1", 4275 + "hasown": "^2.0.2", 4276 + "is-core-module": "^2.16.1", 4277 + "is-glob": "^4.0.3", 4278 + "minimatch": "^3.1.2", 4279 + "object.fromentries": "^2.0.8", 4280 + "object.groupby": "^1.0.3", 4281 + "object.values": "^1.2.1", 4282 + "semver": "^6.3.1", 4283 + "string.prototype.trimend": "^1.0.9", 4284 + "tsconfig-paths": "^3.15.0" 4285 + }, 4286 + "engines": { 4287 + "node": ">=4" 4288 + }, 4289 + "peerDependencies": { 4290 + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" 4291 + } 4292 + }, 4293 + "node_modules/eslint-plugin-import/node_modules/debug": { 4294 + "version": "3.2.7", 4295 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 4296 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 4297 + "dev": true, 4298 + "license": "MIT", 4299 + "dependencies": { 4300 + "ms": "^2.1.1" 4301 + } 4302 + }, 4303 + "node_modules/eslint-plugin-jsx-a11y": { 4304 + "version": "6.10.2", 4305 + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", 4306 + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", 4307 + "dev": true, 4308 + "license": "MIT", 4309 + "dependencies": { 4310 + "aria-query": "^5.3.2", 4311 + "array-includes": "^3.1.8", 4312 + "array.prototype.flatmap": "^1.3.2", 4313 + "ast-types-flow": "^0.0.8", 4314 + "axe-core": "^4.10.0", 4315 + "axobject-query": "^4.1.0", 4316 + "damerau-levenshtein": "^1.0.8", 4317 + "emoji-regex": "^9.2.2", 4318 + "hasown": "^2.0.2", 4319 + "jsx-ast-utils": "^3.3.5", 4320 + "language-tags": "^1.0.9", 4321 + "minimatch": "^3.1.2", 4322 + "object.fromentries": "^2.0.8", 4323 + "safe-regex-test": "^1.0.3", 4324 + "string.prototype.includes": "^2.0.1" 4325 + }, 4326 + "engines": { 4327 + "node": ">=4.0" 4328 + }, 4329 + "peerDependencies": { 4330 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" 4331 + } 4332 + }, 4333 + "node_modules/eslint-plugin-react": { 4334 + "version": "7.37.5", 4335 + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", 4336 + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", 4337 + "dev": true, 4338 + "license": "MIT", 4339 + "dependencies": { 4340 + "array-includes": "^3.1.8", 4341 + "array.prototype.findlast": "^1.2.5", 4342 + "array.prototype.flatmap": "^1.3.3", 4343 + "array.prototype.tosorted": "^1.1.4", 4344 + "doctrine": "^2.1.0", 4345 + "es-iterator-helpers": "^1.2.1", 4346 + "estraverse": "^5.3.0", 4347 + "hasown": "^2.0.2", 4348 + "jsx-ast-utils": "^2.4.1 || ^3.0.0", 4349 + "minimatch": "^3.1.2", 4350 + "object.entries": "^1.1.9", 4351 + "object.fromentries": "^2.0.8", 4352 + "object.values": "^1.2.1", 4353 + "prop-types": "^15.8.1", 4354 + "resolve": "^2.0.0-next.5", 4355 + "semver": "^6.3.1", 4356 + "string.prototype.matchall": "^4.0.12", 4357 + "string.prototype.repeat": "^1.0.0" 4358 + }, 4359 + "engines": { 4360 + "node": ">=4" 4361 + }, 4362 + "peerDependencies": { 4363 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" 4364 + } 4365 + }, 4366 + "node_modules/eslint-plugin-react-hooks": { 4367 + "version": "7.0.1", 4368 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", 4369 + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", 4370 + "dev": true, 4371 + "license": "MIT", 4372 + "dependencies": { 4373 + "@babel/core": "^7.24.4", 4374 + "@babel/parser": "^7.24.4", 4375 + "hermes-parser": "^0.25.1", 4376 + "zod": "^3.25.0 || ^4.0.0", 4377 + "zod-validation-error": "^3.5.0 || ^4.0.0" 4378 + }, 4379 + "engines": { 4380 + "node": ">=18" 4381 + }, 4382 + "peerDependencies": { 4383 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 4384 + } 4385 + }, 4386 + "node_modules/eslint-plugin-react/node_modules/resolve": { 4387 + "version": "2.0.0-next.5", 4388 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", 4389 + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", 4390 + "dev": true, 4391 + "license": "MIT", 4392 + "dependencies": { 4393 + "is-core-module": "^2.13.0", 4394 + "path-parse": "^1.0.7", 4395 + "supports-preserve-symlinks-flag": "^1.0.0" 4396 + }, 4397 + "bin": { 4398 + "resolve": "bin/resolve" 4399 + }, 4400 + "funding": { 4401 + "url": "https://github.com/sponsors/ljharb" 4402 + } 4403 + }, 4404 + "node_modules/eslint-scope": { 4405 + "version": "8.4.0", 4406 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 4407 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 4408 + "dev": true, 4409 + "license": "BSD-2-Clause", 4410 + "dependencies": { 4411 + "esrecurse": "^4.3.0", 4412 + "estraverse": "^5.2.0" 4413 + }, 4414 + "engines": { 4415 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4416 + }, 4417 + "funding": { 4418 + "url": "https://opencollective.com/eslint" 4419 + } 4420 + }, 4421 + "node_modules/eslint-visitor-keys": { 4422 + "version": "4.2.1", 4423 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 4424 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 4425 + "dev": true, 4426 + "license": "Apache-2.0", 4427 + "engines": { 4428 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4429 + }, 4430 + "funding": { 4431 + "url": "https://opencollective.com/eslint" 4432 + } 4433 + }, 4434 + "node_modules/espree": { 4435 + "version": "10.4.0", 4436 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 4437 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 4438 + "dev": true, 4439 + "license": "BSD-2-Clause", 4440 + "dependencies": { 4441 + "acorn": "^8.15.0", 4442 + "acorn-jsx": "^5.3.2", 4443 + "eslint-visitor-keys": "^4.2.1" 4444 + }, 4445 + "engines": { 4446 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4447 + }, 4448 + "funding": { 4449 + "url": "https://opencollective.com/eslint" 4450 + } 4451 + }, 4452 + "node_modules/esquery": { 4453 + "version": "1.6.0", 4454 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 4455 + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 4456 + "dev": true, 4457 + "license": "BSD-3-Clause", 4458 + "dependencies": { 4459 + "estraverse": "^5.1.0" 4460 + }, 4461 + "engines": { 4462 + "node": ">=0.10" 4463 + } 4464 + }, 4465 + "node_modules/esrecurse": { 4466 + "version": "4.3.0", 4467 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 4468 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 4469 + "dev": true, 4470 + "license": "BSD-2-Clause", 4471 + "dependencies": { 4472 + "estraverse": "^5.2.0" 4473 + }, 4474 + "engines": { 4475 + "node": ">=4.0" 4476 + } 4477 + }, 4478 + "node_modules/estraverse": { 4479 + "version": "5.3.0", 4480 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 4481 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 4482 + "dev": true, 4483 + "license": "BSD-2-Clause", 4484 + "engines": { 4485 + "node": ">=4.0" 4486 + } 4487 + }, 4488 + "node_modules/esutils": { 4489 + "version": "2.0.3", 4490 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 4491 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 4492 + "dev": true, 4493 + "license": "BSD-2-Clause", 4494 + "engines": { 4495 + "node": ">=0.10.0" 4496 + } 4497 + }, 4498 + "node_modules/etag": { 4499 + "version": "1.8.1", 4500 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 4501 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 4502 + "license": "MIT", 4503 + "engines": { 4504 + "node": ">= 0.6" 4505 + } 4506 + }, 4507 + "node_modules/event-target-shim": { 4508 + "version": "5.0.1", 4509 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 4510 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 4511 + "license": "MIT", 4512 + "engines": { 4513 + "node": ">=6" 4514 + } 4515 + }, 4516 + "node_modules/events": { 4517 + "version": "3.3.0", 4518 + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 4519 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 4520 + "license": "MIT", 4521 + "engines": { 4522 + "node": ">=0.8.x" 4523 + } 4524 + }, 4525 + "node_modules/express": { 4526 + "version": "4.21.2", 4527 + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", 4528 + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", 4529 + "license": "MIT", 4530 + "dependencies": { 4531 + "accepts": "~1.3.8", 4532 + "array-flatten": "1.1.1", 4533 + "body-parser": "1.20.3", 4534 + "content-disposition": "0.5.4", 4535 + "content-type": "~1.0.4", 4536 + "cookie": "0.7.1", 4537 + "cookie-signature": "1.0.6", 4538 + "debug": "2.6.9", 4539 + "depd": "2.0.0", 4540 + "encodeurl": "~2.0.0", 4541 + "escape-html": "~1.0.3", 4542 + "etag": "~1.8.1", 4543 + "finalhandler": "1.3.1", 4544 + "fresh": "0.5.2", 4545 + "http-errors": "2.0.0", 4546 + "merge-descriptors": "1.0.3", 4547 + "methods": "~1.1.2", 4548 + "on-finished": "2.4.1", 4549 + "parseurl": "~1.3.3", 4550 + "path-to-regexp": "0.1.12", 4551 + "proxy-addr": "~2.0.7", 4552 + "qs": "6.13.0", 4553 + "range-parser": "~1.2.1", 4554 + "safe-buffer": "5.2.1", 4555 + "send": "0.19.0", 4556 + "serve-static": "1.16.2", 4557 + "setprototypeof": "1.2.0", 4558 + "statuses": "2.0.1", 4559 + "type-is": "~1.6.18", 4560 + "utils-merge": "1.0.1", 4561 + "vary": "~1.1.2" 4562 + }, 4563 + "engines": { 4564 + "node": ">= 0.10.0" 4565 + }, 4566 + "funding": { 4567 + "type": "opencollective", 4568 + "url": "https://opencollective.com/express" 4569 + } 4570 + }, 4571 + "node_modules/express/node_modules/debug": { 4572 + "version": "2.6.9", 4573 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4574 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4575 + "license": "MIT", 4576 + "dependencies": { 4577 + "ms": "2.0.0" 4578 + } 4579 + }, 4580 + "node_modules/express/node_modules/ms": { 4581 + "version": "2.0.0", 4582 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 4583 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 4584 + "license": "MIT" 4585 + }, 4586 + "node_modules/fast-deep-equal": { 4587 + "version": "3.1.3", 4588 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 4589 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 4590 + "dev": true, 4591 + "license": "MIT" 4592 + }, 4593 + "node_modules/fast-glob": { 4594 + "version": "3.3.1", 4595 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", 4596 + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", 4597 + "dev": true, 4598 + "license": "MIT", 4599 + "dependencies": { 4600 + "@nodelib/fs.stat": "^2.0.2", 4601 + "@nodelib/fs.walk": "^1.2.3", 4602 + "glob-parent": "^5.1.2", 4603 + "merge2": "^1.3.0", 4604 + "micromatch": "^4.0.4" 4605 + }, 4606 + "engines": { 4607 + "node": ">=8.6.0" 4608 + } 4609 + }, 4610 + "node_modules/fast-glob/node_modules/glob-parent": { 4611 + "version": "5.1.2", 4612 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 4613 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 4614 + "dev": true, 4615 + "license": "ISC", 4616 + "dependencies": { 4617 + "is-glob": "^4.0.1" 4618 + }, 4619 + "engines": { 4620 + "node": ">= 6" 4621 + } 4622 + }, 4623 + "node_modules/fast-json-stable-stringify": { 4624 + "version": "2.1.0", 4625 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 4626 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 4627 + "dev": true, 4628 + "license": "MIT" 4629 + }, 4630 + "node_modules/fast-levenshtein": { 4631 + "version": "2.0.6", 4632 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 4633 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 4634 + "dev": true, 4635 + "license": "MIT" 4636 + }, 4637 + "node_modules/fast-redact": { 4638 + "version": "3.5.0", 4639 + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", 4640 + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", 4641 + "license": "MIT", 4642 + "engines": { 4643 + "node": ">=6" 4644 + } 4645 + }, 4646 + "node_modules/fastq": { 4647 + "version": "1.19.1", 4648 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 4649 + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 4650 + "dev": true, 4651 + "license": "ISC", 4652 + "dependencies": { 4653 + "reusify": "^1.0.4" 4654 + } 4655 + }, 4656 + "node_modules/file-entry-cache": { 4657 + "version": "8.0.0", 4658 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 4659 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 4660 + "dev": true, 4661 + "license": "MIT", 4662 + "dependencies": { 4663 + "flat-cache": "^4.0.0" 4664 + }, 4665 + "engines": { 4666 + "node": ">=16.0.0" 4667 + } 4668 + }, 4669 + "node_modules/fill-range": { 4670 + "version": "7.1.1", 4671 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 4672 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 4673 + "dev": true, 4674 + "license": "MIT", 4675 + "dependencies": { 4676 + "to-regex-range": "^5.0.1" 4677 + }, 4678 + "engines": { 4679 + "node": ">=8" 4680 + } 4681 + }, 4682 + "node_modules/finalhandler": { 4683 + "version": "1.3.1", 4684 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 4685 + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 4686 + "license": "MIT", 4687 + "dependencies": { 4688 + "debug": "2.6.9", 4689 + "encodeurl": "~2.0.0", 4690 + "escape-html": "~1.0.3", 4691 + "on-finished": "2.4.1", 4692 + "parseurl": "~1.3.3", 4693 + "statuses": "2.0.1", 4694 + "unpipe": "~1.0.0" 4695 + }, 4696 + "engines": { 4697 + "node": ">= 0.8" 4698 + } 4699 + }, 4700 + "node_modules/finalhandler/node_modules/debug": { 4701 + "version": "2.6.9", 4702 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4703 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4704 + "license": "MIT", 4705 + "dependencies": { 4706 + "ms": "2.0.0" 4707 + } 4708 + }, 4709 + "node_modules/finalhandler/node_modules/ms": { 4710 + "version": "2.0.0", 4711 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 4712 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 4713 + "license": "MIT" 4714 + }, 4715 + "node_modules/find-up": { 4716 + "version": "5.0.0", 4717 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 4718 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 4719 + "dev": true, 4720 + "license": "MIT", 4721 + "dependencies": { 4722 + "locate-path": "^6.0.0", 4723 + "path-exists": "^4.0.0" 4724 + }, 4725 + "engines": { 4726 + "node": ">=10" 4727 + }, 4728 + "funding": { 4729 + "url": "https://github.com/sponsors/sindresorhus" 4730 + } 4731 + }, 4732 + "node_modules/flat-cache": { 4733 + "version": "4.0.1", 4734 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 4735 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 4736 + "dev": true, 4737 + "license": "MIT", 4738 + "dependencies": { 4739 + "flatted": "^3.2.9", 4740 + "keyv": "^4.5.4" 4741 + }, 4742 + "engines": { 4743 + "node": ">=16" 4744 + } 4745 + }, 4746 + "node_modules/flatted": { 4747 + "version": "3.3.3", 4748 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 4749 + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 4750 + "dev": true, 4751 + "license": "ISC" 4752 + }, 4753 + "node_modules/for-each": { 4754 + "version": "0.3.5", 4755 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 4756 + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 4757 + "dev": true, 4758 + "license": "MIT", 4759 + "dependencies": { 4760 + "is-callable": "^1.2.7" 4761 + }, 4762 + "engines": { 4763 + "node": ">= 0.4" 4764 + }, 4765 + "funding": { 4766 + "url": "https://github.com/sponsors/ljharb" 4767 + } 4768 + }, 4769 + "node_modules/forwarded": { 4770 + "version": "0.2.0", 4771 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 4772 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 4773 + "license": "MIT", 4774 + "engines": { 4775 + "node": ">= 0.6" 4776 + } 4777 + }, 4778 + "node_modules/fresh": { 4779 + "version": "0.5.2", 4780 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 4781 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 4782 + "license": "MIT", 4783 + "engines": { 4784 + "node": ">= 0.6" 4785 + } 4786 + }, 4787 + "node_modules/function-bind": { 4788 + "version": "1.1.2", 4789 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 4790 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 4791 + "license": "MIT", 4792 + "funding": { 4793 + "url": "https://github.com/sponsors/ljharb" 4794 + } 4795 + }, 4796 + "node_modules/function.prototype.name": { 4797 + "version": "1.1.8", 4798 + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 4799 + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 4800 + "dev": true, 4801 + "license": "MIT", 4802 + "dependencies": { 4803 + "call-bind": "^1.0.8", 4804 + "call-bound": "^1.0.3", 4805 + "define-properties": "^1.2.1", 4806 + "functions-have-names": "^1.2.3", 4807 + "hasown": "^2.0.2", 4808 + "is-callable": "^1.2.7" 4809 + }, 4810 + "engines": { 4811 + "node": ">= 0.4" 4812 + }, 4813 + "funding": { 4814 + "url": "https://github.com/sponsors/ljharb" 4815 + } 4816 + }, 4817 + "node_modules/functions-have-names": { 4818 + "version": "1.2.3", 4819 + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 4820 + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 4821 + "dev": true, 4822 + "license": "MIT", 4823 + "funding": { 4824 + "url": "https://github.com/sponsors/ljharb" 4825 + } 4826 + }, 4827 + "node_modules/generator-function": { 4828 + "version": "2.0.1", 4829 + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", 4830 + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", 4831 + "dev": true, 4832 + "license": "MIT", 4833 + "engines": { 4834 + "node": ">= 0.4" 4835 + } 4836 + }, 4837 + "node_modules/gensync": { 4838 + "version": "1.0.0-beta.2", 4839 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 4840 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 4841 + "dev": true, 4842 + "license": "MIT", 4843 + "engines": { 4844 + "node": ">=6.9.0" 4845 + } 4846 + }, 4847 + "node_modules/get-caller-file": { 4848 + "version": "2.0.5", 4849 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 4850 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 4851 + "license": "ISC", 4852 + "engines": { 4853 + "node": "6.* || 8.* || >= 10.*" 4854 + } 4855 + }, 4856 + "node_modules/get-intrinsic": { 4857 + "version": "1.3.0", 4858 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 4859 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 4860 + "license": "MIT", 4861 + "dependencies": { 4862 + "call-bind-apply-helpers": "^1.0.2", 4863 + "es-define-property": "^1.0.1", 4864 + "es-errors": "^1.3.0", 4865 + "es-object-atoms": "^1.1.1", 4866 + "function-bind": "^1.1.2", 4867 + "get-proto": "^1.0.1", 4868 + "gopd": "^1.2.0", 4869 + "has-symbols": "^1.1.0", 4870 + "hasown": "^2.0.2", 4871 + "math-intrinsics": "^1.1.0" 4872 + }, 4873 + "engines": { 4874 + "node": ">= 0.4" 4875 + }, 4876 + "funding": { 4877 + "url": "https://github.com/sponsors/ljharb" 4878 + } 4879 + }, 4880 + "node_modules/get-proto": { 4881 + "version": "1.0.1", 4882 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 4883 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 4884 + "license": "MIT", 4885 + "dependencies": { 4886 + "dunder-proto": "^1.0.1", 4887 + "es-object-atoms": "^1.0.0" 4888 + }, 4889 + "engines": { 4890 + "node": ">= 0.4" 4891 + } 4892 + }, 4893 + "node_modules/get-symbol-description": { 4894 + "version": "1.1.0", 4895 + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 4896 + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 4897 + "dev": true, 4898 + "license": "MIT", 4899 + "dependencies": { 4900 + "call-bound": "^1.0.3", 4901 + "es-errors": "^1.3.0", 4902 + "get-intrinsic": "^1.2.6" 4903 + }, 4904 + "engines": { 4905 + "node": ">= 0.4" 4906 + }, 4907 + "funding": { 4908 + "url": "https://github.com/sponsors/ljharb" 4909 + } 4910 + }, 4911 + "node_modules/get-tsconfig": { 4912 + "version": "4.13.0", 4913 + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", 4914 + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", 4915 + "dev": true, 4916 + "license": "MIT", 4917 + "dependencies": { 4918 + "resolve-pkg-maps": "^1.0.0" 4919 + }, 4920 + "funding": { 4921 + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 4922 + } 4923 + }, 4924 + "node_modules/glob-parent": { 4925 + "version": "6.0.2", 4926 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 4927 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 4928 + "dev": true, 4929 + "license": "ISC", 4930 + "dependencies": { 4931 + "is-glob": "^4.0.3" 4932 + }, 4933 + "engines": { 4934 + "node": ">=10.13.0" 4935 + } 4936 + }, 4937 + "node_modules/globals": { 4938 + "version": "14.0.0", 4939 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 4940 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 4941 + "dev": true, 4942 + "license": "MIT", 4943 + "engines": { 4944 + "node": ">=18" 4945 + }, 4946 + "funding": { 4947 + "url": "https://github.com/sponsors/sindresorhus" 4948 + } 4949 + }, 4950 + "node_modules/globalthis": { 4951 + "version": "1.0.4", 4952 + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 4953 + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 4954 + "dev": true, 4955 + "license": "MIT", 4956 + "dependencies": { 4957 + "define-properties": "^1.2.1", 4958 + "gopd": "^1.0.1" 4959 + }, 4960 + "engines": { 4961 + "node": ">= 0.4" 4962 + }, 4963 + "funding": { 4964 + "url": "https://github.com/sponsors/ljharb" 4965 + } 4966 + }, 4967 + "node_modules/gopd": { 4968 + "version": "1.2.0", 4969 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 4970 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 4971 + "license": "MIT", 4972 + "engines": { 4973 + "node": ">= 0.4" 4974 + }, 4975 + "funding": { 4976 + "url": "https://github.com/sponsors/ljharb" 4977 + } 4978 + }, 4979 + "node_modules/graceful-fs": { 4980 + "version": "4.2.11", 4981 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 4982 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 4983 + "dev": true, 4984 + "license": "ISC" 4985 + }, 4986 + "node_modules/graphemer": { 4987 + "version": "1.4.0", 4988 + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 4989 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 4990 + "license": "MIT" 4991 + }, 4992 + "node_modules/has-bigints": { 4993 + "version": "1.1.0", 4994 + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 4995 + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 4996 + "dev": true, 4997 + "license": "MIT", 4998 + "engines": { 4999 + "node": ">= 0.4" 5000 + }, 5001 + "funding": { 5002 + "url": "https://github.com/sponsors/ljharb" 5003 + } 5004 + }, 5005 + "node_modules/has-flag": { 5006 + "version": "4.0.0", 5007 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 5008 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 5009 + "dev": true, 5010 + "license": "MIT", 5011 + "engines": { 5012 + "node": ">=8" 5013 + } 5014 + }, 5015 + "node_modules/has-property-descriptors": { 5016 + "version": "1.0.2", 5017 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 5018 + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 5019 + "dev": true, 5020 + "license": "MIT", 5021 + "dependencies": { 5022 + "es-define-property": "^1.0.0" 5023 + }, 5024 + "funding": { 5025 + "url": "https://github.com/sponsors/ljharb" 5026 + } 5027 + }, 5028 + "node_modules/has-proto": { 5029 + "version": "1.2.0", 5030 + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 5031 + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 5032 + "dev": true, 5033 + "license": "MIT", 5034 + "dependencies": { 5035 + "dunder-proto": "^1.0.0" 5036 + }, 5037 + "engines": { 5038 + "node": ">= 0.4" 5039 + }, 5040 + "funding": { 5041 + "url": "https://github.com/sponsors/ljharb" 5042 + } 5043 + }, 5044 + "node_modules/has-symbols": { 5045 + "version": "1.1.0", 5046 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 5047 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 5048 + "license": "MIT", 5049 + "engines": { 5050 + "node": ">= 0.4" 5051 + }, 5052 + "funding": { 5053 + "url": "https://github.com/sponsors/ljharb" 5054 + } 5055 + }, 5056 + "node_modules/has-tostringtag": { 5057 + "version": "1.0.2", 5058 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 5059 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 5060 + "dev": true, 5061 + "license": "MIT", 5062 + "dependencies": { 5063 + "has-symbols": "^1.0.3" 5064 + }, 5065 + "engines": { 5066 + "node": ">= 0.4" 5067 + }, 5068 + "funding": { 5069 + "url": "https://github.com/sponsors/ljharb" 5070 + } 5071 + }, 5072 + "node_modules/hasown": { 5073 + "version": "2.0.2", 5074 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 5075 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 5076 + "license": "MIT", 5077 + "dependencies": { 5078 + "function-bind": "^1.1.2" 5079 + }, 5080 + "engines": { 5081 + "node": ">= 0.4" 5082 + } 5083 + }, 5084 + "node_modules/hermes-estree": { 5085 + "version": "0.25.1", 5086 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", 5087 + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", 5088 + "dev": true, 5089 + "license": "MIT" 5090 + }, 5091 + "node_modules/hermes-parser": { 5092 + "version": "0.25.1", 5093 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", 5094 + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", 5095 + "dev": true, 5096 + "license": "MIT", 5097 + "dependencies": { 5098 + "hermes-estree": "0.25.1" 5099 + } 5100 + }, 5101 + "node_modules/http-errors": { 5102 + "version": "2.0.0", 5103 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 5104 + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 5105 + "license": "MIT", 5106 + "dependencies": { 5107 + "depd": "2.0.0", 5108 + "inherits": "2.0.4", 5109 + "setprototypeof": "1.2.0", 5110 + "statuses": "2.0.1", 5111 + "toidentifier": "1.0.1" 5112 + }, 5113 + "engines": { 5114 + "node": ">= 0.8" 5115 + } 5116 + }, 5117 + "node_modules/iconv-lite": { 5118 + "version": "0.4.24", 5119 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 5120 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 5121 + "license": "MIT", 5122 + "dependencies": { 5123 + "safer-buffer": ">= 2.1.2 < 3" 5124 + }, 5125 + "engines": { 5126 + "node": ">=0.10.0" 5127 + } 5128 + }, 5129 + "node_modules/ieee754": { 5130 + "version": "1.2.1", 5131 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 5132 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 5133 + "funding": [ 5134 + { 5135 + "type": "github", 5136 + "url": "https://github.com/sponsors/feross" 5137 + }, 5138 + { 5139 + "type": "patreon", 5140 + "url": "https://www.patreon.com/feross" 5141 + }, 5142 + { 5143 + "type": "consulting", 5144 + "url": "https://feross.org/support" 5145 + } 5146 + ], 5147 + "license": "BSD-3-Clause" 5148 + }, 5149 + "node_modules/ignore": { 5150 + "version": "5.3.2", 5151 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 5152 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 5153 + "dev": true, 5154 + "license": "MIT", 5155 + "engines": { 5156 + "node": ">= 4" 5157 + } 5158 + }, 5159 + "node_modules/import-fresh": { 5160 + "version": "3.3.1", 5161 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 5162 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 5163 + "dev": true, 5164 + "license": "MIT", 5165 + "dependencies": { 5166 + "parent-module": "^1.0.0", 5167 + "resolve-from": "^4.0.0" 5168 + }, 5169 + "engines": { 5170 + "node": ">=6" 5171 + }, 5172 + "funding": { 5173 + "url": "https://github.com/sponsors/sindresorhus" 5174 + } 5175 + }, 5176 + "node_modules/imurmurhash": { 5177 + "version": "0.1.4", 5178 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 5179 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 5180 + "dev": true, 5181 + "license": "MIT", 5182 + "engines": { 5183 + "node": ">=0.8.19" 5184 + } 5185 + }, 5186 + "node_modules/inherits": { 5187 + "version": "2.0.4", 5188 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 5189 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 5190 + "license": "ISC" 5191 + }, 5192 + "node_modules/internal-slot": { 5193 + "version": "1.1.0", 5194 + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 5195 + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 5196 + "dev": true, 5197 + "license": "MIT", 5198 + "dependencies": { 5199 + "es-errors": "^1.3.0", 5200 + "hasown": "^2.0.2", 5201 + "side-channel": "^1.1.0" 5202 + }, 5203 + "engines": { 5204 + "node": ">= 0.4" 5205 + } 5206 + }, 5207 + "node_modules/ipaddr.js": { 5208 + "version": "2.2.0", 5209 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", 5210 + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", 5211 + "license": "MIT", 5212 + "engines": { 5213 + "node": ">= 10" 5214 + } 5215 + }, 5216 + "node_modules/is-array-buffer": { 5217 + "version": "3.0.5", 5218 + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 5219 + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 5220 + "dev": true, 5221 + "license": "MIT", 5222 + "dependencies": { 5223 + "call-bind": "^1.0.8", 5224 + "call-bound": "^1.0.3", 5225 + "get-intrinsic": "^1.2.6" 5226 + }, 5227 + "engines": { 5228 + "node": ">= 0.4" 5229 + }, 5230 + "funding": { 5231 + "url": "https://github.com/sponsors/ljharb" 5232 + } 5233 + }, 5234 + "node_modules/is-async-function": { 5235 + "version": "2.1.1", 5236 + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 5237 + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 5238 + "dev": true, 5239 + "license": "MIT", 5240 + "dependencies": { 5241 + "async-function": "^1.0.0", 5242 + "call-bound": "^1.0.3", 5243 + "get-proto": "^1.0.1", 5244 + "has-tostringtag": "^1.0.2", 5245 + "safe-regex-test": "^1.1.0" 5246 + }, 5247 + "engines": { 5248 + "node": ">= 0.4" 5249 + }, 5250 + "funding": { 5251 + "url": "https://github.com/sponsors/ljharb" 5252 + } 5253 + }, 5254 + "node_modules/is-bigint": { 5255 + "version": "1.1.0", 5256 + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 5257 + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 5258 + "dev": true, 5259 + "license": "MIT", 5260 + "dependencies": { 5261 + "has-bigints": "^1.0.2" 5262 + }, 5263 + "engines": { 5264 + "node": ">= 0.4" 5265 + }, 5266 + "funding": { 5267 + "url": "https://github.com/sponsors/ljharb" 5268 + } 5269 + }, 5270 + "node_modules/is-boolean-object": { 5271 + "version": "1.2.2", 5272 + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 5273 + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 5274 + "dev": true, 5275 + "license": "MIT", 5276 + "dependencies": { 5277 + "call-bound": "^1.0.3", 5278 + "has-tostringtag": "^1.0.2" 5279 + }, 5280 + "engines": { 5281 + "node": ">= 0.4" 5282 + }, 5283 + "funding": { 5284 + "url": "https://github.com/sponsors/ljharb" 5285 + } 5286 + }, 5287 + "node_modules/is-bun-module": { 5288 + "version": "2.0.0", 5289 + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", 5290 + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", 5291 + "dev": true, 5292 + "license": "MIT", 5293 + "dependencies": { 5294 + "semver": "^7.7.1" 5295 + } 5296 + }, 5297 + "node_modules/is-bun-module/node_modules/semver": { 5298 + "version": "7.7.3", 5299 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 5300 + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 5301 + "dev": true, 5302 + "license": "ISC", 5303 + "bin": { 5304 + "semver": "bin/semver.js" 5305 + }, 5306 + "engines": { 5307 + "node": ">=10" 5308 + } 5309 + }, 5310 + "node_modules/is-callable": { 5311 + "version": "1.2.7", 5312 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 5313 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 5314 + "dev": true, 5315 + "license": "MIT", 5316 + "engines": { 5317 + "node": ">= 0.4" 5318 + }, 5319 + "funding": { 5320 + "url": "https://github.com/sponsors/ljharb" 5321 + } 5322 + }, 5323 + "node_modules/is-core-module": { 5324 + "version": "2.16.1", 5325 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 5326 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 5327 + "dev": true, 5328 + "license": "MIT", 5329 + "dependencies": { 5330 + "hasown": "^2.0.2" 5331 + }, 5332 + "engines": { 5333 + "node": ">= 0.4" 5334 + }, 5335 + "funding": { 5336 + "url": "https://github.com/sponsors/ljharb" 5337 + } 5338 + }, 5339 + "node_modules/is-data-view": { 5340 + "version": "1.0.2", 5341 + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 5342 + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 5343 + "dev": true, 5344 + "license": "MIT", 5345 + "dependencies": { 5346 + "call-bound": "^1.0.2", 5347 + "get-intrinsic": "^1.2.6", 5348 + "is-typed-array": "^1.1.13" 5349 + }, 5350 + "engines": { 5351 + "node": ">= 0.4" 5352 + }, 5353 + "funding": { 5354 + "url": "https://github.com/sponsors/ljharb" 5355 + } 5356 + }, 5357 + "node_modules/is-date-object": { 5358 + "version": "1.1.0", 5359 + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 5360 + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 5361 + "dev": true, 5362 + "license": "MIT", 5363 + "dependencies": { 5364 + "call-bound": "^1.0.2", 5365 + "has-tostringtag": "^1.0.2" 5366 + }, 5367 + "engines": { 5368 + "node": ">= 0.4" 5369 + }, 5370 + "funding": { 5371 + "url": "https://github.com/sponsors/ljharb" 5372 + } 5373 + }, 5374 + "node_modules/is-extglob": { 5375 + "version": "2.1.1", 5376 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 5377 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 5378 + "dev": true, 5379 + "license": "MIT", 5380 + "engines": { 5381 + "node": ">=0.10.0" 5382 + } 5383 + }, 5384 + "node_modules/is-finalizationregistry": { 5385 + "version": "1.1.1", 5386 + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 5387 + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 5388 + "dev": true, 5389 + "license": "MIT", 5390 + "dependencies": { 5391 + "call-bound": "^1.0.3" 5392 + }, 5393 + "engines": { 5394 + "node": ">= 0.4" 5395 + }, 5396 + "funding": { 5397 + "url": "https://github.com/sponsors/ljharb" 5398 + } 5399 + }, 5400 + "node_modules/is-fullwidth-code-point": { 5401 + "version": "3.0.0", 5402 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 5403 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 5404 + "license": "MIT", 5405 + "engines": { 5406 + "node": ">=8" 5407 + } 5408 + }, 5409 + "node_modules/is-generator-function": { 5410 + "version": "1.1.2", 5411 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", 5412 + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", 5413 + "dev": true, 5414 + "license": "MIT", 5415 + "dependencies": { 5416 + "call-bound": "^1.0.4", 5417 + "generator-function": "^2.0.0", 5418 + "get-proto": "^1.0.1", 5419 + "has-tostringtag": "^1.0.2", 5420 + "safe-regex-test": "^1.1.0" 5421 + }, 5422 + "engines": { 5423 + "node": ">= 0.4" 5424 + }, 5425 + "funding": { 5426 + "url": "https://github.com/sponsors/ljharb" 5427 + } 5428 + }, 5429 + "node_modules/is-glob": { 5430 + "version": "4.0.3", 5431 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 5432 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 5433 + "dev": true, 5434 + "license": "MIT", 5435 + "dependencies": { 5436 + "is-extglob": "^2.1.1" 5437 + }, 5438 + "engines": { 5439 + "node": ">=0.10.0" 5440 + } 5441 + }, 5442 + "node_modules/is-map": { 5443 + "version": "2.0.3", 5444 + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 5445 + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 5446 + "dev": true, 5447 + "license": "MIT", 5448 + "engines": { 5449 + "node": ">= 0.4" 5450 + }, 5451 + "funding": { 5452 + "url": "https://github.com/sponsors/ljharb" 5453 + } 5454 + }, 5455 + "node_modules/is-negative-zero": { 5456 + "version": "2.0.3", 5457 + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 5458 + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 5459 + "dev": true, 5460 + "license": "MIT", 5461 + "engines": { 5462 + "node": ">= 0.4" 5463 + }, 5464 + "funding": { 5465 + "url": "https://github.com/sponsors/ljharb" 5466 + } 5467 + }, 5468 + "node_modules/is-number": { 5469 + "version": "7.0.0", 5470 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 5471 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 5472 + "dev": true, 5473 + "license": "MIT", 5474 + "engines": { 5475 + "node": ">=0.12.0" 5476 + } 5477 + }, 5478 + "node_modules/is-number-object": { 5479 + "version": "1.1.1", 5480 + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 5481 + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 5482 + "dev": true, 5483 + "license": "MIT", 5484 + "dependencies": { 5485 + "call-bound": "^1.0.3", 5486 + "has-tostringtag": "^1.0.2" 5487 + }, 5488 + "engines": { 5489 + "node": ">= 0.4" 5490 + }, 5491 + "funding": { 5492 + "url": "https://github.com/sponsors/ljharb" 5493 + } 5494 + }, 5495 + "node_modules/is-regex": { 5496 + "version": "1.2.1", 5497 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 5498 + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 5499 + "dev": true, 5500 + "license": "MIT", 5501 + "dependencies": { 5502 + "call-bound": "^1.0.2", 5503 + "gopd": "^1.2.0", 5504 + "has-tostringtag": "^1.0.2", 5505 + "hasown": "^2.0.2" 5506 + }, 5507 + "engines": { 5508 + "node": ">= 0.4" 5509 + }, 5510 + "funding": { 5511 + "url": "https://github.com/sponsors/ljharb" 5512 + } 5513 + }, 5514 + "node_modules/is-set": { 5515 + "version": "2.0.3", 5516 + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 5517 + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 5518 + "dev": true, 5519 + "license": "MIT", 5520 + "engines": { 5521 + "node": ">= 0.4" 5522 + }, 5523 + "funding": { 5524 + "url": "https://github.com/sponsors/ljharb" 5525 + } 5526 + }, 5527 + "node_modules/is-shared-array-buffer": { 5528 + "version": "1.0.4", 5529 + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 5530 + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 5531 + "dev": true, 5532 + "license": "MIT", 5533 + "dependencies": { 5534 + "call-bound": "^1.0.3" 5535 + }, 5536 + "engines": { 5537 + "node": ">= 0.4" 5538 + }, 5539 + "funding": { 5540 + "url": "https://github.com/sponsors/ljharb" 5541 + } 5542 + }, 5543 + "node_modules/is-string": { 5544 + "version": "1.1.1", 5545 + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 5546 + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 5547 + "dev": true, 5548 + "license": "MIT", 5549 + "dependencies": { 5550 + "call-bound": "^1.0.3", 5551 + "has-tostringtag": "^1.0.2" 5552 + }, 5553 + "engines": { 5554 + "node": ">= 0.4" 5555 + }, 5556 + "funding": { 5557 + "url": "https://github.com/sponsors/ljharb" 5558 + } 5559 + }, 5560 + "node_modules/is-symbol": { 5561 + "version": "1.1.1", 5562 + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 5563 + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 5564 + "dev": true, 5565 + "license": "MIT", 5566 + "dependencies": { 5567 + "call-bound": "^1.0.2", 5568 + "has-symbols": "^1.1.0", 5569 + "safe-regex-test": "^1.1.0" 5570 + }, 5571 + "engines": { 5572 + "node": ">= 0.4" 5573 + }, 5574 + "funding": { 5575 + "url": "https://github.com/sponsors/ljharb" 5576 + } 5577 + }, 5578 + "node_modules/is-typed-array": { 5579 + "version": "1.1.15", 5580 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 5581 + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 5582 + "dev": true, 5583 + "license": "MIT", 5584 + "dependencies": { 5585 + "which-typed-array": "^1.1.16" 5586 + }, 5587 + "engines": { 5588 + "node": ">= 0.4" 5589 + }, 5590 + "funding": { 5591 + "url": "https://github.com/sponsors/ljharb" 5592 + } 5593 + }, 5594 + "node_modules/is-weakmap": { 5595 + "version": "2.0.2", 5596 + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 5597 + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 5598 + "dev": true, 5599 + "license": "MIT", 5600 + "engines": { 5601 + "node": ">= 0.4" 5602 + }, 5603 + "funding": { 5604 + "url": "https://github.com/sponsors/ljharb" 5605 + } 5606 + }, 5607 + "node_modules/is-weakref": { 5608 + "version": "1.1.1", 5609 + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 5610 + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 5611 + "dev": true, 5612 + "license": "MIT", 5613 + "dependencies": { 5614 + "call-bound": "^1.0.3" 5615 + }, 5616 + "engines": { 5617 + "node": ">= 0.4" 5618 + }, 5619 + "funding": { 5620 + "url": "https://github.com/sponsors/ljharb" 5621 + } 5622 + }, 5623 + "node_modules/is-weakset": { 5624 + "version": "2.0.4", 5625 + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 5626 + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 5627 + "dev": true, 5628 + "license": "MIT", 5629 + "dependencies": { 5630 + "call-bound": "^1.0.3", 5631 + "get-intrinsic": "^1.2.6" 5632 + }, 5633 + "engines": { 5634 + "node": ">= 0.4" 5635 + }, 5636 + "funding": { 5637 + "url": "https://github.com/sponsors/ljharb" 5638 + } 5639 + }, 5640 + "node_modules/isarray": { 5641 + "version": "2.0.5", 5642 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 5643 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 5644 + "dev": true, 5645 + "license": "MIT" 5646 + }, 5647 + "node_modules/isexe": { 5648 + "version": "2.0.0", 5649 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 5650 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 5651 + "dev": true, 5652 + "license": "ISC" 5653 + }, 5654 + "node_modules/iso-datestring-validator": { 5655 + "version": "2.2.2", 5656 + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 5657 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 5658 + "license": "MIT" 5659 + }, 5660 + "node_modules/iterator.prototype": { 5661 + "version": "1.1.5", 5662 + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", 5663 + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", 5664 + "dev": true, 5665 + "license": "MIT", 5666 + "dependencies": { 5667 + "define-data-property": "^1.1.4", 5668 + "es-object-atoms": "^1.0.0", 5669 + "get-intrinsic": "^1.2.6", 5670 + "get-proto": "^1.0.0", 5671 + "has-symbols": "^1.1.0", 5672 + "set-function-name": "^2.0.2" 5673 + }, 5674 + "engines": { 5675 + "node": ">= 0.4" 5676 + } 5677 + }, 5678 + "node_modules/jiti": { 5679 + "version": "2.6.1", 5680 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", 5681 + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", 5682 + "dev": true, 5683 + "license": "MIT", 5684 + "bin": { 5685 + "jiti": "lib/jiti-cli.mjs" 5686 + } 5687 + }, 5688 + "node_modules/jose": { 5689 + "version": "5.10.0", 5690 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", 5691 + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", 5692 + "license": "MIT", 5693 + "funding": { 5694 + "url": "https://github.com/sponsors/panva" 5695 + } 5696 + }, 5697 + "node_modules/js-tokens": { 5698 + "version": "4.0.0", 5699 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 5700 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 5701 + "dev": true, 5702 + "license": "MIT" 5703 + }, 5704 + "node_modules/js-yaml": { 5705 + "version": "4.1.1", 5706 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 5707 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 5708 + "dev": true, 5709 + "license": "MIT", 5710 + "dependencies": { 5711 + "argparse": "^2.0.1" 5712 + }, 5713 + "bin": { 5714 + "js-yaml": "bin/js-yaml.js" 5715 + } 5716 + }, 5717 + "node_modules/jsesc": { 5718 + "version": "3.1.0", 5719 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 5720 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 5721 + "dev": true, 5722 + "license": "MIT", 5723 + "bin": { 5724 + "jsesc": "bin/jsesc" 5725 + }, 5726 + "engines": { 5727 + "node": ">=6" 5728 + } 5729 + }, 5730 + "node_modules/json-buffer": { 5731 + "version": "3.0.1", 5732 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 5733 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 5734 + "dev": true, 5735 + "license": "MIT" 5736 + }, 5737 + "node_modules/json-schema-traverse": { 5738 + "version": "0.4.1", 5739 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 5740 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 5741 + "dev": true, 5742 + "license": "MIT" 5743 + }, 5744 + "node_modules/json-stable-stringify-without-jsonify": { 5745 + "version": "1.0.1", 5746 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 5747 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 5748 + "dev": true, 5749 + "license": "MIT" 5750 + }, 5751 + "node_modules/json5": { 5752 + "version": "2.2.3", 5753 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 5754 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 5755 + "dev": true, 5756 + "license": "MIT", 5757 + "bin": { 5758 + "json5": "lib/cli.js" 5759 + }, 5760 + "engines": { 5761 + "node": ">=6" 5762 + } 5763 + }, 5764 + "node_modules/jsx-ast-utils": { 5765 + "version": "3.3.5", 5766 + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", 5767 + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", 5768 + "dev": true, 5769 + "license": "MIT", 5770 + "dependencies": { 5771 + "array-includes": "^3.1.6", 5772 + "array.prototype.flat": "^1.3.1", 5773 + "object.assign": "^4.1.4", 5774 + "object.values": "^1.1.6" 5775 + }, 5776 + "engines": { 5777 + "node": ">=4.0" 5778 + } 5779 + }, 5780 + "node_modules/keyv": { 5781 + "version": "4.5.4", 5782 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 5783 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 5784 + "dev": true, 5785 + "license": "MIT", 5786 + "dependencies": { 5787 + "json-buffer": "3.0.1" 5788 + } 5789 + }, 5790 + "node_modules/language-subtag-registry": { 5791 + "version": "0.3.23", 5792 + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", 5793 + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", 5794 + "dev": true, 5795 + "license": "CC0-1.0" 5796 + }, 5797 + "node_modules/language-tags": { 5798 + "version": "1.0.9", 5799 + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", 5800 + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", 5801 + "dev": true, 5802 + "license": "MIT", 5803 + "dependencies": { 5804 + "language-subtag-registry": "^0.3.20" 5805 + }, 5806 + "engines": { 5807 + "node": ">=0.10" 5808 + } 5809 + }, 5810 + "node_modules/levn": { 5811 + "version": "0.4.1", 5812 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 5813 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 5814 + "dev": true, 5815 + "license": "MIT", 5816 + "dependencies": { 5817 + "prelude-ls": "^1.2.1", 5818 + "type-check": "~0.4.0" 5819 + }, 5820 + "engines": { 5821 + "node": ">= 0.8.0" 5822 + } 5823 + }, 5824 + "node_modules/lightningcss": { 5825 + "version": "1.30.2", 5826 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", 5827 + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", 5828 + "dev": true, 5829 + "license": "MPL-2.0", 5830 + "dependencies": { 5831 + "detect-libc": "^2.0.3" 5832 + }, 5833 + "engines": { 5834 + "node": ">= 12.0.0" 5835 + }, 5836 + "funding": { 5837 + "type": "opencollective", 5838 + "url": "https://opencollective.com/parcel" 5839 + }, 5840 + "optionalDependencies": { 5841 + "lightningcss-android-arm64": "1.30.2", 5842 + "lightningcss-darwin-arm64": "1.30.2", 5843 + "lightningcss-darwin-x64": "1.30.2", 5844 + "lightningcss-freebsd-x64": "1.30.2", 5845 + "lightningcss-linux-arm-gnueabihf": "1.30.2", 5846 + "lightningcss-linux-arm64-gnu": "1.30.2", 5847 + "lightningcss-linux-arm64-musl": "1.30.2", 5848 + "lightningcss-linux-x64-gnu": "1.30.2", 5849 + "lightningcss-linux-x64-musl": "1.30.2", 5850 + "lightningcss-win32-arm64-msvc": "1.30.2", 5851 + "lightningcss-win32-x64-msvc": "1.30.2" 5852 + } 5853 + }, 5854 + "node_modules/lightningcss-android-arm64": { 5855 + "version": "1.30.2", 5856 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", 5857 + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", 5858 + "cpu": [ 5859 + "arm64" 5860 + ], 5861 + "dev": true, 5862 + "license": "MPL-2.0", 5863 + "optional": true, 5864 + "os": [ 5865 + "android" 5866 + ], 5867 + "engines": { 5868 + "node": ">= 12.0.0" 5869 + }, 5870 + "funding": { 5871 + "type": "opencollective", 5872 + "url": "https://opencollective.com/parcel" 5873 + } 5874 + }, 5875 + "node_modules/lightningcss-darwin-arm64": { 5876 + "version": "1.30.2", 5877 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", 5878 + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", 5879 + "cpu": [ 5880 + "arm64" 5881 + ], 5882 + "dev": true, 5883 + "license": "MPL-2.0", 5884 + "optional": true, 5885 + "os": [ 5886 + "darwin" 5887 + ], 5888 + "engines": { 5889 + "node": ">= 12.0.0" 5890 + }, 5891 + "funding": { 5892 + "type": "opencollective", 5893 + "url": "https://opencollective.com/parcel" 5894 + } 5895 + }, 5896 + "node_modules/lightningcss-darwin-x64": { 5897 + "version": "1.30.2", 5898 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", 5899 + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", 5900 + "cpu": [ 5901 + "x64" 5902 + ], 5903 + "dev": true, 5904 + "license": "MPL-2.0", 5905 + "optional": true, 5906 + "os": [ 5907 + "darwin" 5908 + ], 5909 + "engines": { 5910 + "node": ">= 12.0.0" 5911 + }, 5912 + "funding": { 5913 + "type": "opencollective", 5914 + "url": "https://opencollective.com/parcel" 5915 + } 5916 + }, 5917 + "node_modules/lightningcss-freebsd-x64": { 5918 + "version": "1.30.2", 5919 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", 5920 + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", 5921 + "cpu": [ 5922 + "x64" 5923 + ], 5924 + "dev": true, 5925 + "license": "MPL-2.0", 5926 + "optional": true, 5927 + "os": [ 5928 + "freebsd" 5929 + ], 5930 + "engines": { 5931 + "node": ">= 12.0.0" 5932 + }, 5933 + "funding": { 5934 + "type": "opencollective", 5935 + "url": "https://opencollective.com/parcel" 5936 + } 5937 + }, 5938 + "node_modules/lightningcss-linux-arm-gnueabihf": { 5939 + "version": "1.30.2", 5940 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", 5941 + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", 5942 + "cpu": [ 5943 + "arm" 5944 + ], 5945 + "dev": true, 5946 + "license": "MPL-2.0", 5947 + "optional": true, 5948 + "os": [ 5949 + "linux" 5950 + ], 5951 + "engines": { 5952 + "node": ">= 12.0.0" 5953 + }, 5954 + "funding": { 5955 + "type": "opencollective", 5956 + "url": "https://opencollective.com/parcel" 5957 + } 5958 + }, 5959 + "node_modules/lightningcss-linux-arm64-gnu": { 5960 + "version": "1.30.2", 5961 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", 5962 + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", 5963 + "cpu": [ 5964 + "arm64" 5965 + ], 5966 + "dev": true, 5967 + "license": "MPL-2.0", 5968 + "optional": true, 5969 + "os": [ 5970 + "linux" 5971 + ], 5972 + "engines": { 5973 + "node": ">= 12.0.0" 5974 + }, 5975 + "funding": { 5976 + "type": "opencollective", 5977 + "url": "https://opencollective.com/parcel" 5978 + } 5979 + }, 5980 + "node_modules/lightningcss-linux-arm64-musl": { 5981 + "version": "1.30.2", 5982 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", 5983 + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", 5984 + "cpu": [ 5985 + "arm64" 5986 + ], 5987 + "dev": true, 5988 + "license": "MPL-2.0", 5989 + "optional": true, 5990 + "os": [ 5991 + "linux" 5992 + ], 5993 + "engines": { 5994 + "node": ">= 12.0.0" 5995 + }, 5996 + "funding": { 5997 + "type": "opencollective", 5998 + "url": "https://opencollective.com/parcel" 5999 + } 6000 + }, 6001 + "node_modules/lightningcss-linux-x64-gnu": { 6002 + "version": "1.30.2", 6003 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", 6004 + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", 6005 + "cpu": [ 6006 + "x64" 6007 + ], 6008 + "dev": true, 6009 + "license": "MPL-2.0", 6010 + "optional": true, 6011 + "os": [ 6012 + "linux" 6013 + ], 6014 + "engines": { 6015 + "node": ">= 12.0.0" 6016 + }, 6017 + "funding": { 6018 + "type": "opencollective", 6019 + "url": "https://opencollective.com/parcel" 6020 + } 6021 + }, 6022 + "node_modules/lightningcss-linux-x64-musl": { 6023 + "version": "1.30.2", 6024 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", 6025 + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", 6026 + "cpu": [ 6027 + "x64" 6028 + ], 6029 + "dev": true, 6030 + "license": "MPL-2.0", 6031 + "optional": true, 6032 + "os": [ 6033 + "linux" 6034 + ], 6035 + "engines": { 6036 + "node": ">= 12.0.0" 6037 + }, 6038 + "funding": { 6039 + "type": "opencollective", 6040 + "url": "https://opencollective.com/parcel" 6041 + } 6042 + }, 6043 + "node_modules/lightningcss-win32-arm64-msvc": { 6044 + "version": "1.30.2", 6045 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", 6046 + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", 6047 + "cpu": [ 6048 + "arm64" 6049 + ], 6050 + "dev": true, 6051 + "license": "MPL-2.0", 6052 + "optional": true, 6053 + "os": [ 6054 + "win32" 6055 + ], 6056 + "engines": { 6057 + "node": ">= 12.0.0" 6058 + }, 6059 + "funding": { 6060 + "type": "opencollective", 6061 + "url": "https://opencollective.com/parcel" 6062 + } 6063 + }, 6064 + "node_modules/lightningcss-win32-x64-msvc": { 6065 + "version": "1.30.2", 6066 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", 6067 + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", 6068 + "cpu": [ 6069 + "x64" 6070 + ], 6071 + "dev": true, 6072 + "license": "MPL-2.0", 6073 + "optional": true, 6074 + "os": [ 6075 + "win32" 6076 + ], 6077 + "engines": { 6078 + "node": ">= 12.0.0" 6079 + }, 6080 + "funding": { 6081 + "type": "opencollective", 6082 + "url": "https://opencollective.com/parcel" 6083 + } 6084 + }, 6085 + "node_modules/locate-path": { 6086 + "version": "6.0.0", 6087 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 6088 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 6089 + "dev": true, 6090 + "license": "MIT", 6091 + "dependencies": { 6092 + "p-locate": "^5.0.0" 6093 + }, 6094 + "engines": { 6095 + "node": ">=10" 6096 + }, 6097 + "funding": { 6098 + "url": "https://github.com/sponsors/sindresorhus" 6099 + } 6100 + }, 6101 + "node_modules/lodash.merge": { 6102 + "version": "4.6.2", 6103 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 6104 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 6105 + "dev": true, 6106 + "license": "MIT" 6107 + }, 6108 + "node_modules/loose-envify": { 6109 + "version": "1.4.0", 6110 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 6111 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 6112 + "dev": true, 6113 + "license": "MIT", 6114 + "dependencies": { 6115 + "js-tokens": "^3.0.0 || ^4.0.0" 6116 + }, 6117 + "bin": { 6118 + "loose-envify": "cli.js" 6119 + } 6120 + }, 6121 + "node_modules/lru-cache": { 6122 + "version": "10.4.3", 6123 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 6124 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 6125 + "license": "ISC" 6126 + }, 6127 + "node_modules/magic-string": { 6128 + "version": "0.30.21", 6129 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 6130 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 6131 + "dev": true, 6132 + "license": "MIT", 6133 + "dependencies": { 6134 + "@jridgewell/sourcemap-codec": "^1.5.5" 6135 + } 6136 + }, 6137 + "node_modules/math-intrinsics": { 6138 + "version": "1.1.0", 6139 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 6140 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 6141 + "license": "MIT", 6142 + "engines": { 6143 + "node": ">= 0.4" 6144 + } 6145 + }, 6146 + "node_modules/media-typer": { 6147 + "version": "0.3.0", 6148 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 6149 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 6150 + "license": "MIT", 6151 + "engines": { 6152 + "node": ">= 0.6" 6153 + } 6154 + }, 6155 + "node_modules/merge-descriptors": { 6156 + "version": "1.0.3", 6157 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 6158 + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 6159 + "license": "MIT", 6160 + "funding": { 6161 + "url": "https://github.com/sponsors/sindresorhus" 6162 + } 6163 + }, 6164 + "node_modules/merge2": { 6165 + "version": "1.4.1", 6166 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 6167 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 6168 + "dev": true, 6169 + "license": "MIT", 6170 + "engines": { 6171 + "node": ">= 8" 6172 + } 6173 + }, 6174 + "node_modules/methods": { 6175 + "version": "1.1.2", 6176 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 6177 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 6178 + "license": "MIT", 6179 + "engines": { 6180 + "node": ">= 0.6" 6181 + } 6182 + }, 6183 + "node_modules/micromatch": { 6184 + "version": "4.0.8", 6185 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 6186 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 6187 + "dev": true, 6188 + "license": "MIT", 6189 + "dependencies": { 6190 + "braces": "^3.0.3", 6191 + "picomatch": "^2.3.1" 6192 + }, 6193 + "engines": { 6194 + "node": ">=8.6" 6195 + } 6196 + }, 6197 + "node_modules/mime": { 6198 + "version": "1.6.0", 6199 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 6200 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 6201 + "license": "MIT", 6202 + "bin": { 6203 + "mime": "cli.js" 6204 + }, 6205 + "engines": { 6206 + "node": ">=4" 6207 + } 6208 + }, 6209 + "node_modules/mime-db": { 6210 + "version": "1.52.0", 6211 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 6212 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 6213 + "license": "MIT", 6214 + "engines": { 6215 + "node": ">= 0.6" 6216 + } 6217 + }, 6218 + "node_modules/mime-types": { 6219 + "version": "2.1.35", 6220 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 6221 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 6222 + "license": "MIT", 6223 + "dependencies": { 6224 + "mime-db": "1.52.0" 6225 + }, 6226 + "engines": { 6227 + "node": ">= 0.6" 6228 + } 6229 + }, 6230 + "node_modules/minimatch": { 6231 + "version": "3.1.2", 6232 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 6233 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 6234 + "dev": true, 6235 + "license": "ISC", 6236 + "dependencies": { 6237 + "brace-expansion": "^1.1.7" 6238 + }, 6239 + "engines": { 6240 + "node": "*" 6241 + } 6242 + }, 6243 + "node_modules/minimist": { 6244 + "version": "1.2.8", 6245 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 6246 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 6247 + "dev": true, 6248 + "license": "MIT", 6249 + "funding": { 6250 + "url": "https://github.com/sponsors/ljharb" 6251 + } 6252 + }, 6253 + "node_modules/ms": { 6254 + "version": "2.1.3", 6255 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 6256 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 6257 + "license": "MIT" 6258 + }, 6259 + "node_modules/multiformats": { 6260 + "version": "9.9.0", 6261 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 6262 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 6263 + "license": "(Apache-2.0 AND MIT)" 6264 + }, 6265 + "node_modules/nanoid": { 6266 + "version": "3.3.11", 6267 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 6268 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 6269 + "funding": [ 6270 + { 6271 + "type": "github", 6272 + "url": "https://github.com/sponsors/ai" 6273 + } 6274 + ], 6275 + "license": "MIT", 6276 + "bin": { 6277 + "nanoid": "bin/nanoid.cjs" 6278 + }, 6279 + "engines": { 6280 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 6281 + } 6282 + }, 6283 + "node_modules/napi-postinstall": { 6284 + "version": "0.3.4", 6285 + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", 6286 + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", 6287 + "dev": true, 6288 + "license": "MIT", 6289 + "bin": { 6290 + "napi-postinstall": "lib/cli.js" 6291 + }, 6292 + "engines": { 6293 + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 6294 + }, 6295 + "funding": { 6296 + "url": "https://opencollective.com/napi-postinstall" 6297 + } 6298 + }, 6299 + "node_modules/natural-compare": { 6300 + "version": "1.4.0", 6301 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 6302 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 6303 + "dev": true, 6304 + "license": "MIT" 6305 + }, 6306 + "node_modules/negotiator": { 6307 + "version": "0.6.3", 6308 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 6309 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 6310 + "license": "MIT", 6311 + "engines": { 6312 + "node": ">= 0.6" 6313 + } 6314 + }, 6315 + "node_modules/next": { 6316 + "version": "16.0.3", 6317 + "resolved": "https://registry.npmjs.org/next/-/next-16.0.3.tgz", 6318 + "integrity": "sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==", 6319 + "license": "MIT", 6320 + "dependencies": { 6321 + "@next/env": "16.0.3", 6322 + "@swc/helpers": "0.5.15", 6323 + "caniuse-lite": "^1.0.30001579", 6324 + "postcss": "8.4.31", 6325 + "styled-jsx": "5.1.6" 6326 + }, 6327 + "bin": { 6328 + "next": "dist/bin/next" 6329 + }, 6330 + "engines": { 6331 + "node": ">=20.9.0" 6332 + }, 6333 + "optionalDependencies": { 6334 + "@next/swc-darwin-arm64": "16.0.3", 6335 + "@next/swc-darwin-x64": "16.0.3", 6336 + "@next/swc-linux-arm64-gnu": "16.0.3", 6337 + "@next/swc-linux-arm64-musl": "16.0.3", 6338 + "@next/swc-linux-x64-gnu": "16.0.3", 6339 + "@next/swc-linux-x64-musl": "16.0.3", 6340 + "@next/swc-win32-arm64-msvc": "16.0.3", 6341 + "@next/swc-win32-x64-msvc": "16.0.3", 6342 + "sharp": "^0.34.4" 6343 + }, 6344 + "peerDependencies": { 6345 + "@opentelemetry/api": "^1.1.0", 6346 + "@playwright/test": "^1.51.1", 6347 + "babel-plugin-react-compiler": "*", 6348 + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", 6349 + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", 6350 + "sass": "^1.3.0" 6351 + }, 6352 + "peerDependenciesMeta": { 6353 + "@opentelemetry/api": { 6354 + "optional": true 6355 + }, 6356 + "@playwright/test": { 6357 + "optional": true 6358 + }, 6359 + "babel-plugin-react-compiler": { 6360 + "optional": true 6361 + }, 6362 + "sass": { 6363 + "optional": true 6364 + } 6365 + } 6366 + }, 6367 + "node_modules/next/node_modules/postcss": { 6368 + "version": "8.4.31", 6369 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 6370 + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 6371 + "funding": [ 6372 + { 6373 + "type": "opencollective", 6374 + "url": "https://opencollective.com/postcss/" 6375 + }, 6376 + { 6377 + "type": "tidelift", 6378 + "url": "https://tidelift.com/funding/github/npm/postcss" 6379 + }, 6380 + { 6381 + "type": "github", 6382 + "url": "https://github.com/sponsors/ai" 6383 + } 6384 + ], 6385 + "license": "MIT", 6386 + "dependencies": { 6387 + "nanoid": "^3.3.6", 6388 + "picocolors": "^1.0.0", 6389 + "source-map-js": "^1.0.2" 6390 + }, 6391 + "engines": { 6392 + "node": "^10 || ^12 || >=14" 6393 + } 6394 + }, 6395 + "node_modules/node-gyp-build-optional-packages": { 6396 + "version": "5.1.1", 6397 + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", 6398 + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", 6399 + "license": "MIT", 6400 + "optional": true, 6401 + "dependencies": { 6402 + "detect-libc": "^2.0.1" 6403 + }, 6404 + "bin": { 6405 + "node-gyp-build-optional-packages": "bin.js", 6406 + "node-gyp-build-optional-packages-optional": "optional.js", 6407 + "node-gyp-build-optional-packages-test": "build-test.js" 6408 + } 6409 + }, 6410 + "node_modules/node-releases": { 6411 + "version": "2.0.27", 6412 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 6413 + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 6414 + "dev": true, 6415 + "license": "MIT" 6416 + }, 6417 + "node_modules/object-assign": { 6418 + "version": "4.1.1", 6419 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 6420 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 6421 + "license": "MIT", 6422 + "engines": { 6423 + "node": ">=0.10.0" 6424 + } 6425 + }, 6426 + "node_modules/object-inspect": { 6427 + "version": "1.13.4", 6428 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 6429 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 6430 + "license": "MIT", 6431 + "engines": { 6432 + "node": ">= 0.4" 6433 + }, 6434 + "funding": { 6435 + "url": "https://github.com/sponsors/ljharb" 6436 + } 6437 + }, 6438 + "node_modules/object-keys": { 6439 + "version": "1.1.1", 6440 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 6441 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 6442 + "dev": true, 6443 + "license": "MIT", 6444 + "engines": { 6445 + "node": ">= 0.4" 6446 + } 6447 + }, 6448 + "node_modules/object.assign": { 6449 + "version": "4.1.7", 6450 + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 6451 + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 6452 + "dev": true, 6453 + "license": "MIT", 6454 + "dependencies": { 6455 + "call-bind": "^1.0.8", 6456 + "call-bound": "^1.0.3", 6457 + "define-properties": "^1.2.1", 6458 + "es-object-atoms": "^1.0.0", 6459 + "has-symbols": "^1.1.0", 6460 + "object-keys": "^1.1.1" 6461 + }, 6462 + "engines": { 6463 + "node": ">= 0.4" 6464 + }, 6465 + "funding": { 6466 + "url": "https://github.com/sponsors/ljharb" 6467 + } 6468 + }, 6469 + "node_modules/object.entries": { 6470 + "version": "1.1.9", 6471 + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", 6472 + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", 6473 + "dev": true, 6474 + "license": "MIT", 6475 + "dependencies": { 6476 + "call-bind": "^1.0.8", 6477 + "call-bound": "^1.0.4", 6478 + "define-properties": "^1.2.1", 6479 + "es-object-atoms": "^1.1.1" 6480 + }, 6481 + "engines": { 6482 + "node": ">= 0.4" 6483 + } 6484 + }, 6485 + "node_modules/object.fromentries": { 6486 + "version": "2.0.8", 6487 + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", 6488 + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", 6489 + "dev": true, 6490 + "license": "MIT", 6491 + "dependencies": { 6492 + "call-bind": "^1.0.7", 6493 + "define-properties": "^1.2.1", 6494 + "es-abstract": "^1.23.2", 6495 + "es-object-atoms": "^1.0.0" 6496 + }, 6497 + "engines": { 6498 + "node": ">= 0.4" 6499 + }, 6500 + "funding": { 6501 + "url": "https://github.com/sponsors/ljharb" 6502 + } 6503 + }, 6504 + "node_modules/object.groupby": { 6505 + "version": "1.0.3", 6506 + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", 6507 + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", 6508 + "dev": true, 6509 + "license": "MIT", 6510 + "dependencies": { 6511 + "call-bind": "^1.0.7", 6512 + "define-properties": "^1.2.1", 6513 + "es-abstract": "^1.23.2" 6514 + }, 6515 + "engines": { 6516 + "node": ">= 0.4" 6517 + } 6518 + }, 6519 + "node_modules/object.values": { 6520 + "version": "1.2.1", 6521 + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", 6522 + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", 6523 + "dev": true, 6524 + "license": "MIT", 6525 + "dependencies": { 6526 + "call-bind": "^1.0.8", 6527 + "call-bound": "^1.0.3", 6528 + "define-properties": "^1.2.1", 6529 + "es-object-atoms": "^1.0.0" 6530 + }, 6531 + "engines": { 6532 + "node": ">= 0.4" 6533 + }, 6534 + "funding": { 6535 + "url": "https://github.com/sponsors/ljharb" 6536 + } 6537 + }, 6538 + "node_modules/on-exit-leak-free": { 6539 + "version": "2.1.2", 6540 + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", 6541 + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", 6542 + "license": "MIT", 6543 + "engines": { 6544 + "node": ">=14.0.0" 6545 + } 6546 + }, 6547 + "node_modules/on-finished": { 6548 + "version": "2.4.1", 6549 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 6550 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 6551 + "license": "MIT", 6552 + "dependencies": { 6553 + "ee-first": "1.1.1" 6554 + }, 6555 + "engines": { 6556 + "node": ">= 0.8" 6557 + } 6558 + }, 6559 + "node_modules/optionator": { 6560 + "version": "0.9.4", 6561 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 6562 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 6563 + "dev": true, 6564 + "license": "MIT", 6565 + "dependencies": { 6566 + "deep-is": "^0.1.3", 6567 + "fast-levenshtein": "^2.0.6", 6568 + "levn": "^0.4.1", 6569 + "prelude-ls": "^1.2.1", 6570 + "type-check": "^0.4.0", 6571 + "word-wrap": "^1.2.5" 6572 + }, 6573 + "engines": { 6574 + "node": ">= 0.8.0" 6575 + } 6576 + }, 6577 + "node_modules/own-keys": { 6578 + "version": "1.0.1", 6579 + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 6580 + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 6581 + "dev": true, 6582 + "license": "MIT", 6583 + "dependencies": { 6584 + "get-intrinsic": "^1.2.6", 6585 + "object-keys": "^1.1.1", 6586 + "safe-push-apply": "^1.0.0" 6587 + }, 6588 + "engines": { 6589 + "node": ">= 0.4" 6590 + }, 6591 + "funding": { 6592 + "url": "https://github.com/sponsors/ljharb" 6593 + } 6594 + }, 6595 + "node_modules/p-limit": { 6596 + "version": "3.1.0", 6597 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 6598 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 6599 + "dev": true, 6600 + "license": "MIT", 6601 + "dependencies": { 6602 + "yocto-queue": "^0.1.0" 6603 + }, 6604 + "engines": { 6605 + "node": ">=10" 6606 + }, 6607 + "funding": { 6608 + "url": "https://github.com/sponsors/sindresorhus" 6609 + } 6610 + }, 6611 + "node_modules/p-locate": { 6612 + "version": "5.0.0", 6613 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 6614 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 6615 + "dev": true, 6616 + "license": "MIT", 6617 + "dependencies": { 6618 + "p-limit": "^3.0.2" 6619 + }, 6620 + "engines": { 6621 + "node": ">=10" 6622 + }, 6623 + "funding": { 6624 + "url": "https://github.com/sponsors/sindresorhus" 6625 + } 6626 + }, 6627 + "node_modules/p-try": { 6628 + "version": "2.2.0", 6629 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 6630 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 6631 + "license": "MIT", 6632 + "engines": { 6633 + "node": ">=6" 6634 + } 6635 + }, 6636 + "node_modules/parent-module": { 6637 + "version": "1.0.1", 6638 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 6639 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 6640 + "dev": true, 6641 + "license": "MIT", 6642 + "dependencies": { 6643 + "callsites": "^3.0.0" 6644 + }, 6645 + "engines": { 6646 + "node": ">=6" 6647 + } 6648 + }, 6649 + "node_modules/parseurl": { 6650 + "version": "1.3.3", 6651 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 6652 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 6653 + "license": "MIT", 6654 + "engines": { 6655 + "node": ">= 0.8" 6656 + } 6657 + }, 6658 + "node_modules/path-browserify": { 6659 + "version": "1.0.1", 6660 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 6661 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 6662 + "dev": true, 6663 + "license": "MIT" 6664 + }, 6665 + "node_modules/path-exists": { 6666 + "version": "4.0.0", 6667 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 6668 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 6669 + "license": "MIT", 6670 + "engines": { 6671 + "node": ">=8" 6672 + } 6673 + }, 6674 + "node_modules/path-key": { 6675 + "version": "3.1.1", 6676 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 6677 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 6678 + "dev": true, 6679 + "license": "MIT", 6680 + "engines": { 6681 + "node": ">=8" 6682 + } 6683 + }, 6684 + "node_modules/path-parse": { 6685 + "version": "1.0.7", 6686 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 6687 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 6688 + "dev": true, 6689 + "license": "MIT" 6690 + }, 6691 + "node_modules/path-to-regexp": { 6692 + "version": "0.1.12", 6693 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", 6694 + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", 6695 + "license": "MIT" 6696 + }, 6697 + "node_modules/picocolors": { 6698 + "version": "1.1.1", 6699 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 6700 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 6701 + "license": "ISC" 6702 + }, 6703 + "node_modules/picomatch": { 6704 + "version": "2.3.1", 6705 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 6706 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 6707 + "dev": true, 6708 + "license": "MIT", 6709 + "engines": { 6710 + "node": ">=8.6" 6711 + }, 6712 + "funding": { 6713 + "url": "https://github.com/sponsors/jonschlinkert" 6714 + } 6715 + }, 6716 + "node_modules/pino": { 6717 + "version": "8.21.0", 6718 + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", 6719 + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 6720 + "license": "MIT", 6721 + "dependencies": { 6722 + "atomic-sleep": "^1.0.0", 6723 + "fast-redact": "^3.1.1", 6724 + "on-exit-leak-free": "^2.1.0", 6725 + "pino-abstract-transport": "^1.2.0", 6726 + "pino-std-serializers": "^6.0.0", 6727 + "process-warning": "^3.0.0", 6728 + "quick-format-unescaped": "^4.0.3", 6729 + "real-require": "^0.2.0", 6730 + "safe-stable-stringify": "^2.3.1", 6731 + "sonic-boom": "^3.7.0", 6732 + "thread-stream": "^2.6.0" 6733 + }, 6734 + "bin": { 6735 + "pino": "bin.js" 6736 + } 6737 + }, 6738 + "node_modules/pino-abstract-transport": { 6739 + "version": "1.2.0", 6740 + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", 6741 + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 6742 + "license": "MIT", 6743 + "dependencies": { 6744 + "readable-stream": "^4.0.0", 6745 + "split2": "^4.0.0" 6746 + } 6747 + }, 6748 + "node_modules/pino-std-serializers": { 6749 + "version": "6.2.2", 6750 + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", 6751 + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", 6752 + "license": "MIT" 6753 + }, 6754 + "node_modules/pngjs": { 6755 + "version": "5.0.0", 6756 + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", 6757 + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", 6758 + "license": "MIT", 6759 + "engines": { 6760 + "node": ">=10.13.0" 6761 + } 6762 + }, 6763 + "node_modules/possible-typed-array-names": { 6764 + "version": "1.1.0", 6765 + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 6766 + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 6767 + "dev": true, 6768 + "license": "MIT", 6769 + "engines": { 6770 + "node": ">= 0.4" 6771 + } 6772 + }, 6773 + "node_modules/postcss": { 6774 + "version": "8.5.6", 6775 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 6776 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 6777 + "dev": true, 6778 + "funding": [ 6779 + { 6780 + "type": "opencollective", 6781 + "url": "https://opencollective.com/postcss/" 6782 + }, 6783 + { 6784 + "type": "tidelift", 6785 + "url": "https://tidelift.com/funding/github/npm/postcss" 6786 + }, 6787 + { 6788 + "type": "github", 6789 + "url": "https://github.com/sponsors/ai" 6790 + } 6791 + ], 6792 + "license": "MIT", 6793 + "dependencies": { 6794 + "nanoid": "^3.3.11", 6795 + "picocolors": "^1.1.1", 6796 + "source-map-js": "^1.2.1" 6797 + }, 6798 + "engines": { 6799 + "node": "^10 || ^12 || >=14" 6800 + } 6801 + }, 6802 + "node_modules/prelude-ls": { 6803 + "version": "1.2.1", 6804 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 6805 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 6806 + "dev": true, 6807 + "license": "MIT", 6808 + "engines": { 6809 + "node": ">= 0.8.0" 6810 + } 6811 + }, 6812 + "node_modules/prettier": { 6813 + "version": "3.6.2", 6814 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", 6815 + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", 6816 + "dev": true, 6817 + "license": "MIT", 6818 + "bin": { 6819 + "prettier": "bin/prettier.cjs" 6820 + }, 6821 + "engines": { 6822 + "node": ">=14" 6823 + }, 6824 + "funding": { 6825 + "url": "https://github.com/prettier/prettier?sponsor=1" 6826 + } 6827 + }, 6828 + "node_modules/process": { 6829 + "version": "0.11.10", 6830 + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 6831 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 6832 + "license": "MIT", 6833 + "engines": { 6834 + "node": ">= 0.6.0" 6835 + } 6836 + }, 6837 + "node_modules/process-warning": { 6838 + "version": "3.0.0", 6839 + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", 6840 + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", 6841 + "license": "MIT" 6842 + }, 6843 + "node_modules/prop-types": { 6844 + "version": "15.8.1", 6845 + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 6846 + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 6847 + "dev": true, 6848 + "license": "MIT", 6849 + "dependencies": { 6850 + "loose-envify": "^1.4.0", 6851 + "object-assign": "^4.1.1", 6852 + "react-is": "^16.13.1" 6853 + } 6854 + }, 6855 + "node_modules/proxy-addr": { 6856 + "version": "2.0.7", 6857 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 6858 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 6859 + "license": "MIT", 6860 + "dependencies": { 6861 + "forwarded": "0.2.0", 6862 + "ipaddr.js": "1.9.1" 6863 + }, 6864 + "engines": { 6865 + "node": ">= 0.10" 6866 + } 6867 + }, 6868 + "node_modules/proxy-addr/node_modules/ipaddr.js": { 6869 + "version": "1.9.1", 6870 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 6871 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 6872 + "license": "MIT", 6873 + "engines": { 6874 + "node": ">= 0.10" 6875 + } 6876 + }, 6877 + "node_modules/punycode": { 6878 + "version": "2.3.1", 6879 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 6880 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 6881 + "dev": true, 6882 + "license": "MIT", 6883 + "engines": { 6884 + "node": ">=6" 6885 + } 6886 + }, 6887 + "node_modules/qrcode": { 6888 + "version": "1.5.4", 6889 + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", 6890 + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", 6891 + "license": "MIT", 6892 + "dependencies": { 6893 + "dijkstrajs": "^1.0.1", 6894 + "pngjs": "^5.0.0", 6895 + "yargs": "^15.3.1" 6896 + }, 6897 + "bin": { 6898 + "qrcode": "bin/qrcode" 6899 + }, 6900 + "engines": { 6901 + "node": ">=10.13.0" 6902 + } 6903 + }, 6904 + "node_modules/qs": { 6905 + "version": "6.13.0", 6906 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 6907 + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 6908 + "license": "BSD-3-Clause", 6909 + "dependencies": { 6910 + "side-channel": "^1.0.6" 6911 + }, 6912 + "engines": { 6913 + "node": ">=0.6" 6914 + }, 6915 + "funding": { 6916 + "url": "https://github.com/sponsors/ljharb" 6917 + } 6918 + }, 6919 + "node_modules/queue-microtask": { 6920 + "version": "1.2.3", 6921 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 6922 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 6923 + "dev": true, 6924 + "funding": [ 6925 + { 6926 + "type": "github", 6927 + "url": "https://github.com/sponsors/feross" 6928 + }, 6929 + { 6930 + "type": "patreon", 6931 + "url": "https://www.patreon.com/feross" 6932 + }, 6933 + { 6934 + "type": "consulting", 6935 + "url": "https://feross.org/support" 6936 + } 6937 + ], 6938 + "license": "MIT" 6939 + }, 6940 + "node_modules/quick-format-unescaped": { 6941 + "version": "4.0.4", 6942 + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", 6943 + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", 6944 + "license": "MIT" 6945 + }, 6946 + "node_modules/range-parser": { 6947 + "version": "1.2.1", 6948 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 6949 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 6950 + "license": "MIT", 6951 + "engines": { 6952 + "node": ">= 0.6" 6953 + } 6954 + }, 6955 + "node_modules/rate-limiter-flexible": { 6956 + "version": "2.4.2", 6957 + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.2.tgz", 6958 + "integrity": "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==", 6959 + "license": "ISC" 6960 + }, 6961 + "node_modules/raw-body": { 6962 + "version": "2.5.2", 6963 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 6964 + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 6965 + "license": "MIT", 6966 + "dependencies": { 6967 + "bytes": "3.1.2", 6968 + "http-errors": "2.0.0", 6969 + "iconv-lite": "0.4.24", 6970 + "unpipe": "1.0.0" 6971 + }, 6972 + "engines": { 6973 + "node": ">= 0.8" 6974 + } 6975 + }, 6976 + "node_modules/react": { 6977 + "version": "19.2.0", 6978 + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", 6979 + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", 6980 + "license": "MIT", 6981 + "engines": { 6982 + "node": ">=0.10.0" 6983 + } 6984 + }, 6985 + "node_modules/react-dom": { 6986 + "version": "19.2.0", 6987 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", 6988 + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", 6989 + "license": "MIT", 6990 + "dependencies": { 6991 + "scheduler": "^0.27.0" 6992 + }, 6993 + "peerDependencies": { 6994 + "react": "^19.2.0" 6995 + } 6996 + }, 6997 + "node_modules/react-is": { 6998 + "version": "16.13.1", 6999 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 7000 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 7001 + "dev": true, 7002 + "license": "MIT" 7003 + }, 7004 + "node_modules/readable-stream": { 7005 + "version": "4.7.0", 7006 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", 7007 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 7008 + "license": "MIT", 7009 + "dependencies": { 7010 + "abort-controller": "^3.0.0", 7011 + "buffer": "^6.0.3", 7012 + "events": "^3.3.0", 7013 + "process": "^0.11.10", 7014 + "string_decoder": "^1.3.0" 7015 + }, 7016 + "engines": { 7017 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 7018 + } 7019 + }, 7020 + "node_modules/real-require": { 7021 + "version": "0.2.0", 7022 + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", 7023 + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", 7024 + "license": "MIT", 7025 + "engines": { 7026 + "node": ">= 12.13.0" 7027 + } 7028 + }, 7029 + "node_modules/reflect.getprototypeof": { 7030 + "version": "1.0.10", 7031 + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 7032 + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 7033 + "dev": true, 7034 + "license": "MIT", 7035 + "dependencies": { 7036 + "call-bind": "^1.0.8", 7037 + "define-properties": "^1.2.1", 7038 + "es-abstract": "^1.23.9", 7039 + "es-errors": "^1.3.0", 7040 + "es-object-atoms": "^1.0.0", 7041 + "get-intrinsic": "^1.2.7", 7042 + "get-proto": "^1.0.1", 7043 + "which-builtin-type": "^1.2.1" 7044 + }, 7045 + "engines": { 7046 + "node": ">= 0.4" 7047 + }, 7048 + "funding": { 7049 + "url": "https://github.com/sponsors/ljharb" 7050 + } 7051 + }, 7052 + "node_modules/regexp.prototype.flags": { 7053 + "version": "1.5.4", 7054 + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 7055 + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 7056 + "dev": true, 7057 + "license": "MIT", 7058 + "dependencies": { 7059 + "call-bind": "^1.0.8", 7060 + "define-properties": "^1.2.1", 7061 + "es-errors": "^1.3.0", 7062 + "get-proto": "^1.0.1", 7063 + "gopd": "^1.2.0", 7064 + "set-function-name": "^2.0.2" 7065 + }, 7066 + "engines": { 7067 + "node": ">= 0.4" 7068 + }, 7069 + "funding": { 7070 + "url": "https://github.com/sponsors/ljharb" 7071 + } 7072 + }, 7073 + "node_modules/require-directory": { 7074 + "version": "2.1.1", 7075 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 7076 + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 7077 + "license": "MIT", 7078 + "engines": { 7079 + "node": ">=0.10.0" 7080 + } 7081 + }, 7082 + "node_modules/require-main-filename": { 7083 + "version": "2.0.0", 7084 + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 7085 + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 7086 + "license": "ISC" 7087 + }, 7088 + "node_modules/resolve": { 7089 + "version": "1.22.11", 7090 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 7091 + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 7092 + "dev": true, 7093 + "license": "MIT", 7094 + "dependencies": { 7095 + "is-core-module": "^2.16.1", 7096 + "path-parse": "^1.0.7", 7097 + "supports-preserve-symlinks-flag": "^1.0.0" 7098 + }, 7099 + "bin": { 7100 + "resolve": "bin/resolve" 7101 + }, 7102 + "engines": { 7103 + "node": ">= 0.4" 7104 + }, 7105 + "funding": { 7106 + "url": "https://github.com/sponsors/ljharb" 7107 + } 7108 + }, 7109 + "node_modules/resolve-from": { 7110 + "version": "4.0.0", 7111 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 7112 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 7113 + "dev": true, 7114 + "license": "MIT", 7115 + "engines": { 7116 + "node": ">=4" 7117 + } 7118 + }, 7119 + "node_modules/resolve-pkg-maps": { 7120 + "version": "1.0.0", 7121 + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 7122 + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 7123 + "dev": true, 7124 + "license": "MIT", 7125 + "funding": { 7126 + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 7127 + } 7128 + }, 7129 + "node_modules/reusify": { 7130 + "version": "1.1.0", 7131 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 7132 + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 7133 + "dev": true, 7134 + "license": "MIT", 7135 + "engines": { 7136 + "iojs": ">=1.0.0", 7137 + "node": ">=0.10.0" 7138 + } 7139 + }, 7140 + "node_modules/run-parallel": { 7141 + "version": "1.2.0", 7142 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 7143 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 7144 + "dev": true, 7145 + "funding": [ 7146 + { 7147 + "type": "github", 7148 + "url": "https://github.com/sponsors/feross" 7149 + }, 7150 + { 7151 + "type": "patreon", 7152 + "url": "https://www.patreon.com/feross" 7153 + }, 7154 + { 7155 + "type": "consulting", 7156 + "url": "https://feross.org/support" 7157 + } 7158 + ], 7159 + "license": "MIT", 7160 + "dependencies": { 7161 + "queue-microtask": "^1.2.2" 7162 + } 7163 + }, 7164 + "node_modules/safe-array-concat": { 7165 + "version": "1.1.3", 7166 + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 7167 + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 7168 + "dev": true, 7169 + "license": "MIT", 7170 + "dependencies": { 7171 + "call-bind": "^1.0.8", 7172 + "call-bound": "^1.0.2", 7173 + "get-intrinsic": "^1.2.6", 7174 + "has-symbols": "^1.1.0", 7175 + "isarray": "^2.0.5" 7176 + }, 7177 + "engines": { 7178 + "node": ">=0.4" 7179 + }, 7180 + "funding": { 7181 + "url": "https://github.com/sponsors/ljharb" 7182 + } 7183 + }, 7184 + "node_modules/safe-buffer": { 7185 + "version": "5.2.1", 7186 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 7187 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 7188 + "funding": [ 7189 + { 7190 + "type": "github", 7191 + "url": "https://github.com/sponsors/feross" 7192 + }, 7193 + { 7194 + "type": "patreon", 7195 + "url": "https://www.patreon.com/feross" 7196 + }, 7197 + { 7198 + "type": "consulting", 7199 + "url": "https://feross.org/support" 7200 + } 7201 + ], 7202 + "license": "MIT" 7203 + }, 7204 + "node_modules/safe-push-apply": { 7205 + "version": "1.0.0", 7206 + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 7207 + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 7208 + "dev": true, 7209 + "license": "MIT", 7210 + "dependencies": { 7211 + "es-errors": "^1.3.0", 7212 + "isarray": "^2.0.5" 7213 + }, 7214 + "engines": { 7215 + "node": ">= 0.4" 7216 + }, 7217 + "funding": { 7218 + "url": "https://github.com/sponsors/ljharb" 7219 + } 7220 + }, 7221 + "node_modules/safe-regex-test": { 7222 + "version": "1.1.0", 7223 + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 7224 + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 7225 + "dev": true, 7226 + "license": "MIT", 7227 + "dependencies": { 7228 + "call-bound": "^1.0.2", 7229 + "es-errors": "^1.3.0", 7230 + "is-regex": "^1.2.1" 7231 + }, 7232 + "engines": { 7233 + "node": ">= 0.4" 7234 + }, 7235 + "funding": { 7236 + "url": "https://github.com/sponsors/ljharb" 7237 + } 7238 + }, 7239 + "node_modules/safe-stable-stringify": { 7240 + "version": "2.5.0", 7241 + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", 7242 + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", 7243 + "license": "MIT", 7244 + "engines": { 7245 + "node": ">=10" 7246 + } 7247 + }, 7248 + "node_modules/safer-buffer": { 7249 + "version": "2.1.2", 7250 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 7251 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 7252 + "license": "MIT" 7253 + }, 7254 + "node_modules/scheduler": { 7255 + "version": "0.27.0", 7256 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", 7257 + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", 7258 + "license": "MIT" 7259 + }, 7260 + "node_modules/semver": { 7261 + "version": "6.3.1", 7262 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 7263 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 7264 + "dev": true, 7265 + "license": "ISC", 7266 + "bin": { 7267 + "semver": "bin/semver.js" 7268 + } 7269 + }, 7270 + "node_modules/send": { 7271 + "version": "0.19.0", 7272 + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 7273 + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 7274 + "license": "MIT", 7275 + "dependencies": { 7276 + "debug": "2.6.9", 7277 + "depd": "2.0.0", 7278 + "destroy": "1.2.0", 7279 + "encodeurl": "~1.0.2", 7280 + "escape-html": "~1.0.3", 7281 + "etag": "~1.8.1", 7282 + "fresh": "0.5.2", 7283 + "http-errors": "2.0.0", 7284 + "mime": "1.6.0", 7285 + "ms": "2.1.3", 7286 + "on-finished": "2.4.1", 7287 + "range-parser": "~1.2.1", 7288 + "statuses": "2.0.1" 7289 + }, 7290 + "engines": { 7291 + "node": ">= 0.8.0" 7292 + } 7293 + }, 7294 + "node_modules/send/node_modules/debug": { 7295 + "version": "2.6.9", 7296 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 7297 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 7298 + "license": "MIT", 7299 + "dependencies": { 7300 + "ms": "2.0.0" 7301 + } 7302 + }, 7303 + "node_modules/send/node_modules/debug/node_modules/ms": { 7304 + "version": "2.0.0", 7305 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 7306 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 7307 + "license": "MIT" 7308 + }, 7309 + "node_modules/send/node_modules/encodeurl": { 7310 + "version": "1.0.2", 7311 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 7312 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 7313 + "license": "MIT", 7314 + "engines": { 7315 + "node": ">= 0.8" 7316 + } 7317 + }, 7318 + "node_modules/serve-static": { 7319 + "version": "1.16.2", 7320 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 7321 + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 7322 + "license": "MIT", 7323 + "dependencies": { 7324 + "encodeurl": "~2.0.0", 7325 + "escape-html": "~1.0.3", 7326 + "parseurl": "~1.3.3", 7327 + "send": "0.19.0" 7328 + }, 7329 + "engines": { 7330 + "node": ">= 0.8.0" 7331 + } 7332 + }, 7333 + "node_modules/set-blocking": { 7334 + "version": "2.0.0", 7335 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 7336 + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 7337 + "license": "ISC" 7338 + }, 7339 + "node_modules/set-function-length": { 7340 + "version": "1.2.2", 7341 + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 7342 + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 7343 + "dev": true, 7344 + "license": "MIT", 7345 + "dependencies": { 7346 + "define-data-property": "^1.1.4", 7347 + "es-errors": "^1.3.0", 7348 + "function-bind": "^1.1.2", 7349 + "get-intrinsic": "^1.2.4", 7350 + "gopd": "^1.0.1", 7351 + "has-property-descriptors": "^1.0.2" 7352 + }, 7353 + "engines": { 7354 + "node": ">= 0.4" 7355 + } 7356 + }, 7357 + "node_modules/set-function-name": { 7358 + "version": "2.0.2", 7359 + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 7360 + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 7361 + "dev": true, 7362 + "license": "MIT", 7363 + "dependencies": { 7364 + "define-data-property": "^1.1.4", 7365 + "es-errors": "^1.3.0", 7366 + "functions-have-names": "^1.2.3", 7367 + "has-property-descriptors": "^1.0.2" 7368 + }, 7369 + "engines": { 7370 + "node": ">= 0.4" 7371 + } 7372 + }, 7373 + "node_modules/set-proto": { 7374 + "version": "1.0.0", 7375 + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 7376 + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 7377 + "dev": true, 7378 + "license": "MIT", 7379 + "dependencies": { 7380 + "dunder-proto": "^1.0.1", 7381 + "es-errors": "^1.3.0", 7382 + "es-object-atoms": "^1.0.0" 7383 + }, 7384 + "engines": { 7385 + "node": ">= 0.4" 7386 + } 7387 + }, 7388 + "node_modules/setprototypeof": { 7389 + "version": "1.2.0", 7390 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 7391 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 7392 + "license": "ISC" 7393 + }, 7394 + "node_modules/sharp": { 7395 + "version": "0.34.5", 7396 + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", 7397 + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", 7398 + "hasInstallScript": true, 7399 + "license": "Apache-2.0", 7400 + "optional": true, 7401 + "dependencies": { 7402 + "@img/colour": "^1.0.0", 7403 + "detect-libc": "^2.1.2", 7404 + "semver": "^7.7.3" 7405 + }, 7406 + "engines": { 7407 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 7408 + }, 7409 + "funding": { 7410 + "url": "https://opencollective.com/libvips" 7411 + }, 7412 + "optionalDependencies": { 7413 + "@img/sharp-darwin-arm64": "0.34.5", 7414 + "@img/sharp-darwin-x64": "0.34.5", 7415 + "@img/sharp-libvips-darwin-arm64": "1.2.4", 7416 + "@img/sharp-libvips-darwin-x64": "1.2.4", 7417 + "@img/sharp-libvips-linux-arm": "1.2.4", 7418 + "@img/sharp-libvips-linux-arm64": "1.2.4", 7419 + "@img/sharp-libvips-linux-ppc64": "1.2.4", 7420 + "@img/sharp-libvips-linux-riscv64": "1.2.4", 7421 + "@img/sharp-libvips-linux-s390x": "1.2.4", 7422 + "@img/sharp-libvips-linux-x64": "1.2.4", 7423 + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", 7424 + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", 7425 + "@img/sharp-linux-arm": "0.34.5", 7426 + "@img/sharp-linux-arm64": "0.34.5", 7427 + "@img/sharp-linux-ppc64": "0.34.5", 7428 + "@img/sharp-linux-riscv64": "0.34.5", 7429 + "@img/sharp-linux-s390x": "0.34.5", 7430 + "@img/sharp-linux-x64": "0.34.5", 7431 + "@img/sharp-linuxmusl-arm64": "0.34.5", 7432 + "@img/sharp-linuxmusl-x64": "0.34.5", 7433 + "@img/sharp-wasm32": "0.34.5", 7434 + "@img/sharp-win32-arm64": "0.34.5", 7435 + "@img/sharp-win32-ia32": "0.34.5", 7436 + "@img/sharp-win32-x64": "0.34.5" 7437 + } 7438 + }, 7439 + "node_modules/sharp/node_modules/semver": { 7440 + "version": "7.7.3", 7441 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 7442 + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 7443 + "license": "ISC", 7444 + "optional": true, 7445 + "bin": { 7446 + "semver": "bin/semver.js" 7447 + }, 7448 + "engines": { 7449 + "node": ">=10" 7450 + } 7451 + }, 7452 + "node_modules/shebang-command": { 7453 + "version": "2.0.0", 7454 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 7455 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 7456 + "dev": true, 7457 + "license": "MIT", 7458 + "dependencies": { 7459 + "shebang-regex": "^3.0.0" 7460 + }, 7461 + "engines": { 7462 + "node": ">=8" 7463 + } 7464 + }, 7465 + "node_modules/shebang-regex": { 7466 + "version": "3.0.0", 7467 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 7468 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 7469 + "dev": true, 7470 + "license": "MIT", 7471 + "engines": { 7472 + "node": ">=8" 7473 + } 7474 + }, 7475 + "node_modules/side-channel": { 7476 + "version": "1.1.0", 7477 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 7478 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 7479 + "license": "MIT", 7480 + "dependencies": { 7481 + "es-errors": "^1.3.0", 7482 + "object-inspect": "^1.13.3", 7483 + "side-channel-list": "^1.0.0", 7484 + "side-channel-map": "^1.0.1", 7485 + "side-channel-weakmap": "^1.0.2" 7486 + }, 7487 + "engines": { 7488 + "node": ">= 0.4" 7489 + }, 7490 + "funding": { 7491 + "url": "https://github.com/sponsors/ljharb" 7492 + } 7493 + }, 7494 + "node_modules/side-channel-list": { 7495 + "version": "1.0.0", 7496 + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 7497 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 7498 + "license": "MIT", 7499 + "dependencies": { 7500 + "es-errors": "^1.3.0", 7501 + "object-inspect": "^1.13.3" 7502 + }, 7503 + "engines": { 7504 + "node": ">= 0.4" 7505 + }, 7506 + "funding": { 7507 + "url": "https://github.com/sponsors/ljharb" 7508 + } 7509 + }, 7510 + "node_modules/side-channel-map": { 7511 + "version": "1.0.1", 7512 + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 7513 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 7514 + "license": "MIT", 7515 + "dependencies": { 7516 + "call-bound": "^1.0.2", 7517 + "es-errors": "^1.3.0", 7518 + "get-intrinsic": "^1.2.5", 7519 + "object-inspect": "^1.13.3" 7520 + }, 7521 + "engines": { 7522 + "node": ">= 0.4" 7523 + }, 7524 + "funding": { 7525 + "url": "https://github.com/sponsors/ljharb" 7526 + } 7527 + }, 7528 + "node_modules/side-channel-weakmap": { 7529 + "version": "1.0.2", 7530 + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 7531 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 7532 + "license": "MIT", 7533 + "dependencies": { 7534 + "call-bound": "^1.0.2", 7535 + "es-errors": "^1.3.0", 7536 + "get-intrinsic": "^1.2.5", 7537 + "object-inspect": "^1.13.3", 7538 + "side-channel-map": "^1.0.1" 7539 + }, 7540 + "engines": { 7541 + "node": ">= 0.4" 7542 + }, 7543 + "funding": { 7544 + "url": "https://github.com/sponsors/ljharb" 7545 + } 7546 + }, 7547 + "node_modules/sonic-boom": { 7548 + "version": "3.8.1", 7549 + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", 7550 + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 7551 + "license": "MIT", 7552 + "dependencies": { 7553 + "atomic-sleep": "^1.0.0" 7554 + } 7555 + }, 7556 + "node_modules/source-map-js": { 7557 + "version": "1.2.1", 7558 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 7559 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 7560 + "license": "BSD-3-Clause", 7561 + "engines": { 7562 + "node": ">=0.10.0" 7563 + } 7564 + }, 7565 + "node_modules/split2": { 7566 + "version": "4.2.0", 7567 + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 7568 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 7569 + "license": "ISC", 7570 + "engines": { 7571 + "node": ">= 10.x" 7572 + } 7573 + }, 7574 + "node_modules/stable-hash": { 7575 + "version": "0.0.5", 7576 + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", 7577 + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", 7578 + "dev": true, 7579 + "license": "MIT" 7580 + }, 7581 + "node_modules/statuses": { 7582 + "version": "2.0.1", 7583 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 7584 + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 7585 + "license": "MIT", 7586 + "engines": { 7587 + "node": ">= 0.8" 7588 + } 7589 + }, 7590 + "node_modules/stop-iteration-iterator": { 7591 + "version": "1.1.0", 7592 + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", 7593 + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", 7594 + "dev": true, 7595 + "license": "MIT", 7596 + "dependencies": { 7597 + "es-errors": "^1.3.0", 7598 + "internal-slot": "^1.1.0" 7599 + }, 7600 + "engines": { 7601 + "node": ">= 0.4" 7602 + } 7603 + }, 7604 + "node_modules/string_decoder": { 7605 + "version": "1.3.0", 7606 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 7607 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 7608 + "license": "MIT", 7609 + "dependencies": { 7610 + "safe-buffer": "~5.2.0" 7611 + } 7612 + }, 7613 + "node_modules/string-width": { 7614 + "version": "4.2.3", 7615 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 7616 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 7617 + "license": "MIT", 7618 + "dependencies": { 7619 + "emoji-regex": "^8.0.0", 7620 + "is-fullwidth-code-point": "^3.0.0", 7621 + "strip-ansi": "^6.0.1" 7622 + }, 7623 + "engines": { 7624 + "node": ">=8" 7625 + } 7626 + }, 7627 + "node_modules/string-width/node_modules/emoji-regex": { 7628 + "version": "8.0.0", 7629 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 7630 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 7631 + "license": "MIT" 7632 + }, 7633 + "node_modules/string.prototype.includes": { 7634 + "version": "2.0.1", 7635 + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", 7636 + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", 7637 + "dev": true, 7638 + "license": "MIT", 7639 + "dependencies": { 7640 + "call-bind": "^1.0.7", 7641 + "define-properties": "^1.2.1", 7642 + "es-abstract": "^1.23.3" 7643 + }, 7644 + "engines": { 7645 + "node": ">= 0.4" 7646 + } 7647 + }, 7648 + "node_modules/string.prototype.matchall": { 7649 + "version": "4.0.12", 7650 + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", 7651 + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", 7652 + "dev": true, 7653 + "license": "MIT", 7654 + "dependencies": { 7655 + "call-bind": "^1.0.8", 7656 + "call-bound": "^1.0.3", 7657 + "define-properties": "^1.2.1", 7658 + "es-abstract": "^1.23.6", 7659 + "es-errors": "^1.3.0", 7660 + "es-object-atoms": "^1.0.0", 7661 + "get-intrinsic": "^1.2.6", 7662 + "gopd": "^1.2.0", 7663 + "has-symbols": "^1.1.0", 7664 + "internal-slot": "^1.1.0", 7665 + "regexp.prototype.flags": "^1.5.3", 7666 + "set-function-name": "^2.0.2", 7667 + "side-channel": "^1.1.0" 7668 + }, 7669 + "engines": { 7670 + "node": ">= 0.4" 7671 + }, 7672 + "funding": { 7673 + "url": "https://github.com/sponsors/ljharb" 7674 + } 7675 + }, 7676 + "node_modules/string.prototype.repeat": { 7677 + "version": "1.0.0", 7678 + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", 7679 + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", 7680 + "dev": true, 7681 + "license": "MIT", 7682 + "dependencies": { 7683 + "define-properties": "^1.1.3", 7684 + "es-abstract": "^1.17.5" 7685 + } 7686 + }, 7687 + "node_modules/string.prototype.trim": { 7688 + "version": "1.2.10", 7689 + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 7690 + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 7691 + "dev": true, 7692 + "license": "MIT", 7693 + "dependencies": { 7694 + "call-bind": "^1.0.8", 7695 + "call-bound": "^1.0.2", 7696 + "define-data-property": "^1.1.4", 7697 + "define-properties": "^1.2.1", 7698 + "es-abstract": "^1.23.5", 7699 + "es-object-atoms": "^1.0.0", 7700 + "has-property-descriptors": "^1.0.2" 7701 + }, 7702 + "engines": { 7703 + "node": ">= 0.4" 7704 + }, 7705 + "funding": { 7706 + "url": "https://github.com/sponsors/ljharb" 7707 + } 7708 + }, 7709 + "node_modules/string.prototype.trimend": { 7710 + "version": "1.0.9", 7711 + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 7712 + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 7713 + "dev": true, 7714 + "license": "MIT", 7715 + "dependencies": { 7716 + "call-bind": "^1.0.8", 7717 + "call-bound": "^1.0.2", 7718 + "define-properties": "^1.2.1", 7719 + "es-object-atoms": "^1.0.0" 7720 + }, 7721 + "engines": { 7722 + "node": ">= 0.4" 7723 + }, 7724 + "funding": { 7725 + "url": "https://github.com/sponsors/ljharb" 7726 + } 7727 + }, 7728 + "node_modules/string.prototype.trimstart": { 7729 + "version": "1.0.8", 7730 + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 7731 + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 7732 + "dev": true, 7733 + "license": "MIT", 7734 + "dependencies": { 7735 + "call-bind": "^1.0.7", 7736 + "define-properties": "^1.2.1", 7737 + "es-object-atoms": "^1.0.0" 7738 + }, 7739 + "engines": { 7740 + "node": ">= 0.4" 7741 + }, 7742 + "funding": { 7743 + "url": "https://github.com/sponsors/ljharb" 7744 + } 7745 + }, 7746 + "node_modules/strip-ansi": { 7747 + "version": "6.0.1", 7748 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 7749 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 7750 + "license": "MIT", 7751 + "dependencies": { 7752 + "ansi-regex": "^5.0.1" 7753 + }, 7754 + "engines": { 7755 + "node": ">=8" 7756 + } 7757 + }, 7758 + "node_modules/strip-bom": { 7759 + "version": "3.0.0", 7760 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 7761 + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 7762 + "dev": true, 7763 + "license": "MIT", 7764 + "engines": { 7765 + "node": ">=4" 7766 + } 7767 + }, 7768 + "node_modules/strip-json-comments": { 7769 + "version": "3.1.1", 7770 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 7771 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 7772 + "dev": true, 7773 + "license": "MIT", 7774 + "engines": { 7775 + "node": ">=8" 7776 + }, 7777 + "funding": { 7778 + "url": "https://github.com/sponsors/sindresorhus" 7779 + } 7780 + }, 7781 + "node_modules/styled-jsx": { 7782 + "version": "5.1.6", 7783 + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", 7784 + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", 7785 + "license": "MIT", 7786 + "dependencies": { 7787 + "client-only": "0.0.1" 7788 + }, 7789 + "engines": { 7790 + "node": ">= 12.0.0" 7791 + }, 7792 + "peerDependencies": { 7793 + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" 7794 + }, 7795 + "peerDependenciesMeta": { 7796 + "@babel/core": { 7797 + "optional": true 7798 + }, 7799 + "babel-plugin-macros": { 7800 + "optional": true 7801 + } 7802 + } 7803 + }, 7804 + "node_modules/supports-color": { 7805 + "version": "7.2.0", 7806 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 7807 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 7808 + "dev": true, 7809 + "license": "MIT", 7810 + "dependencies": { 7811 + "has-flag": "^4.0.0" 7812 + }, 7813 + "engines": { 7814 + "node": ">=8" 7815 + } 7816 + }, 7817 + "node_modules/supports-preserve-symlinks-flag": { 7818 + "version": "1.0.0", 7819 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 7820 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 7821 + "dev": true, 7822 + "license": "MIT", 7823 + "engines": { 7824 + "node": ">= 0.4" 7825 + }, 7826 + "funding": { 7827 + "url": "https://github.com/sponsors/ljharb" 7828 + } 7829 + }, 7830 + "node_modules/tailwind-merge": { 7831 + "version": "3.4.0", 7832 + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", 7833 + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", 7834 + "license": "MIT", 7835 + "funding": { 7836 + "type": "github", 7837 + "url": "https://github.com/sponsors/dcastil" 7838 + } 7839 + }, 7840 + "node_modules/tailwindcss": { 7841 + "version": "4.1.17", 7842 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", 7843 + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", 7844 + "dev": true, 7845 + "license": "MIT" 7846 + }, 7847 + "node_modules/tapable": { 7848 + "version": "2.3.0", 7849 + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 7850 + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 7851 + "dev": true, 7852 + "license": "MIT", 7853 + "engines": { 7854 + "node": ">=6" 7855 + }, 7856 + "funding": { 7857 + "type": "opencollective", 7858 + "url": "https://opencollective.com/webpack" 7859 + } 7860 + }, 7861 + "node_modules/thread-stream": { 7862 + "version": "2.7.0", 7863 + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", 7864 + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 7865 + "license": "MIT", 7866 + "dependencies": { 7867 + "real-require": "^0.2.0" 7868 + } 7869 + }, 7870 + "node_modules/tinyglobby": { 7871 + "version": "0.2.15", 7872 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 7873 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 7874 + "dev": true, 7875 + "license": "MIT", 7876 + "dependencies": { 7877 + "fdir": "^6.5.0", 7878 + "picomatch": "^4.0.3" 7879 + }, 7880 + "engines": { 7881 + "node": ">=12.0.0" 7882 + }, 7883 + "funding": { 7884 + "url": "https://github.com/sponsors/SuperchupuDev" 7885 + } 7886 + }, 7887 + "node_modules/tinyglobby/node_modules/fdir": { 7888 + "version": "6.5.0", 7889 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 7890 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 7891 + "dev": true, 7892 + "license": "MIT", 7893 + "engines": { 7894 + "node": ">=12.0.0" 7895 + }, 7896 + "peerDependencies": { 7897 + "picomatch": "^3 || ^4" 7898 + }, 7899 + "peerDependenciesMeta": { 7900 + "picomatch": { 7901 + "optional": true 7902 + } 7903 + } 7904 + }, 7905 + "node_modules/tinyglobby/node_modules/picomatch": { 7906 + "version": "4.0.3", 7907 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 7908 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 7909 + "dev": true, 7910 + "license": "MIT", 7911 + "engines": { 7912 + "node": ">=12" 7913 + }, 7914 + "funding": { 7915 + "url": "https://github.com/sponsors/jonschlinkert" 7916 + } 7917 + }, 7918 + "node_modules/tlds": { 7919 + "version": "1.261.0", 7920 + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", 7921 + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", 7922 + "license": "MIT", 7923 + "bin": { 7924 + "tlds": "bin.js" 7925 + } 7926 + }, 7927 + "node_modules/to-regex-range": { 7928 + "version": "5.0.1", 7929 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 7930 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 7931 + "dev": true, 7932 + "license": "MIT", 7933 + "dependencies": { 7934 + "is-number": "^7.0.0" 7935 + }, 7936 + "engines": { 7937 + "node": ">=8.0" 7938 + } 7939 + }, 7940 + "node_modules/toidentifier": { 7941 + "version": "1.0.1", 7942 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 7943 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 7944 + "license": "MIT", 7945 + "engines": { 7946 + "node": ">=0.6" 7947 + } 7948 + }, 7949 + "node_modules/ts-api-utils": { 7950 + "version": "2.1.0", 7951 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", 7952 + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 7953 + "dev": true, 7954 + "license": "MIT", 7955 + "engines": { 7956 + "node": ">=18.12" 7957 + }, 7958 + "peerDependencies": { 7959 + "typescript": ">=4.8.4" 7960 + } 7961 + }, 7962 + "node_modules/ts-morph": { 7963 + "version": "24.0.0", 7964 + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-24.0.0.tgz", 7965 + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", 7966 + "dev": true, 7967 + "license": "MIT", 7968 + "dependencies": { 7969 + "@ts-morph/common": "~0.25.0", 7970 + "code-block-writer": "^13.0.3" 7971 + } 7972 + }, 7973 + "node_modules/tsconfig-paths": { 7974 + "version": "3.15.0", 7975 + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", 7976 + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", 7977 + "dev": true, 7978 + "license": "MIT", 7979 + "dependencies": { 7980 + "@types/json5": "^0.0.29", 7981 + "json5": "^1.0.2", 7982 + "minimist": "^1.2.6", 7983 + "strip-bom": "^3.0.0" 7984 + } 7985 + }, 7986 + "node_modules/tsconfig-paths/node_modules/json5": { 7987 + "version": "1.0.2", 7988 + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", 7989 + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", 7990 + "dev": true, 7991 + "license": "MIT", 7992 + "dependencies": { 7993 + "minimist": "^1.2.0" 7994 + }, 7995 + "bin": { 7996 + "json5": "lib/cli.js" 7997 + } 7998 + }, 7999 + "node_modules/tslib": { 8000 + "version": "2.8.1", 8001 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 8002 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 8003 + "license": "0BSD" 8004 + }, 8005 + "node_modules/type-check": { 8006 + "version": "0.4.0", 8007 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 8008 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 8009 + "dev": true, 8010 + "license": "MIT", 8011 + "dependencies": { 8012 + "prelude-ls": "^1.2.1" 8013 + }, 8014 + "engines": { 8015 + "node": ">= 0.8.0" 8016 + } 8017 + }, 8018 + "node_modules/type-is": { 8019 + "version": "1.6.18", 8020 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 8021 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 8022 + "license": "MIT", 8023 + "dependencies": { 8024 + "media-typer": "0.3.0", 8025 + "mime-types": "~2.1.24" 8026 + }, 8027 + "engines": { 8028 + "node": ">= 0.6" 8029 + } 8030 + }, 8031 + "node_modules/typed-array-buffer": { 8032 + "version": "1.0.3", 8033 + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 8034 + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 8035 + "dev": true, 8036 + "license": "MIT", 8037 + "dependencies": { 8038 + "call-bound": "^1.0.3", 8039 + "es-errors": "^1.3.0", 8040 + "is-typed-array": "^1.1.14" 8041 + }, 8042 + "engines": { 8043 + "node": ">= 0.4" 8044 + } 8045 + }, 8046 + "node_modules/typed-array-byte-length": { 8047 + "version": "1.0.3", 8048 + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 8049 + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 8050 + "dev": true, 8051 + "license": "MIT", 8052 + "dependencies": { 8053 + "call-bind": "^1.0.8", 8054 + "for-each": "^0.3.3", 8055 + "gopd": "^1.2.0", 8056 + "has-proto": "^1.2.0", 8057 + "is-typed-array": "^1.1.14" 8058 + }, 8059 + "engines": { 8060 + "node": ">= 0.4" 8061 + }, 8062 + "funding": { 8063 + "url": "https://github.com/sponsors/ljharb" 8064 + } 8065 + }, 8066 + "node_modules/typed-array-byte-offset": { 8067 + "version": "1.0.4", 8068 + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 8069 + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 8070 + "dev": true, 8071 + "license": "MIT", 8072 + "dependencies": { 8073 + "available-typed-arrays": "^1.0.7", 8074 + "call-bind": "^1.0.8", 8075 + "for-each": "^0.3.3", 8076 + "gopd": "^1.2.0", 8077 + "has-proto": "^1.2.0", 8078 + "is-typed-array": "^1.1.15", 8079 + "reflect.getprototypeof": "^1.0.9" 8080 + }, 8081 + "engines": { 8082 + "node": ">= 0.4" 8083 + }, 8084 + "funding": { 8085 + "url": "https://github.com/sponsors/ljharb" 8086 + } 8087 + }, 8088 + "node_modules/typed-array-length": { 8089 + "version": "1.0.7", 8090 + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 8091 + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 8092 + "dev": true, 8093 + "license": "MIT", 8094 + "dependencies": { 8095 + "call-bind": "^1.0.7", 8096 + "for-each": "^0.3.3", 8097 + "gopd": "^1.0.1", 8098 + "is-typed-array": "^1.1.13", 8099 + "possible-typed-array-names": "^1.0.0", 8100 + "reflect.getprototypeof": "^1.0.6" 8101 + }, 8102 + "engines": { 8103 + "node": ">= 0.4" 8104 + }, 8105 + "funding": { 8106 + "url": "https://github.com/sponsors/ljharb" 8107 + } 8108 + }, 8109 + "node_modules/typescript": { 8110 + "version": "5.9.3", 8111 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 8112 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 8113 + "dev": true, 8114 + "license": "Apache-2.0", 8115 + "bin": { 8116 + "tsc": "bin/tsc", 8117 + "tsserver": "bin/tsserver" 8118 + }, 8119 + "engines": { 8120 + "node": ">=14.17" 8121 + } 8122 + }, 8123 + "node_modules/typescript-eslint": { 8124 + "version": "8.46.4", 8125 + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.4.tgz", 8126 + "integrity": "sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==", 8127 + "dev": true, 8128 + "license": "MIT", 8129 + "dependencies": { 8130 + "@typescript-eslint/eslint-plugin": "8.46.4", 8131 + "@typescript-eslint/parser": "8.46.4", 8132 + "@typescript-eslint/typescript-estree": "8.46.4", 8133 + "@typescript-eslint/utils": "8.46.4" 8134 + }, 8135 + "engines": { 8136 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 8137 + }, 8138 + "funding": { 8139 + "type": "opencollective", 8140 + "url": "https://opencollective.com/typescript-eslint" 8141 + }, 8142 + "peerDependencies": { 8143 + "eslint": "^8.57.0 || ^9.0.0", 8144 + "typescript": ">=4.8.4 <6.0.0" 8145 + } 8146 + }, 8147 + "node_modules/uint8arrays": { 8148 + "version": "3.0.0", 8149 + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 8150 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 8151 + "license": "MIT", 8152 + "dependencies": { 8153 + "multiformats": "^9.4.2" 8154 + } 8155 + }, 8156 + "node_modules/unbox-primitive": { 8157 + "version": "1.1.0", 8158 + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 8159 + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 8160 + "dev": true, 8161 + "license": "MIT", 8162 + "dependencies": { 8163 + "call-bound": "^1.0.3", 8164 + "has-bigints": "^1.0.2", 8165 + "has-symbols": "^1.1.0", 8166 + "which-boxed-primitive": "^1.1.1" 8167 + }, 8168 + "engines": { 8169 + "node": ">= 0.4" 8170 + }, 8171 + "funding": { 8172 + "url": "https://github.com/sponsors/ljharb" 8173 + } 8174 + }, 8175 + "node_modules/undici": { 8176 + "version": "6.22.0", 8177 + "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", 8178 + "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", 8179 + "license": "MIT", 8180 + "engines": { 8181 + "node": ">=18.17" 8182 + } 8183 + }, 8184 + "node_modules/undici-types": { 8185 + "version": "7.16.0", 8186 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", 8187 + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", 8188 + "dev": true, 8189 + "license": "MIT" 8190 + }, 8191 + "node_modules/unpipe": { 8192 + "version": "1.0.0", 8193 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 8194 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 8195 + "license": "MIT", 8196 + "engines": { 8197 + "node": ">= 0.8" 8198 + } 8199 + }, 8200 + "node_modules/unrs-resolver": { 8201 + "version": "1.11.1", 8202 + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", 8203 + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", 8204 + "dev": true, 8205 + "hasInstallScript": true, 8206 + "license": "MIT", 8207 + "dependencies": { 8208 + "napi-postinstall": "^0.3.0" 8209 + }, 8210 + "funding": { 8211 + "url": "https://opencollective.com/unrs-resolver" 8212 + }, 8213 + "optionalDependencies": { 8214 + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", 8215 + "@unrs/resolver-binding-android-arm64": "1.11.1", 8216 + "@unrs/resolver-binding-darwin-arm64": "1.11.1", 8217 + "@unrs/resolver-binding-darwin-x64": "1.11.1", 8218 + "@unrs/resolver-binding-freebsd-x64": "1.11.1", 8219 + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", 8220 + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", 8221 + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", 8222 + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", 8223 + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", 8224 + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", 8225 + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", 8226 + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", 8227 + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", 8228 + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", 8229 + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", 8230 + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", 8231 + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", 8232 + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" 8233 + } 8234 + }, 8235 + "node_modules/update-browserslist-db": { 8236 + "version": "1.1.4", 8237 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", 8238 + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", 8239 + "dev": true, 8240 + "funding": [ 8241 + { 8242 + "type": "opencollective", 8243 + "url": "https://opencollective.com/browserslist" 8244 + }, 8245 + { 8246 + "type": "tidelift", 8247 + "url": "https://tidelift.com/funding/github/npm/browserslist" 8248 + }, 8249 + { 8250 + "type": "github", 8251 + "url": "https://github.com/sponsors/ai" 8252 + } 8253 + ], 8254 + "license": "MIT", 8255 + "dependencies": { 8256 + "escalade": "^3.2.0", 8257 + "picocolors": "^1.1.1" 8258 + }, 8259 + "bin": { 8260 + "update-browserslist-db": "cli.js" 8261 + }, 8262 + "peerDependencies": { 8263 + "browserslist": ">= 4.21.0" 8264 + } 8265 + }, 8266 + "node_modules/uri-js": { 8267 + "version": "4.4.1", 8268 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 8269 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 8270 + "dev": true, 8271 + "license": "BSD-2-Clause", 8272 + "dependencies": { 8273 + "punycode": "^2.1.0" 8274 + } 8275 + }, 8276 + "node_modules/utils-merge": { 8277 + "version": "1.0.1", 8278 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 8279 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 8280 + "license": "MIT", 8281 + "engines": { 8282 + "node": ">= 0.4.0" 8283 + } 8284 + }, 8285 + "node_modules/uuid": { 8286 + "version": "13.0.0", 8287 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", 8288 + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", 8289 + "funding": [ 8290 + "https://github.com/sponsors/broofa", 8291 + "https://github.com/sponsors/ctavan" 8292 + ], 8293 + "license": "MIT", 8294 + "bin": { 8295 + "uuid": "dist-node/bin/uuid" 8296 + } 8297 + }, 8298 + "node_modules/vary": { 8299 + "version": "1.1.2", 8300 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 8301 + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 8302 + "license": "MIT", 8303 + "engines": { 8304 + "node": ">= 0.8" 8305 + } 8306 + }, 8307 + "node_modules/which": { 8308 + "version": "2.0.2", 8309 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 8310 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 8311 + "dev": true, 8312 + "license": "ISC", 8313 + "dependencies": { 8314 + "isexe": "^2.0.0" 8315 + }, 8316 + "bin": { 8317 + "node-which": "bin/node-which" 8318 + }, 8319 + "engines": { 8320 + "node": ">= 8" 8321 + } 8322 + }, 8323 + "node_modules/which-boxed-primitive": { 8324 + "version": "1.1.1", 8325 + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 8326 + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 8327 + "dev": true, 8328 + "license": "MIT", 8329 + "dependencies": { 8330 + "is-bigint": "^1.1.0", 8331 + "is-boolean-object": "^1.2.1", 8332 + "is-number-object": "^1.1.1", 8333 + "is-string": "^1.1.1", 8334 + "is-symbol": "^1.1.1" 8335 + }, 8336 + "engines": { 8337 + "node": ">= 0.4" 8338 + }, 8339 + "funding": { 8340 + "url": "https://github.com/sponsors/ljharb" 8341 + } 8342 + }, 8343 + "node_modules/which-builtin-type": { 8344 + "version": "1.2.1", 8345 + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 8346 + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 8347 + "dev": true, 8348 + "license": "MIT", 8349 + "dependencies": { 8350 + "call-bound": "^1.0.2", 8351 + "function.prototype.name": "^1.1.6", 8352 + "has-tostringtag": "^1.0.2", 8353 + "is-async-function": "^2.0.0", 8354 + "is-date-object": "^1.1.0", 8355 + "is-finalizationregistry": "^1.1.0", 8356 + "is-generator-function": "^1.0.10", 8357 + "is-regex": "^1.2.1", 8358 + "is-weakref": "^1.0.2", 8359 + "isarray": "^2.0.5", 8360 + "which-boxed-primitive": "^1.1.0", 8361 + "which-collection": "^1.0.2", 8362 + "which-typed-array": "^1.1.16" 8363 + }, 8364 + "engines": { 8365 + "node": ">= 0.4" 8366 + }, 8367 + "funding": { 8368 + "url": "https://github.com/sponsors/ljharb" 8369 + } 8370 + }, 8371 + "node_modules/which-collection": { 8372 + "version": "1.0.2", 8373 + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 8374 + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 8375 + "dev": true, 8376 + "license": "MIT", 8377 + "dependencies": { 8378 + "is-map": "^2.0.3", 8379 + "is-set": "^2.0.3", 8380 + "is-weakmap": "^2.0.2", 8381 + "is-weakset": "^2.0.3" 8382 + }, 8383 + "engines": { 8384 + "node": ">= 0.4" 8385 + }, 8386 + "funding": { 8387 + "url": "https://github.com/sponsors/ljharb" 8388 + } 8389 + }, 8390 + "node_modules/which-module": { 8391 + "version": "2.0.1", 8392 + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", 8393 + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", 8394 + "license": "ISC" 8395 + }, 8396 + "node_modules/which-typed-array": { 8397 + "version": "1.1.19", 8398 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", 8399 + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", 8400 + "dev": true, 8401 + "license": "MIT", 8402 + "dependencies": { 8403 + "available-typed-arrays": "^1.0.7", 8404 + "call-bind": "^1.0.8", 8405 + "call-bound": "^1.0.4", 8406 + "for-each": "^0.3.5", 8407 + "get-proto": "^1.0.1", 8408 + "gopd": "^1.2.0", 8409 + "has-tostringtag": "^1.0.2" 8410 + }, 8411 + "engines": { 8412 + "node": ">= 0.4" 8413 + }, 8414 + "funding": { 8415 + "url": "https://github.com/sponsors/ljharb" 8416 + } 8417 + }, 8418 + "node_modules/word-wrap": { 8419 + "version": "1.2.5", 8420 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 8421 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 8422 + "dev": true, 8423 + "license": "MIT", 8424 + "engines": { 8425 + "node": ">=0.10.0" 8426 + } 8427 + }, 8428 + "node_modules/wrap-ansi": { 8429 + "version": "6.2.0", 8430 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 8431 + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 8432 + "license": "MIT", 8433 + "dependencies": { 8434 + "ansi-styles": "^4.0.0", 8435 + "string-width": "^4.1.0", 8436 + "strip-ansi": "^6.0.0" 8437 + }, 8438 + "engines": { 8439 + "node": ">=8" 8440 + } 8441 + }, 8442 + "node_modules/ws": { 8443 + "version": "8.18.3", 8444 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", 8445 + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", 8446 + "license": "MIT", 8447 + "engines": { 8448 + "node": ">=10.0.0" 8449 + }, 8450 + "peerDependencies": { 8451 + "bufferutil": "^4.0.1", 8452 + "utf-8-validate": ">=5.0.2" 8453 + }, 8454 + "peerDependenciesMeta": { 8455 + "bufferutil": { 8456 + "optional": true 8457 + }, 8458 + "utf-8-validate": { 8459 + "optional": true 8460 + } 8461 + } 8462 + }, 8463 + "node_modules/y18n": { 8464 + "version": "4.0.3", 8465 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 8466 + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 8467 + "license": "ISC" 8468 + }, 8469 + "node_modules/yallist": { 8470 + "version": "3.1.1", 8471 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 8472 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 8473 + "dev": true, 8474 + "license": "ISC" 8475 + }, 8476 + "node_modules/yargs": { 8477 + "version": "15.4.1", 8478 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 8479 + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 8480 + "license": "MIT", 8481 + "dependencies": { 8482 + "cliui": "^6.0.0", 8483 + "decamelize": "^1.2.0", 8484 + "find-up": "^4.1.0", 8485 + "get-caller-file": "^2.0.1", 8486 + "require-directory": "^2.1.1", 8487 + "require-main-filename": "^2.0.0", 8488 + "set-blocking": "^2.0.0", 8489 + "string-width": "^4.2.0", 8490 + "which-module": "^2.0.0", 8491 + "y18n": "^4.0.0", 8492 + "yargs-parser": "^18.1.2" 8493 + }, 8494 + "engines": { 8495 + "node": ">=8" 8496 + } 8497 + }, 8498 + "node_modules/yargs-parser": { 8499 + "version": "18.1.3", 8500 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 8501 + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 8502 + "license": "ISC", 8503 + "dependencies": { 8504 + "camelcase": "^5.0.0", 8505 + "decamelize": "^1.2.0" 8506 + }, 8507 + "engines": { 8508 + "node": ">=6" 8509 + } 8510 + }, 8511 + "node_modules/yargs/node_modules/find-up": { 8512 + "version": "4.1.0", 8513 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 8514 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 8515 + "license": "MIT", 8516 + "dependencies": { 8517 + "locate-path": "^5.0.0", 8518 + "path-exists": "^4.0.0" 8519 + }, 8520 + "engines": { 8521 + "node": ">=8" 8522 + } 8523 + }, 8524 + "node_modules/yargs/node_modules/locate-path": { 8525 + "version": "5.0.0", 8526 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 8527 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 8528 + "license": "MIT", 8529 + "dependencies": { 8530 + "p-locate": "^4.1.0" 8531 + }, 8532 + "engines": { 8533 + "node": ">=8" 8534 + } 8535 + }, 8536 + "node_modules/yargs/node_modules/p-limit": { 8537 + "version": "2.3.0", 8538 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 8539 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 8540 + "license": "MIT", 8541 + "dependencies": { 8542 + "p-try": "^2.0.0" 8543 + }, 8544 + "engines": { 8545 + "node": ">=6" 8546 + }, 8547 + "funding": { 8548 + "url": "https://github.com/sponsors/sindresorhus" 8549 + } 8550 + }, 8551 + "node_modules/yargs/node_modules/p-locate": { 8552 + "version": "4.1.0", 8553 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 8554 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 8555 + "license": "MIT", 8556 + "dependencies": { 8557 + "p-limit": "^2.2.0" 8558 + }, 8559 + "engines": { 8560 + "node": ">=8" 8561 + } 8562 + }, 8563 + "node_modules/yesno": { 8564 + "version": "0.4.0", 8565 + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", 8566 + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", 8567 + "dev": true, 8568 + "license": "BSD" 8569 + }, 8570 + "node_modules/yocto-queue": { 8571 + "version": "0.1.0", 8572 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 8573 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 8574 + "dev": true, 8575 + "license": "MIT", 8576 + "engines": { 8577 + "node": ">=10" 8578 + }, 8579 + "funding": { 8580 + "url": "https://github.com/sponsors/sindresorhus" 8581 + } 8582 + }, 8583 + "node_modules/zod": { 8584 + "version": "4.1.12", 8585 + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", 8586 + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", 8587 + "license": "MIT", 8588 + "funding": { 8589 + "url": "https://github.com/sponsors/colinhacks" 8590 + } 8591 + }, 8592 + "node_modules/zod-validation-error": { 8593 + "version": "4.0.2", 8594 + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", 8595 + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", 8596 + "dev": true, 8597 + "license": "MIT", 8598 + "engines": { 8599 + "node": ">=18.0.0" 8600 + }, 8601 + "peerDependencies": { 8602 + "zod": "^3.25.0 || ^4.0.0" 8603 + } 8604 + } 8605 + } 8606 + }
+49
package.json
··· 1 + { 2 + "name": "at-lanyard", 3 + "version": "0.1.0", 4 + "private": true, 5 + "scripts": { 6 + "dev": "next dev", 7 + "build": "npm run lex:gen && next build", 8 + "start": "next start", 9 + "lint": "next lint", 10 + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"", 11 + "lex:gen": "lex gen-api ./src/types/generated ./lexicons/**/*.json", 12 + "lex:watch": "lex gen-api --watch ./src/types/generated ./lexicons/**/*.json" 13 + }, 14 + "dependencies": { 15 + "next": "latest", 16 + "react": "latest", 17 + "react-dom": "latest", 18 + "@atproto/api": "latest", 19 + "@atproto/common": "latest", 20 + "@atproto/identity": "latest", 21 + "@atproto/lexicon": "latest", 22 + "@atproto/oauth-client-node": "latest", 23 + "@atproto/syntax": "latest", 24 + "@atproto/xrpc-server": "latest", 25 + "zod": "latest", 26 + "uuid": "latest", 27 + "cors": "latest", 28 + "dotenv": "latest", 29 + "qrcode": "latest", 30 + "clsx": "latest", 31 + "tailwind-merge": "latest" 32 + }, 33 + "devDependencies": { 34 + "@atproto/lex-cli": "latest", 35 + "@types/node": "latest", 36 + "@types/react": "latest", 37 + "@types/react-dom": "latest", 38 + "@types/uuid": "latest", 39 + "@types/cors": "latest", 40 + "@types/qrcode": "latest", 41 + "typescript": "latest", 42 + "eslint": "latest", 43 + "eslint-config-next": "latest", 44 + "prettier": "latest", 45 + "tailwindcss": "latest", 46 + "@tailwindcss/postcss": "latest", 47 + "postcss": "latest" 48 + } 49 + }
+8
postcss.config.mjs
··· 1 + /** @type {import('postcss-load-config').Config} */ 2 + const config = { 3 + plugins: { 4 + '@tailwindcss/postcss': {}, 5 + }, 6 + }; 7 + 8 + export default config;
+89
src/app/[handle]/page.tsx
··· 1 + import { AtpAgent } from '@atproto/api'; 2 + import { ResearcherRepository } from '@/lib/data/repository'; 3 + import ProfileView from '@/components/profile/ProfileView'; 4 + 5 + interface PageProps { 6 + params: Promise<{ 7 + handle: string; 8 + }>; 9 + } 10 + 11 + export default async function ProfilePage({ params }: PageProps) { 12 + const { handle } = await params; 13 + 14 + // Resolve handle to DID 15 + const agent = new AtpAgent({ service: 'https://bsky.social' }); 16 + 17 + try { 18 + const resolved = await agent.resolveHandle({ handle }); 19 + const did = resolved.data.did; 20 + 21 + // Get Bluesky profile 22 + const bskyProfile = await agent.getProfile({ actor: did }); 23 + 24 + // Get Lanyard profile 25 + const repo = new ResearcherRepository(agent); 26 + const lanyardProfile = await repo.getProfile(did); 27 + 28 + if (!lanyardProfile) { 29 + return ( 30 + <main className="flex min-h-screen flex-col items-center justify-center p-6"> 31 + <div className="text-center"> 32 + <h1 className="text-2xl font-bold mb-4">Profile Not Found</h1> 33 + <p className="text-gray-600 mb-6"> 34 + This user hasn&apos;t created a Lanyard profile yet. 35 + </p> 36 + <a 37 + href="/" 38 + className="text-blue-600 hover:underline" 39 + > 40 + Go to homepage 41 + </a> 42 + </div> 43 + </main> 44 + ); 45 + } 46 + 47 + // Get all profile data 48 + const [affiliations, webLinks, works, events] = 49 + await Promise.all([ 50 + repo.listAffiliations(did), 51 + repo.listWebLinks(did), 52 + repo.listWorks(did), 53 + repo.listEvents(did), 54 + ]); 55 + 56 + return ( 57 + <ProfileView 58 + profile={{ 59 + ...lanyardProfile, 60 + displayName: bskyProfile.data.displayName, 61 + avatar: bskyProfile.data.avatar, 62 + description: bskyProfile.data.description, 63 + }} 64 + affiliations={affiliations} 65 + webLinks={webLinks} 66 + works={works} 67 + events={events} 68 + /> 69 + ); 70 + } catch (error) { 71 + console.error('Error loading profile:', error); 72 + return ( 73 + <main className="flex min-h-screen flex-col items-center justify-center p-6"> 74 + <div className="text-center"> 75 + <h1 className="text-2xl font-bold mb-4">Error Loading Profile</h1> 76 + <p className="text-gray-600 mb-6"> 77 + Unable to load this profile. Please try again later. 78 + </p> 79 + <a 80 + href="/" 81 + className="text-blue-600 hover:underline" 82 + > 83 + Go to homepage 84 + </a> 85 + </div> 86 + </main> 87 + ); 88 + } 89 + }
+32
src/app/api/auth/callback/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getOAuthClient } from '@/lib/auth/oauth-client'; 3 + import { createSession } from '@/lib/auth/session'; 4 + 5 + export async function GET(request: NextRequest) { 6 + try { 7 + const searchParams = request.nextUrl.searchParams; 8 + 9 + const client = await getOAuthClient(); 10 + 11 + // Exchange code for tokens - pass the full URL searchParams 12 + const { session } = await client.callback(searchParams); 13 + 14 + // Create session - store the session object as JSON for now 15 + // The actual session structure contains all necessary auth info 16 + await createSession({ 17 + did: session.sub, 18 + handle: session.sub, // DID will be used as handle initially 19 + accessToken: JSON.stringify(session), // Store full session as string 20 + refreshToken: '', // Not directly accessible 21 + expiresAt: Date.now() + 3600 * 1000, // 1 hour 22 + }); 23 + 24 + // Redirect to dashboard 25 + return NextResponse.redirect(new URL('/dashboard', request.url)); 26 + } catch (error) { 27 + console.error('OAuth callback error:', error); 28 + return NextResponse.redirect( 29 + new URL('/?error=auth_failed', request.url) 30 + ); 31 + } 32 + }
+74
src/app/api/auth/login/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { createAuthUrl } from '@/lib/auth/oauth-client'; 3 + import { getAuthMethod } from '@/lib/auth/config'; 4 + import { 5 + loginWithAppPassword, 6 + getConfiguredCredentials, 7 + } from '@/lib/auth/app-password'; 8 + import { createSession } from '@/lib/auth/session'; 9 + 10 + export async function POST(request: NextRequest) { 11 + try { 12 + const authMethod = getAuthMethod(); 13 + 14 + if (authMethod === 'app_password') { 15 + // App Password authentication 16 + const credentials = await getConfiguredCredentials(); 17 + 18 + if (!credentials) { 19 + return NextResponse.json( 20 + { 21 + error: 22 + 'App password not configured. Please set BLUESKY_HANDLE and BLUESKY_APP_PASSWORD in .env', 23 + }, 24 + { status: 500 } 25 + ); 26 + } 27 + 28 + // Login with app password 29 + const session = await loginWithAppPassword( 30 + credentials.handle, 31 + credentials.password 32 + ); 33 + 34 + // Create session 35 + await createSession({ 36 + did: session.did, 37 + handle: session.handle, 38 + accessToken: session.accessJwt, 39 + refreshToken: session.refreshJwt, 40 + expiresAt: Date.now() + 24 * 60 * 60 * 1000, // 24 hours 41 + }); 42 + 43 + return NextResponse.json({ 44 + success: true, 45 + redirect: '/dashboard', 46 + }); 47 + } else { 48 + // OAuth authentication 49 + const body = await request.json(); 50 + const { handle } = body; 51 + 52 + if (!handle) { 53 + return NextResponse.json( 54 + { error: 'Handle is required' }, 55 + { status: 400 } 56 + ); 57 + } 58 + 59 + // Create authorization URL 60 + const authUrl = await createAuthUrl(handle); 61 + 62 + return NextResponse.json({ authUrl }); 63 + } 64 + } catch (error) { 65 + console.error('Login error:', error); 66 + return NextResponse.json( 67 + { 68 + error: 69 + error instanceof Error ? error.message : 'Failed to initiate login', 70 + }, 71 + { status: 500 } 72 + ); 73 + } 74 + }
+15
src/app/api/auth/logout/route.ts
··· 1 + import { NextResponse } from 'next/server'; 2 + import { deleteSession } from '@/lib/auth/session'; 3 + 4 + export async function POST() { 5 + try { 6 + await deleteSession(); 7 + return NextResponse.json({ success: true }); 8 + } catch (error) { 9 + console.error('Logout error:', error); 10 + return NextResponse.json( 11 + { error: 'Failed to logout' }, 12 + { status: 500 } 13 + ); 14 + } 15 + }
+8
src/app/api/auth/method/route.ts
··· 1 + import { NextResponse } from 'next/server'; 2 + import { getAuthMethod } from '@/lib/auth/config'; 3 + 4 + export async function GET() { 5 + return NextResponse.json({ 6 + method: getAuthMethod(), 7 + }); 8 + }
+24
src/app/api/auth/session/route.ts
··· 1 + import { NextResponse } from 'next/server'; 2 + import { getSession } from '@/lib/auth/session'; 3 + 4 + export async function GET() { 5 + try { 6 + const session = await getSession(); 7 + 8 + if (!session) { 9 + return NextResponse.json({ authenticated: false }, { status: 401 }); 10 + } 11 + 12 + return NextResponse.json({ 13 + authenticated: true, 14 + did: session.did, 15 + handle: session.handle, 16 + }); 17 + } catch (error) { 18 + console.error('Session check error:', error); 19 + return NextResponse.json( 20 + { error: 'Failed to check session' }, 21 + { status: 500 } 22 + ); 23 + } 24 + }
+30
src/app/api/doi/resolve/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { resolveDOI } from '@/lib/data/doi'; 3 + 4 + export async function GET(request: NextRequest) { 5 + try { 6 + const searchParams = request.nextUrl.searchParams; 7 + const doi = searchParams.get('doi'); 8 + 9 + if (!doi) { 10 + return NextResponse.json({ error: 'DOI is required' }, { status: 400 }); 11 + } 12 + 13 + const metadata = await resolveDOI(doi); 14 + 15 + if (!metadata) { 16 + return NextResponse.json( 17 + { error: 'Failed to resolve DOI' }, 18 + { status: 404 } 19 + ); 20 + } 21 + 22 + return NextResponse.json(metadata); 23 + } catch (error) { 24 + console.error('Error resolving DOI:', error); 25 + return NextResponse.json( 26 + { error: 'Failed to resolve DOI' }, 27 + { status: 500 } 28 + ); 29 + } 30 + }
+26
src/app/api/profile/affiliations/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getAgent } from '@/lib/auth/atproto'; 3 + import { ResearcherRepository } from '@/lib/data/repository'; 4 + 5 + export async function POST(request: NextRequest) { 6 + try { 7 + const agent = await getAgent(); 8 + 9 + if (!agent) { 10 + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); 11 + } 12 + 13 + const affiliation = await request.json(); 14 + 15 + const repo = new ResearcherRepository(agent); 16 + const rkey = await repo.createAffiliation(affiliation); 17 + 18 + return NextResponse.json({ success: true, rkey }); 19 + } catch (error) { 20 + console.error('Error adding affiliation:', error); 21 + return NextResponse.json( 22 + { error: 'Failed to add affiliation' }, 23 + { status: 500 } 24 + ); 25 + } 26 + }
+30
src/app/api/profile/basics/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getAgent } from '@/lib/auth/atproto'; 3 + import { ResearcherRepository } from '@/lib/data/repository'; 4 + 5 + export async function PUT(request: NextRequest) { 6 + try { 7 + const agent = await getAgent(); 8 + 9 + if (!agent) { 10 + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); 11 + } 12 + 13 + const body = await request.json(); 14 + const { honorifics, location } = body; 15 + 16 + const repo = new ResearcherRepository(agent); 17 + await repo.updateProfile({ 18 + honorifics, 19 + location, 20 + }); 21 + 22 + return NextResponse.json({ success: true }); 23 + } catch (error) { 24 + console.error('Error updating basics:', error); 25 + return NextResponse.json( 26 + { error: 'Failed to update profile' }, 27 + { status: 500 } 28 + ); 29 + } 30 + }
+26
src/app/api/profile/events/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getAgent } from '@/lib/auth/atproto'; 3 + import { ResearcherRepository } from '@/lib/data/repository'; 4 + 5 + export async function POST(request: NextRequest) { 6 + try { 7 + const agent = await getAgent(); 8 + 9 + if (!agent) { 10 + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); 11 + } 12 + 13 + const event = await request.json(); 14 + 15 + const repo = new ResearcherRepository(agent); 16 + const rkey = await repo.createEvent(event); 17 + 18 + return NextResponse.json({ success: true, rkey }); 19 + } catch (error) { 20 + console.error('Error adding event:', error); 21 + return NextResponse.json( 22 + { error: 'Failed to add event' }, 23 + { status: 500 } 24 + ); 25 + } 26 + }
+25
src/app/api/profile/links/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getAgent } from '@/lib/auth/atproto'; 3 + import { ResearcherRepository } from '@/lib/data/repository'; 4 + 5 + export async function POST(request: NextRequest) { 6 + try { 7 + const agent = await getAgent(); 8 + 9 + if (!agent) { 10 + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); 11 + } 12 + 13 + const link = await request.json(); 14 + 15 + const repo = new ResearcherRepository(agent); 16 + const rkey = await repo.createWebLink(link); 17 + 18 + return NextResponse.json({ success: true, rkey }); 19 + } catch (error) { 20 + console.error('Error adding link:', error); 21 + const message = 22 + error instanceof Error ? error.message : 'Failed to add link'; 23 + return NextResponse.json({ error: message }, { status: 500 }); 24 + } 25 + }
+40
src/app/api/profile/works/route.ts
··· 1 + import { NextRequest, NextResponse } from 'next/server'; 2 + import { getAgent } from '@/lib/auth/atproto'; 3 + import { ResearcherRepository } from '@/lib/data/repository'; 4 + import { resolveDOI } from '@/lib/data/doi'; 5 + 6 + export async function POST(request: NextRequest) { 7 + try { 8 + const agent = await getAgent(); 9 + 10 + if (!agent) { 11 + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); 12 + } 13 + 14 + const { doi, type } = await request.json(); 15 + 16 + // Resolve DOI metadata 17 + const metadata = await resolveDOI(doi); 18 + 19 + const work = { 20 + doi, 21 + type, 22 + title: metadata?.title, 23 + authors: metadata?.authors, 24 + publicationDate: metadata?.publicationDate, 25 + journal: metadata?.journal, 26 + metadata: metadata as Record<string, unknown> | undefined, 27 + }; 28 + 29 + const repo = new ResearcherRepository(agent); 30 + const rkey = await repo.createWork(work); 31 + 32 + return NextResponse.json({ success: true, rkey }); 33 + } catch (error) { 34 + console.error('Error adding work:', error); 35 + return NextResponse.json( 36 + { error: 'Failed to add work' }, 37 + { status: 500 } 38 + ); 39 + } 40 + }
+34
src/app/auth/page.tsx
··· 1 + import LoginForm from '@/components/auth/LoginForm'; 2 + 3 + export default function AuthPage() { 4 + return ( 5 + <main className="flex min-h-screen flex-col items-center justify-center p-6 bg-gray-50"> 6 + <div className="w-full max-w-md"> 7 + <div className="text-center mb-8"> 8 + <h1 className="text-4xl font-bold mb-2">Lanyard</h1> 9 + <p className="text-gray-600"> 10 + Sign in with your Bluesky account to get started 11 + </p> 12 + </div> 13 + 14 + <div className="bg-white p-8 rounded-xl shadow-sm"> 15 + <LoginForm /> 16 + </div> 17 + 18 + <div className="mt-6 text-center text-sm text-gray-500"> 19 + <p> 20 + Don&apos;t have a Bluesky account?{' '} 21 + <a 22 + href="https://bsky.app" 23 + target="_blank" 24 + rel="noopener noreferrer" 25 + className="text-blue-600 hover:underline" 26 + > 27 + Create one here 28 + </a> 29 + </p> 30 + </div> 31 + </div> 32 + </main> 33 + ); 34 + }
+50
src/app/dashboard/events/create/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import EventForm from '@/components/events/EventForm'; 4 + import Link from 'next/link'; 5 + 6 + export default async function CreateEventPage() { 7 + const session = await getSession(); 8 + 9 + if (!session) { 10 + redirect('/auth'); 11 + } 12 + 13 + return ( 14 + <main className="min-h-screen bg-gray-50"> 15 + {/* Header */} 16 + <div className="bg-white border-b border-gray-200"> 17 + <div className="max-w-2xl mx-auto px-4 py-4"> 18 + <Link 19 + href="/dashboard/events" 20 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 21 + > 22 + <svg 23 + className="w-4 h-4 mr-1" 24 + fill="none" 25 + stroke="currentColor" 26 + viewBox="0 0 24 24" 27 + > 28 + <path 29 + strokeLinecap="round" 30 + strokeLinejoin="round" 31 + strokeWidth={2} 32 + d="M15 19l-7-7 7-7" 33 + /> 34 + </svg> 35 + Back 36 + </Link> 37 + <h1 className="text-xl font-bold">Add Event</h1> 38 + <p className="text-sm text-gray-600 mt-1"> 39 + Add a conference, workshop, or other academic event 40 + </p> 41 + </div> 42 + </div> 43 + 44 + {/* Content */} 45 + <div className="max-w-2xl mx-auto px-4 py-6"> 46 + <EventForm mode="create" /> 47 + </div> 48 + </main> 49 + ); 50 + }
+74
src/app/dashboard/events/edit/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import EventForm from '@/components/events/EventForm'; 6 + import Link from 'next/link'; 7 + 8 + export default async function EditEventPage({ 9 + searchParams, 10 + }: { 11 + searchParams: { id?: string }; 12 + }) { 13 + const session = await getSession(); 14 + 15 + if (!session) { 16 + redirect('/auth'); 17 + } 18 + 19 + if (searchParams.id === undefined) { 20 + redirect('/dashboard/events'); 21 + } 22 + 23 + const agent = await getAgent(); 24 + 25 + if (!agent) { 26 + redirect('/auth'); 27 + } 28 + 29 + const repo = new ResearcherRepository(agent); 30 + const events = await repo.listEvents(session.did); 31 + 32 + const eventIndex = parseInt(searchParams.id, 10); 33 + const event = events[eventIndex]; 34 + 35 + if (!event) { 36 + redirect('/dashboard/events'); 37 + } 38 + 39 + return ( 40 + <main className="min-h-screen bg-gray-50"> 41 + {/* Header */} 42 + <div className="bg-white border-b border-gray-200"> 43 + <div className="max-w-2xl mx-auto px-4 py-4"> 44 + <Link 45 + href="/dashboard/events" 46 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 47 + > 48 + <svg 49 + className="w-4 h-4 mr-1" 50 + fill="none" 51 + stroke="currentColor" 52 + viewBox="0 0 24 24" 53 + > 54 + <path 55 + strokeLinecap="round" 56 + strokeLinejoin="round" 57 + strokeWidth={2} 58 + d="M15 19l-7-7 7-7" 59 + /> 60 + </svg> 61 + Back 62 + </Link> 63 + <h1 className="text-xl font-bold">Edit Event</h1> 64 + <p className="text-sm text-gray-600 mt-1">Update event details</p> 65 + </div> 66 + </div> 67 + 68 + {/* Content */} 69 + <div className="max-w-2xl mx-auto px-4 py-6"> 70 + <EventForm mode="edit" initialData={event} eventIndex={eventIndex} /> 71 + </div> 72 + </main> 73 + ); 74 + }
+200
src/app/dashboard/events/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import Link from 'next/link'; 6 + 7 + export default async function EventsPage() { 8 + const session = await getSession(); 9 + 10 + if (!session) { 11 + redirect('/auth'); 12 + } 13 + 14 + const agent = await getAgent(); 15 + 16 + if (!agent) { 17 + redirect('/auth'); 18 + } 19 + 20 + const repo = new ResearcherRepository(agent); 21 + const events = await repo.listEvents(session.did); 22 + 23 + return ( 24 + <main className="min-h-screen bg-gray-50"> 25 + {/* Header */} 26 + <div className="bg-white border-b border-gray-200"> 27 + <div className="max-w-2xl mx-auto px-4 py-4"> 28 + <Link 29 + href="/dashboard" 30 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 31 + > 32 + <svg 33 + className="w-4 h-4 mr-1" 34 + fill="none" 35 + stroke="currentColor" 36 + viewBox="0 0 24 24" 37 + > 38 + <path 39 + strokeLinecap="round" 40 + strokeLinejoin="round" 41 + strokeWidth={2} 42 + d="M15 19l-7-7 7-7" 43 + /> 44 + </svg> 45 + Back 46 + </Link> 47 + <h1 className="text-xl font-bold">Events</h1> 48 + <p className="text-sm text-gray-600 mt-1"> 49 + Manage conferences, workshops, and seminars 50 + </p> 51 + </div> 52 + </div> 53 + 54 + {/* Content */} 55 + <div className="max-w-2xl mx-auto px-4 py-6"> 56 + {events.length === 0 ? ( 57 + // Zero-data state 58 + <div className="bg-white rounded-lg p-8 shadow-sm text-center"> 59 + <div className="w-16 h-16 bg-blue-50 rounded-full flex items-center justify-center mx-auto mb-4"> 60 + <svg 61 + className="w-8 h-8 text-blue-600" 62 + fill="none" 63 + stroke="currentColor" 64 + viewBox="0 0 24 24" 65 + > 66 + <path 67 + strokeLinecap="round" 68 + strokeLinejoin="round" 69 + strokeWidth={2} 70 + d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" 71 + /> 72 + </svg> 73 + </div> 74 + <h2 className="text-lg font-semibold mb-2">No events yet</h2> 75 + <p className="text-gray-600 text-sm mb-6"> 76 + Add upcoming conferences, workshops, or seminars you&apos;re 77 + attending or have attended. 78 + </p> 79 + <Link 80 + href="/dashboard/events/create" 81 + className="inline-block bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors" 82 + > 83 + Add Event 84 + </Link> 85 + </div> 86 + ) : ( 87 + // Events list 88 + <div className="space-y-4"> 89 + {events.map((event, index) => { 90 + const startDate = new Date(event.startDate); 91 + const endDate = event.endDate ? new Date(event.endDate) : null; 92 + const isUpcoming = startDate > new Date(); 93 + 94 + return ( 95 + <div 96 + key={index} 97 + className="bg-white rounded-lg p-4 shadow-sm" 98 + > 99 + <div className="flex justify-between items-start gap-3"> 100 + <div className="flex-1 min-w-0"> 101 + <div className="flex items-center gap-2 mb-2"> 102 + <h3 className="font-medium text-gray-900"> 103 + {event.name} 104 + </h3> 105 + {isUpcoming && ( 106 + <span className="text-xs bg-green-100 text-green-700 px-2 py-0.5 rounded"> 107 + Upcoming 108 + </span> 109 + )} 110 + </div> 111 + <div className="space-y-1"> 112 + <div className="flex items-center gap-2 text-sm text-gray-600"> 113 + <svg 114 + className="w-4 h-4" 115 + fill="none" 116 + stroke="currentColor" 117 + viewBox="0 0 24 24" 118 + > 119 + <path 120 + strokeLinecap="round" 121 + strokeLinejoin="round" 122 + strokeWidth={2} 123 + d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" 124 + /> 125 + </svg> 126 + <span> 127 + {startDate.toLocaleDateString()} 128 + {endDate && endDate.getTime() !== startDate.getTime() 129 + ? ` - ${endDate.toLocaleDateString()}` 130 + : ''} 131 + </span> 132 + </div> 133 + {event.location && ( 134 + <div className="flex items-center gap-2 text-sm text-gray-600"> 135 + <svg 136 + className="w-4 h-4" 137 + fill="none" 138 + stroke="currentColor" 139 + viewBox="0 0 24 24" 140 + > 141 + <path 142 + strokeLinecap="round" 143 + strokeLinejoin="round" 144 + strokeWidth={2} 145 + d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" 146 + /> 147 + <path 148 + strokeLinecap="round" 149 + strokeLinejoin="round" 150 + strokeWidth={2} 151 + d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" 152 + /> 153 + </svg> 154 + <span> 155 + {event.location.city && `${event.location.city}, `} 156 + {event.location.country} 157 + </span> 158 + </div> 159 + )} 160 + <div className="flex items-center gap-2"> 161 + <span className="text-xs bg-gray-100 text-gray-700 px-2 py-1 rounded capitalize"> 162 + {event.type.replace(/-/g, ' ')} 163 + </span> 164 + {event.url && ( 165 + <a 166 + href={event.url} 167 + target="_blank" 168 + rel="noopener noreferrer" 169 + className="text-xs text-blue-600 hover:underline" 170 + > 171 + Website 172 + </a> 173 + )} 174 + </div> 175 + </div> 176 + </div> 177 + <Link 178 + href={`/dashboard/events/edit?id=${index}`} 179 + className="text-sm text-gray-600 hover:text-gray-900" 180 + > 181 + Edit 182 + </Link> 183 + </div> 184 + </div> 185 + ); 186 + })} 187 + 188 + {/* Add button */} 189 + <Link 190 + href="/dashboard/events/create" 191 + className="block w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors text-center" 192 + > 193 + Add Event 194 + </Link> 195 + </div> 196 + )} 197 + </div> 198 + </main> 199 + ); 200 + }
+50
src/app/dashboard/links/create/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import LinkForm from '@/components/links/LinkForm'; 4 + import Link from 'next/link'; 5 + 6 + export default async function CreateLinkPage() { 7 + const session = await getSession(); 8 + 9 + if (!session) { 10 + redirect('/auth'); 11 + } 12 + 13 + return ( 14 + <main className="min-h-screen bg-gray-50"> 15 + {/* Header */} 16 + <div className="bg-white border-b border-gray-200"> 17 + <div className="max-w-2xl mx-auto px-4 py-4"> 18 + <Link 19 + href="/dashboard/links" 20 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 21 + > 22 + <svg 23 + className="w-4 h-4 mr-1" 24 + fill="none" 25 + stroke="currentColor" 26 + viewBox="0 0 24 24" 27 + > 28 + <path 29 + strokeLinecap="round" 30 + strokeLinejoin="round" 31 + strokeWidth={2} 32 + d="M15 19l-7-7 7-7" 33 + /> 34 + </svg> 35 + Back 36 + </Link> 37 + <h1 className="text-xl font-bold">Add Link</h1> 38 + <p className="text-sm text-gray-600 mt-1"> 39 + Add a social media, academic, or custom web link 40 + </p> 41 + </div> 42 + </div> 43 + 44 + {/* Content */} 45 + <div className="max-w-2xl mx-auto px-4 py-6"> 46 + <LinkForm mode="create" /> 47 + </div> 48 + </main> 49 + ); 50 + }
+79
src/app/dashboard/links/edit/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import LinkForm from '@/components/links/LinkForm'; 6 + import Link from 'next/link'; 7 + 8 + export default async function EditLinkPage({ 9 + searchParams, 10 + }: { 11 + searchParams: { id?: string }; 12 + }) { 13 + const session = await getSession(); 14 + 15 + if (!session) { 16 + redirect('/auth'); 17 + } 18 + 19 + if (searchParams.id === undefined) { 20 + redirect('/dashboard/links'); 21 + } 22 + 23 + const agent = await getAgent(); 24 + 25 + if (!agent) { 26 + redirect('/auth'); 27 + } 28 + 29 + const repo = new ResearcherRepository(agent); 30 + const links = await repo.listWebLinks(session.did); 31 + 32 + const linkIndex = parseInt(searchParams.id, 10); 33 + const link = links[linkIndex]; 34 + 35 + if (!link) { 36 + redirect('/dashboard/links'); 37 + } 38 + 39 + if (link.isLocked) { 40 + // Redirect if trying to edit a locked link 41 + redirect('/dashboard/links'); 42 + } 43 + 44 + return ( 45 + <main className="min-h-screen bg-gray-50"> 46 + {/* Header */} 47 + <div className="bg-white border-b border-gray-200"> 48 + <div className="max-w-2xl mx-auto px-4 py-4"> 49 + <Link 50 + href="/dashboard/links" 51 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 52 + > 53 + <svg 54 + className="w-4 h-4 mr-1" 55 + fill="none" 56 + stroke="currentColor" 57 + viewBox="0 0 24 24" 58 + > 59 + <path 60 + strokeLinecap="round" 61 + strokeLinejoin="round" 62 + strokeWidth={2} 63 + d="M15 19l-7-7 7-7" 64 + /> 65 + </svg> 66 + Back 67 + </Link> 68 + <h1 className="text-xl font-bold">Edit Link</h1> 69 + <p className="text-sm text-gray-600 mt-1">Update link details</p> 70 + </div> 71 + </div> 72 + 73 + {/* Content */} 74 + <div className="max-w-2xl mx-auto px-4 py-6"> 75 + <LinkForm mode="edit" initialData={link} linkIndex={linkIndex} /> 76 + </div> 77 + </main> 78 + ); 79 + }
+194
src/app/dashboard/links/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import Link from 'next/link'; 6 + 7 + const PLATFORM_ICONS: Record<string, string> = { 8 + bluesky: '🦋', 9 + twitter: '🐦', 10 + linkedin: '💼', 11 + researchgate: '🔬', 12 + googlescholar: '🎓', 13 + orcid: '🆔', 14 + semble: '👥', 15 + custom: '🔗', 16 + }; 17 + 18 + const PLATFORM_NAMES: Record<string, string> = { 19 + bluesky: 'Bluesky', 20 + twitter: 'Twitter', 21 + linkedin: 'LinkedIn', 22 + researchgate: 'ResearchGate', 23 + googlescholar: 'Google Scholar', 24 + orcid: 'ORCID', 25 + semble: 'Semble', 26 + custom: 'Custom Link', 27 + }; 28 + 29 + export default async function LinksPage() { 30 + const session = await getSession(); 31 + 32 + if (!session) { 33 + redirect('/auth'); 34 + } 35 + 36 + const agent = await getAgent(); 37 + 38 + if (!agent) { 39 + redirect('/auth'); 40 + } 41 + 42 + const repo = new ResearcherRepository(agent); 43 + const links = await repo.listWebLinks(session.did); 44 + 45 + return ( 46 + <main className="min-h-screen bg-gray-50"> 47 + {/* Header */} 48 + <div className="bg-white border-b border-gray-200"> 49 + <div className="max-w-2xl mx-auto px-4 py-4"> 50 + <Link 51 + href="/dashboard" 52 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 53 + > 54 + <svg 55 + className="w-4 h-4 mr-1" 56 + fill="none" 57 + stroke="currentColor" 58 + viewBox="0 0 24 24" 59 + > 60 + <path 61 + strokeLinecap="round" 62 + strokeLinejoin="round" 63 + strokeWidth={2} 64 + d="M15 19l-7-7 7-7" 65 + /> 66 + </svg> 67 + Back 68 + </Link> 69 + <h1 className="text-xl font-bold">WebLinks</h1> 70 + <p className="text-sm text-gray-600 mt-1"> 71 + Manage social media and custom web links 72 + </p> 73 + </div> 74 + </div> 75 + 76 + {/* Content */} 77 + <div className="max-w-2xl mx-auto px-4 py-6"> 78 + {links.length === 0 ? ( 79 + // Zero-data state 80 + <div className="bg-white rounded-lg p-8 shadow-sm text-center"> 81 + <div className="w-16 h-16 bg-blue-50 rounded-full flex items-center justify-center mx-auto mb-4"> 82 + <svg 83 + className="w-8 h-8 text-blue-600" 84 + fill="none" 85 + stroke="currentColor" 86 + viewBox="0 0 24 24" 87 + > 88 + <path 89 + strokeLinecap="round" 90 + strokeLinejoin="round" 91 + strokeWidth={2} 92 + d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" 93 + /> 94 + </svg> 95 + </div> 96 + <h2 className="text-lg font-semibold mb-2">No links yet</h2> 97 + <p className="text-gray-600 text-sm mb-6"> 98 + Add links to your social media profiles, ORCID, Google Scholar, or 99 + custom websites. 100 + </p> 101 + <Link 102 + href="/dashboard/links/create" 103 + className="inline-block bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors" 104 + > 105 + Add Link 106 + </Link> 107 + </div> 108 + ) : ( 109 + // Links list 110 + <div className="space-y-4"> 111 + {links.map((link, index) => { 112 + const platformIcon = 113 + PLATFORM_ICONS[link.platform || 'custom'] || '🔗'; 114 + const platformName = 115 + PLATFORM_NAMES[link.platform || 'custom'] || 'Link'; 116 + 117 + return ( 118 + <div 119 + key={index} 120 + className="bg-white rounded-lg p-4 shadow-sm" 121 + > 122 + <div className="flex justify-between items-start gap-3"> 123 + <div className="flex-1 min-w-0"> 124 + <div className="flex items-center gap-2 mb-2"> 125 + <span className="text-2xl">{platformIcon}</span> 126 + <div className="flex-1"> 127 + <h3 className="font-medium text-gray-900"> 128 + {link.title || platformName} 129 + </h3> 130 + {link.username && ( 131 + <p className="text-sm text-gray-600"> 132 + @{link.username} 133 + </p> 134 + )} 135 + </div> 136 + </div> 137 + <a 138 + href={link.url} 139 + target="_blank" 140 + rel="noopener noreferrer" 141 + className="text-sm text-blue-600 hover:underline break-all" 142 + > 143 + {link.url} 144 + </a> 145 + <div className="flex items-center gap-2 mt-2"> 146 + <span className="text-xs bg-gray-100 text-gray-700 px-2 py-1 rounded capitalize"> 147 + {link.type} 148 + </span> 149 + {link.isLocked && ( 150 + <span className="text-xs text-gray-500 flex items-center gap-1"> 151 + <svg 152 + className="w-3 h-3" 153 + fill="none" 154 + stroke="currentColor" 155 + viewBox="0 0 24 24" 156 + > 157 + <path 158 + strokeLinecap="round" 159 + strokeLinejoin="round" 160 + strokeWidth={2} 161 + d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" 162 + /> 163 + </svg> 164 + Locked 165 + </span> 166 + )} 167 + </div> 168 + </div> 169 + {!link.isLocked && ( 170 + <Link 171 + href={`/dashboard/links/edit?id=${index}`} 172 + className="text-sm text-gray-600 hover:text-gray-900" 173 + > 174 + Edit 175 + </Link> 176 + )} 177 + </div> 178 + </div> 179 + ); 180 + })} 181 + 182 + {/* Add button */} 183 + <Link 184 + href="/dashboard/links/create" 185 + className="block w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors text-center" 186 + > 187 + Add Link 188 + </Link> 189 + </div> 190 + )} 191 + </div> 192 + </main> 193 + ); 194 + }
+203
src/app/dashboard/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import Link from 'next/link'; 6 + import ShareProfileButton from '@/components/profile/ShareProfileButton'; 7 + 8 + export default async function DashboardPage() { 9 + const session = await getSession(); 10 + 11 + if (!session) { 12 + redirect('/auth'); 13 + } 14 + 15 + const agent = await getAgent(); 16 + 17 + if (!agent) { 18 + redirect('/auth'); 19 + } 20 + 21 + const repo = new ResearcherRepository(agent); 22 + 23 + try { 24 + // Get profile 25 + let profile = await repo.getProfile(session.did); 26 + 27 + // Create profile if it doesn't exist 28 + if (!profile) { 29 + const bskyProfile = await agent.getProfile({ actor: session.did }); 30 + 31 + await repo.createProfile({ 32 + did: session.did, 33 + handle: session.handle, 34 + displayName: bskyProfile.data.displayName, 35 + avatar: bskyProfile.data.avatar, 36 + description: bskyProfile.data.description, 37 + }); 38 + 39 + profile = await repo.getProfile(session.did); 40 + } 41 + 42 + // Get counts for each section 43 + const [works, events, webLinks] = await Promise.all([ 44 + repo.listWorks(session.did), 45 + repo.listEvents(session.did), 46 + repo.listWebLinks(session.did), 47 + ]); 48 + 49 + return ( 50 + <main className="min-h-screen bg-gray-50"> 51 + {/* Header */} 52 + <div className="bg-white border-b border-gray-200"> 53 + <div className="max-w-2xl mx-auto px-4 py-4 flex justify-between items-center"> 54 + <h1 className="text-xl font-bold">Lanyard</h1> 55 + <form action="/api/auth/logout" method="POST"> 56 + <button 57 + type="submit" 58 + className="text-sm text-gray-600 hover:text-gray-900" 59 + > 60 + Logout 61 + </button> 62 + </form> 63 + </div> 64 + </div> 65 + 66 + {/* Content */} 67 + <div className="max-w-2xl mx-auto px-4 py-6 space-y-4"> 68 + {/* Profile Card */} 69 + <div className="bg-white rounded-lg p-6 shadow-sm"> 70 + <div className="flex items-start justify-between mb-4"> 71 + <div className="flex-1"> 72 + <h2 className="text-lg font-semibold"> 73 + {profile?.displayName || 'Your Profile'} 74 + </h2> 75 + <p className="text-sm text-gray-600">@{session.handle}</p> 76 + </div> 77 + <ShareProfileButton 78 + url={`${process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'}/${session.handle}`} 79 + handle={session.handle} 80 + /> 81 + </div> 82 + <div className="flex gap-2"> 83 + <Link 84 + href={`/${session.handle}`} 85 + className="flex-1 text-center text-sm py-2 px-4 border border-gray-300 rounded-lg hover:bg-gray-50" 86 + > 87 + View Profile 88 + </Link> 89 + <Link 90 + href="/dashboard/profile/edit" 91 + className="flex-1 text-center text-sm py-2 px-4 bg-blue-600 text-white rounded-lg hover:bg-blue-700" 92 + > 93 + Edit Profile 94 + </Link> 95 + </div> 96 + </div> 97 + 98 + {/* Research Links */} 99 + <Link 100 + href="/dashboard/research" 101 + className="block bg-white rounded-lg p-6 shadow-sm hover:shadow-md transition-shadow" 102 + > 103 + <div className="flex justify-between items-center"> 104 + <div> 105 + <h3 className="font-semibold mb-1">Research Links</h3> 106 + <p className="text-sm text-gray-600"> 107 + {works.length} publication{works.length !== 1 ? 's' : ''} 108 + </p> 109 + </div> 110 + <svg 111 + className="w-5 h-5 text-gray-400" 112 + fill="none" 113 + stroke="currentColor" 114 + viewBox="0 0 24 24" 115 + > 116 + <path 117 + strokeLinecap="round" 118 + strokeLinejoin="round" 119 + strokeWidth={2} 120 + d="M9 5l7 7-7 7" 121 + /> 122 + </svg> 123 + </div> 124 + </Link> 125 + 126 + {/* Events */} 127 + <Link 128 + href="/dashboard/events" 129 + className="block bg-white rounded-lg p-6 shadow-sm hover:shadow-md transition-shadow" 130 + > 131 + <div className="flex justify-between items-center"> 132 + <div> 133 + <h3 className="font-semibold mb-1">Events</h3> 134 + <p className="text-sm text-gray-600"> 135 + {events.length} event{events.length !== 1 ? 's' : ''} 136 + </p> 137 + </div> 138 + <svg 139 + className="w-5 h-5 text-gray-400" 140 + fill="none" 141 + stroke="currentColor" 142 + viewBox="0 0 24 24" 143 + > 144 + <path 145 + strokeLinecap="round" 146 + strokeLinejoin="round" 147 + strokeWidth={2} 148 + d="M9 5l7 7-7 7" 149 + /> 150 + </svg> 151 + </div> 152 + </Link> 153 + 154 + {/* WebLinks */} 155 + <Link 156 + href="/dashboard/links" 157 + className="block bg-white rounded-lg p-6 shadow-sm hover:shadow-md transition-shadow" 158 + > 159 + <div className="flex justify-between items-center"> 160 + <div> 161 + <h3 className="font-semibold mb-1">WebLinks</h3> 162 + <p className="text-sm text-gray-600"> 163 + {webLinks.length} link{webLinks.length !== 1 ? 's' : ''} 164 + </p> 165 + </div> 166 + <svg 167 + className="w-5 h-5 text-gray-400" 168 + fill="none" 169 + stroke="currentColor" 170 + viewBox="0 0 24 24" 171 + > 172 + <path 173 + strokeLinecap="round" 174 + strokeLinejoin="round" 175 + strokeWidth={2} 176 + d="M9 5l7 7-7 7" 177 + /> 178 + </svg> 179 + </div> 180 + </Link> 181 + </div> 182 + </main> 183 + ); 184 + } catch (error) { 185 + console.error('Error loading dashboard:', error); 186 + return ( 187 + <main className="flex min-h-screen flex-col items-center justify-center p-6"> 188 + <div className="text-center"> 189 + <h1 className="text-2xl font-bold mb-4">Error Loading Dashboard</h1> 190 + <p className="text-gray-600 mb-6"> 191 + Unable to load your profile. Please try again later. 192 + </p> 193 + <Link 194 + href="/auth" 195 + className="text-blue-600 hover:underline" 196 + > 197 + Return to Login 198 + </Link> 199 + </div> 200 + </main> 201 + ); 202 + } 203 + }
+65
src/app/dashboard/profile/edit/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import ProfileForm from '@/components/profile/ProfileForm'; 6 + import Link from 'next/link'; 7 + 8 + export default async function EditProfilePage() { 9 + const session = await getSession(); 10 + 11 + if (!session) { 12 + redirect('/auth'); 13 + } 14 + 15 + const agent = await getAgent(); 16 + 17 + if (!agent) { 18 + redirect('/auth'); 19 + } 20 + 21 + const repo = new ResearcherRepository(agent); 22 + const profile = await repo.getProfile(session.did); 23 + 24 + if (!profile) { 25 + redirect('/dashboard'); 26 + } 27 + 28 + return ( 29 + <main className="min-h-screen bg-gray-50"> 30 + {/* Header */} 31 + <div className="bg-white border-b border-gray-200"> 32 + <div className="max-w-2xl mx-auto px-4 py-4"> 33 + <Link 34 + href="/dashboard" 35 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 36 + > 37 + <svg 38 + className="w-4 h-4 mr-1" 39 + fill="none" 40 + stroke="currentColor" 41 + viewBox="0 0 24 24" 42 + > 43 + <path 44 + strokeLinecap="round" 45 + strokeLinejoin="round" 46 + strokeWidth={2} 47 + d="M15 19l-7-7 7-7" 48 + /> 49 + </svg> 50 + Back 51 + </Link> 52 + <h1 className="text-xl font-bold">Edit Profile</h1> 53 + <p className="text-sm text-gray-600 mt-1"> 54 + Update your researcher profile information 55 + </p> 56 + </div> 57 + </div> 58 + 59 + {/* Content */} 60 + <div className="max-w-2xl mx-auto px-4 py-6"> 61 + <ProfileForm profile={profile} /> 62 + </div> 63 + </main> 64 + ); 65 + }
+50
src/app/dashboard/research/create/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import ResearchForm from '@/components/research/ResearchForm'; 4 + import Link from 'next/link'; 5 + 6 + export default async function CreateResearchPage() { 7 + const session = await getSession(); 8 + 9 + if (!session) { 10 + redirect('/auth'); 11 + } 12 + 13 + return ( 14 + <main className="min-h-screen bg-gray-50"> 15 + {/* Header */} 16 + <div className="bg-white border-b border-gray-200"> 17 + <div className="max-w-2xl mx-auto px-4 py-4"> 18 + <Link 19 + href="/dashboard/research" 20 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 21 + > 22 + <svg 23 + className="w-4 h-4 mr-1" 24 + fill="none" 25 + stroke="currentColor" 26 + viewBox="0 0 24 24" 27 + > 28 + <path 29 + strokeLinecap="round" 30 + strokeLinejoin="round" 31 + strokeWidth={2} 32 + d="M15 19l-7-7 7-7" 33 + /> 34 + </svg> 35 + Back 36 + </Link> 37 + <h1 className="text-xl font-bold">Add Publication</h1> 38 + <p className="text-sm text-gray-600 mt-1"> 39 + Enter a DOI to add a publication to your profile 40 + </p> 41 + </div> 42 + </div> 43 + 44 + {/* Content */} 45 + <div className="max-w-2xl mx-auto px-4 py-6"> 46 + <ResearchForm mode="create" /> 47 + </div> 48 + </main> 49 + ); 50 + }
+76
src/app/dashboard/research/edit/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import ResearchForm from '@/components/research/ResearchForm'; 6 + import Link from 'next/link'; 7 + 8 + export default async function EditResearchPage({ 9 + searchParams, 10 + }: { 11 + searchParams: { doi?: string }; 12 + }) { 13 + const session = await getSession(); 14 + 15 + if (!session) { 16 + redirect('/auth'); 17 + } 18 + 19 + if (!searchParams.doi) { 20 + redirect('/dashboard/research'); 21 + } 22 + 23 + const agent = await getAgent(); 24 + 25 + if (!agent) { 26 + redirect('/auth'); 27 + } 28 + 29 + const repo = new ResearcherRepository(agent); 30 + const works = await repo.listWorks(session.did); 31 + 32 + // Find the work with the matching DOI 33 + const work = works.find((w) => w.doi === searchParams.doi); 34 + 35 + if (!work) { 36 + redirect('/dashboard/research'); 37 + } 38 + 39 + return ( 40 + <main className="min-h-screen bg-gray-50"> 41 + {/* Header */} 42 + <div className="bg-white border-b border-gray-200"> 43 + <div className="max-w-2xl mx-auto px-4 py-4"> 44 + <Link 45 + href="/dashboard/research" 46 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 47 + > 48 + <svg 49 + className="w-4 h-4 mr-1" 50 + fill="none" 51 + stroke="currentColor" 52 + viewBox="0 0 24 24" 53 + > 54 + <path 55 + strokeLinecap="round" 56 + strokeLinejoin="round" 57 + strokeWidth={2} 58 + d="M15 19l-7-7 7-7" 59 + /> 60 + </svg> 61 + Back 62 + </Link> 63 + <h1 className="text-xl font-bold">Edit Publication</h1> 64 + <p className="text-sm text-gray-600 mt-1"> 65 + Update publication details 66 + </p> 67 + </div> 68 + </div> 69 + 70 + {/* Content */} 71 + <div className="max-w-2xl mx-auto px-4 py-6"> 72 + <ResearchForm mode="edit" initialData={work} /> 73 + </div> 74 + </main> 75 + ); 76 + }
+150
src/app/dashboard/research/page.tsx
··· 1 + import { redirect } from 'next/navigation'; 2 + import { getSession } from '@/lib/auth/session'; 3 + import { getAgent } from '@/lib/auth/atproto'; 4 + import { ResearcherRepository } from '@/lib/data/repository'; 5 + import Link from 'next/link'; 6 + 7 + export default async function ResearchPage() { 8 + const session = await getSession(); 9 + 10 + if (!session) { 11 + redirect('/auth'); 12 + } 13 + 14 + const agent = await getAgent(); 15 + 16 + if (!agent) { 17 + redirect('/auth'); 18 + } 19 + 20 + const repo = new ResearcherRepository(agent); 21 + const works = await repo.listWorks(session.did); 22 + 23 + return ( 24 + <main className="min-h-screen bg-gray-50"> 25 + {/* Header */} 26 + <div className="bg-white border-b border-gray-200"> 27 + <div className="max-w-2xl mx-auto px-4 py-4"> 28 + <Link 29 + href="/dashboard" 30 + className="inline-flex items-center text-sm text-gray-600 hover:text-gray-900 mb-2" 31 + > 32 + <svg 33 + className="w-4 h-4 mr-1" 34 + fill="none" 35 + stroke="currentColor" 36 + viewBox="0 0 24 24" 37 + > 38 + <path 39 + strokeLinecap="round" 40 + strokeLinejoin="round" 41 + strokeWidth={2} 42 + d="M15 19l-7-7 7-7" 43 + /> 44 + </svg> 45 + Back 46 + </Link> 47 + <h1 className="text-xl font-bold">Research Links</h1> 48 + <p className="text-sm text-gray-600 mt-1"> 49 + Manage your publications and scholarly works 50 + </p> 51 + </div> 52 + </div> 53 + 54 + {/* Content */} 55 + <div className="max-w-2xl mx-auto px-4 py-6"> 56 + {works.length === 0 ? ( 57 + // Zero-data state 58 + <div className="bg-white rounded-lg p-8 shadow-sm text-center"> 59 + <div className="w-16 h-16 bg-blue-50 rounded-full flex items-center justify-center mx-auto mb-4"> 60 + <svg 61 + className="w-8 h-8 text-blue-600" 62 + fill="none" 63 + stroke="currentColor" 64 + viewBox="0 0 24 24" 65 + > 66 + <path 67 + strokeLinecap="round" 68 + strokeLinejoin="round" 69 + strokeWidth={2} 70 + d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" 71 + /> 72 + </svg> 73 + </div> 74 + <h2 className="text-lg font-semibold mb-2">No publications yet</h2> 75 + <p className="text-gray-600 text-sm mb-6"> 76 + Add your first publication by entering its DOI. We&apos;ll 77 + automatically fetch the metadata from CrossRef. 78 + </p> 79 + <Link 80 + href="/dashboard/research/create" 81 + className="inline-block bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors" 82 + > 83 + Add Publication 84 + </Link> 85 + </div> 86 + ) : ( 87 + // Works list 88 + <div className="space-y-4"> 89 + {works.map((work) => ( 90 + <div 91 + key={work.doi} 92 + className="bg-white rounded-lg p-4 shadow-sm" 93 + > 94 + <div className="flex justify-between items-start gap-3"> 95 + <div className="flex-1 min-w-0"> 96 + <h3 className="font-medium text-gray-900 mb-2"> 97 + {work.title || work.doi} 98 + </h3> 99 + {work.authors && work.authors.length > 0 && ( 100 + <p className="text-sm text-gray-600 mb-2"> 101 + {work.authors.join(', ')} 102 + </p> 103 + )} 104 + <div className="flex flex-wrap gap-2 items-center"> 105 + <span className="text-xs bg-gray-100 text-gray-700 px-2 py-1 rounded capitalize"> 106 + {work.type.replace(/-/g, ' ')} 107 + </span> 108 + {work.venue && ( 109 + <span className="text-xs text-gray-600"> 110 + {work.venue} 111 + </span> 112 + )} 113 + {work.publicationDate && ( 114 + <span className="text-xs text-gray-500"> 115 + {new Date(work.publicationDate).getFullYear()} 116 + </span> 117 + )} 118 + </div> 119 + <a 120 + href={`https://doi.org/${work.doi}`} 121 + target="_blank" 122 + rel="noopener noreferrer" 123 + className="text-xs text-blue-600 hover:underline mt-2 inline-block" 124 + > 125 + DOI: {work.doi} 126 + </a> 127 + </div> 128 + <Link 129 + href={`/dashboard/research/edit?doi=${encodeURIComponent(work.doi)}`} 130 + className="text-sm text-gray-600 hover:text-gray-900" 131 + > 132 + Edit 133 + </Link> 134 + </div> 135 + </div> 136 + ))} 137 + 138 + {/* Add button */} 139 + <Link 140 + href="/dashboard/research/create" 141 + className="block w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors text-center" 142 + > 143 + Add Publication 144 + </Link> 145 + </div> 146 + )} 147 + </div> 148 + </main> 149 + ); 150 + }
+20
src/app/globals.css
··· 1 + @import "tailwindcss"; 2 + 3 + @theme { 4 + --font-family-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; 5 + 6 + --color-primary: #0085ff; 7 + --color-primary-dark: #0070d9; 8 + 9 + --breakpoint-xs: 375px; 10 + --breakpoint-sm: 640px; 11 + --breakpoint-md: 768px; 12 + --breakpoint-lg: 1024px; 13 + --breakpoint-xl: 1280px; 14 + } 15 + 16 + body { 17 + font-family: var(--font-family-sans); 18 + -webkit-font-smoothing: antialiased; 19 + -moz-osx-font-smoothing: grayscale; 20 + }
+26
src/app/layout.tsx
··· 1 + import type { Metadata, Viewport } from 'next'; 2 + import './globals.css'; 3 + 4 + export const metadata: Metadata = { 5 + title: 'Lanyard - Researcher Profiles on AT Protocol', 6 + description: 7 + 'A dedicated profile for researchers, built on the AT Protocol. An alternative to ORCID.', 8 + }; 9 + 10 + export const viewport: Viewport = { 11 + width: 'device-width', 12 + initialScale: 1, 13 + maximumScale: 1, 14 + }; 15 + 16 + export default function RootLayout({ 17 + children, 18 + }: Readonly<{ 19 + children: React.ReactNode; 20 + }>) { 21 + return ( 22 + <html lang="en"> 23 + <body className="antialiased">{children}</body> 24 + </html> 25 + ); 26 + }
+65
src/app/page.tsx
··· 1 + import Link from 'next/link'; 2 + 3 + export default function Home() { 4 + return ( 5 + <main className="flex min-h-screen flex-col items-center justify-center p-6 bg-gradient-to-b from-white to-gray-50"> 6 + <div className="max-w-2xl w-full text-center"> 7 + <h1 className="text-5xl font-bold mb-4 bg-gradient-to-r from-blue-600 to-blue-800 bg-clip-text text-transparent"> 8 + Lanyard 9 + </h1> 10 + <p className="text-xl text-gray-700 mb-2"> 11 + Your Researcher Profile on the AT Protocol 12 + </p> 13 + <p className="text-lg text-gray-600 mb-8"> 14 + An alternative to ORCID for the decentralized web 15 + </p> 16 + 17 + <div className="flex flex-col sm:flex-row gap-4 justify-center mb-12"> 18 + <Link 19 + href="/auth" 20 + className="bg-blue-600 text-white py-3 px-8 rounded-lg font-medium hover:bg-blue-700 transition-colors" 21 + > 22 + Get Started 23 + </Link> 24 + <Link 25 + href="/auth" 26 + className="bg-white border-2 border-gray-300 text-gray-700 py-3 px-8 rounded-lg font-medium hover:border-gray-400 transition-colors" 27 + > 28 + Sign In 29 + </Link> 30 + </div> 31 + 32 + <div className="grid md:grid-cols-2 gap-6 text-left"> 33 + <div className="bg-white p-6 rounded-lg shadow-sm"> 34 + <h3 className="font-semibold text-lg mb-2">Mobile-First Design</h3> 35 + <p className="text-gray-600 text-sm"> 36 + Share your profile easily at conferences with QR code support and 37 + optimized mobile display. 38 + </p> 39 + </div> 40 + <div className="bg-white p-6 rounded-lg shadow-sm"> 41 + <h3 className="font-semibold text-lg mb-2">Built on AT Protocol</h3> 42 + <p className="text-gray-600 text-sm"> 43 + Your data is stored on the AT Protocol, giving you true ownership 44 + and portability. 45 + </p> 46 + </div> 47 + <div className="bg-white p-6 rounded-lg shadow-sm"> 48 + <h3 className="font-semibold text-lg mb-2">Comprehensive Profile</h3> 49 + <p className="text-gray-600 text-sm"> 50 + Manage affiliations, publications, events, and social networks all 51 + in one place. 52 + </p> 53 + </div> 54 + <div className="bg-white p-6 rounded-lg shadow-sm"> 55 + <h3 className="font-semibold text-lg mb-2">DOI Integration</h3> 56 + <p className="text-gray-600 text-sm"> 57 + Add publications by DOI and automatically fetch metadata from 58 + CrossRef. 59 + </p> 60 + </div> 61 + </div> 62 + </div> 63 + </main> 64 + ); 65 + }
+5
src/components/BasicInfoSection/BasicInfoSection.constants.ts
··· 1 + import { Honorific } from '@/types'; 2 + 3 + export const HONORIFIC_OPTIONS: Honorific[] = ['Dr', 'Prof']; 4 + 5 + export const EMPTY_STATE_TEXT = 'No information added yet' as const;
+34
src/components/BasicInfoSection/BasicInfoSection.styles.ts
··· 1 + export const section = 'bg-white rounded-lg p-6 shadow-sm'; 2 + 3 + export const header = 'flex justify-between items-center gap-4'; 4 + 5 + export const title = 'text-lg font-semibold leading-snug'; 6 + 7 + export const editButton = 8 + 'px-3 py-1.5 text-sm font-medium leading-tight bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors'; 9 + 10 + export const cancelButton = 11 + 'px-3 py-1.5 text-sm font-medium leading-tight bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors'; 12 + 13 + export const content = 'flex flex-col gap-3 text-sm leading-relaxed'; 14 + 15 + export const emptyState = 'text-gray-500 italic'; 16 + 17 + export const infoItem = 'text-gray-700'; 18 + 19 + export const form = 'flex flex-col gap-4'; 20 + 21 + export const fieldGroup = 'flex flex-col gap-2'; 22 + 23 + export const label = 'text-sm font-medium text-gray-700 leading-tight'; 24 + 25 + export const checkboxGroup = 'flex flex-wrap gap-3'; 26 + 27 + export const checkboxLabel = 'flex items-center gap-2'; 28 + 29 + export const checkbox = 'w-4 h-4 rounded border-gray-300'; 30 + 31 + export const input = 32 + 'px-3 py-2 border border-gray-300 rounded-lg text-sm leading-tight focus:outline-none focus:ring-2 focus:ring-blue-500'; 33 + 34 + export const formActions = 'flex gap-2';
+198
src/components/BasicInfoSection/BasicInfoSection.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import * as styles from './BasicInfoSection.styles'; 5 + import { BasicInfoSectionProps, BasicInfoData } from './BasicInfoSection.types'; 6 + import { 7 + HONORIFIC_OPTIONS, 8 + EMPTY_STATE_TEXT, 9 + } from './BasicInfoSection.constants'; 10 + import { Honorific } from '@/types'; 11 + 12 + export const BasicInfoSection: React.FC<BasicInfoSectionProps> = ({ 13 + honorifics = [], 14 + location, 15 + onSave, 16 + }) => { 17 + const [isEditing, setIsEditing] = useState(false); 18 + const [isSaving, setIsSaving] = useState(false); 19 + 20 + // Form state 21 + const [selectedHonorifics, setSelectedHonorifics] = 22 + useState<Honorific[]>(honorifics); 23 + const [country, setCountry] = useState(location?.country || ''); 24 + const [region, setRegion] = useState(location?.region || ''); 25 + const [city, setCity] = useState(location?.city || ''); 26 + 27 + const hasData = honorifics.length > 0 || location; 28 + 29 + const handleEdit = () => { 30 + // Reset form to current values 31 + setSelectedHonorifics(honorifics); 32 + setCountry(location?.country || ''); 33 + setRegion(location?.region || ''); 34 + setCity(location?.city || ''); 35 + setIsEditing(true); 36 + }; 37 + 38 + const handleCancel = () => { 39 + setIsEditing(false); 40 + }; 41 + 42 + const handleSave = async () => { 43 + setIsSaving(true); 44 + try { 45 + const data: BasicInfoData = { 46 + honorifics: selectedHonorifics, 47 + location: 48 + country || city 49 + ? { 50 + country, 51 + region: region || undefined, 52 + city: city || undefined, 53 + } 54 + : undefined, 55 + }; 56 + await onSave(data); 57 + setIsEditing(false); 58 + } catch (error) { 59 + console.error('Error saving basic info:', error); 60 + // TODO: Show error message to user 61 + } finally { 62 + setIsSaving(false); 63 + } 64 + }; 65 + 66 + const toggleHonorific = (honorific: Honorific) => { 67 + setSelectedHonorifics((prev) => 68 + prev.includes(honorific) 69 + ? prev.filter((h) => h !== honorific) 70 + : [...prev, honorific] 71 + ); 72 + }; 73 + 74 + return ( 75 + <section className={styles.section}> 76 + {/* Header */} 77 + <div className={styles.header}> 78 + <h2 className={styles.title}>Basic Information</h2> 79 + {!isEditing && ( 80 + <button onClick={handleEdit} className={styles.editButton}> 81 + Edit 82 + </button> 83 + )} 84 + </div> 85 + 86 + {/* Content */} 87 + {isEditing ? ( 88 + <form className={styles.form} onSubmit={(e) => e.preventDefault()}> 89 + {/* Honorifics */} 90 + <div className={styles.fieldGroup}> 91 + <label className={styles.label}>Honorifics</label> 92 + <div className={styles.checkboxGroup}> 93 + {HONORIFIC_OPTIONS.map((honorific) => ( 94 + <label key={honorific} className={styles.checkboxLabel}> 95 + <input 96 + type="checkbox" 97 + checked={selectedHonorifics.includes(honorific)} 98 + onChange={() => toggleHonorific(honorific)} 99 + className={styles.checkbox} 100 + /> 101 + <span className="text-sm leading-tight">{honorific}</span> 102 + </label> 103 + ))} 104 + </div> 105 + </div> 106 + 107 + {/* Country */} 108 + <div className={styles.fieldGroup}> 109 + <label htmlFor="country" className={styles.label}> 110 + Country (ISO Code) 111 + </label> 112 + <input 113 + id="country" 114 + type="text" 115 + value={country} 116 + onChange={(e) => setCountry(e.target.value)} 117 + placeholder="e.g., US, GB, IE" 118 + className={styles.input} 119 + maxLength={2} 120 + /> 121 + </div> 122 + 123 + {/* Region */} 124 + <div className={styles.fieldGroup}> 125 + <label htmlFor="region" className={styles.label}> 126 + Region/State (Optional) 127 + </label> 128 + <input 129 + id="region" 130 + type="text" 131 + value={region} 132 + onChange={(e) => setRegion(e.target.value)} 133 + placeholder="e.g., CA, NY" 134 + className={styles.input} 135 + /> 136 + </div> 137 + 138 + {/* City */} 139 + <div className={styles.fieldGroup}> 140 + <label htmlFor="city" className={styles.label}> 141 + City (Optional) 142 + </label> 143 + <input 144 + id="city" 145 + type="text" 146 + value={city} 147 + onChange={(e) => setCity(e.target.value)} 148 + placeholder="e.g., Dublin" 149 + className={styles.input} 150 + /> 151 + </div> 152 + 153 + {/* Actions */} 154 + <div className={styles.formActions}> 155 + <button 156 + type="button" 157 + onClick={handleSave} 158 + disabled={isSaving} 159 + className={styles.editButton} 160 + > 161 + {isSaving ? 'Saving...' : 'Save'} 162 + </button> 163 + <button 164 + type="button" 165 + onClick={handleCancel} 166 + disabled={isSaving} 167 + className={styles.cancelButton} 168 + > 169 + Cancel 170 + </button> 171 + </div> 172 + </form> 173 + ) : ( 174 + <div className={styles.content}> 175 + {!hasData ? ( 176 + <p className={styles.emptyState}>{EMPTY_STATE_TEXT}</p> 177 + ) : ( 178 + <> 179 + {honorifics.length > 0 && ( 180 + <p className={styles.infoItem}> 181 + Honorifics: {honorifics.join(', ')} 182 + </p> 183 + )} 184 + {location && ( 185 + <p className={styles.infoItem}> 186 + Location:{' '} 187 + {[location.city, location.region, location.country] 188 + .filter(Boolean) 189 + .join(', ')} 190 + </p> 191 + )} 192 + </> 193 + )} 194 + </div> 195 + )} 196 + </section> 197 + ); 198 + };
+12
src/components/BasicInfoSection/BasicInfoSection.types.ts
··· 1 + import { Honorific, Location } from '@/types'; 2 + 3 + export interface BasicInfoSectionProps { 4 + honorifics?: Honorific[]; 5 + location?: Location; 6 + onSave: (data: BasicInfoData) => Promise<void>; 7 + } 8 + 9 + export interface BasicInfoData { 10 + honorifics: Honorific[]; 11 + location?: Location; 12 + }
+34
src/components/DashboardLayout/DashboardLayout.styles.ts
··· 1 + export const container = 'min-h-screen bg-gray-50'; 2 + 3 + export const header = 'bg-white border-b border-gray-200'; 4 + 5 + export const headerContent = 6 + 'flex justify-between items-center gap-4 px-4 py-4 max-w-4xl mx-auto'; 7 + 8 + export const title = 'text-xl font-bold leading-tight'; 9 + 10 + export const logoutButton = 11 + 'text-sm text-gray-600 hover:text-gray-900 leading-tight transition-colors'; 12 + 13 + export const main = 'flex flex-col gap-6 px-4 py-6 max-w-4xl mx-auto'; 14 + 15 + export const profileHeader = 16 + 'flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 bg-white rounded-lg p-6 shadow-sm'; 17 + 18 + export const profileInfo = 'flex flex-col gap-1'; 19 + 20 + export const handle = 'text-lg font-semibold leading-snug'; 21 + 22 + export const handlePrefix = 'text-gray-500'; 23 + 24 + export const actions = 'flex flex-wrap gap-2'; 25 + 26 + export const actionButton = 27 + 'px-4 py-2 text-sm font-medium leading-tight rounded-lg transition-colors'; 28 + 29 + export const viewProfileButton = 30 + 'bg-blue-600 text-white hover:bg-blue-700'; 31 + 32 + export const qrCodeButton = 'bg-white border border-gray-300 hover:bg-gray-50'; 33 + 34 + export const sections = 'flex flex-col gap-4';
+65
src/components/DashboardLayout/DashboardLayout.tsx
··· 1 + 'use client'; 2 + 3 + import Link from 'next/link'; 4 + import * as styles from './DashboardLayout.styles'; 5 + import { DashboardLayoutProps } from './DashboardLayout.types'; 6 + import { cn } from '@/lib/utils'; 7 + 8 + export const DashboardLayout: React.FC<DashboardLayoutProps> = ({ 9 + handle, 10 + children, 11 + onLogout, 12 + }) => { 13 + const handleLogoutClick = async () => { 14 + if (onLogout) { 15 + onLogout(); 16 + } else { 17 + await fetch('/api/auth/logout', { method: 'POST' }); 18 + window.location.href = '/'; 19 + } 20 + }; 21 + 22 + return ( 23 + <div className={styles.container}> 24 + {/* Header */} 25 + <header className={styles.header}> 26 + <div className={styles.headerContent}> 27 + <h1 className={styles.title}>Lanyard Dashboard</h1> 28 + <button onClick={handleLogoutClick} className={styles.logoutButton}> 29 + Logout 30 + </button> 31 + </div> 32 + </header> 33 + 34 + {/* Main Content */} 35 + <main className={styles.main}> 36 + {/* Profile Header with Actions */} 37 + <div className={styles.profileHeader}> 38 + <div className={styles.profileInfo}> 39 + <p className={styles.handle}> 40 + <span className={styles.handlePrefix}>@</span> 41 + {handle} 42 + </p> 43 + </div> 44 + <div className={styles.actions}> 45 + <Link 46 + href={`/${handle}`} 47 + className={cn(styles.actionButton, styles.viewProfileButton)} 48 + > 49 + View Public Profile 50 + </Link> 51 + <Link 52 + href={`/${handle}/qr`} 53 + className={cn(styles.actionButton, styles.qrCodeButton)} 54 + > 55 + QR Code 56 + </Link> 57 + </div> 58 + </div> 59 + 60 + {/* Sections */} 61 + <div className={styles.sections}>{children}</div> 62 + </main> 63 + </div> 64 + ); 65 + };
+5
src/components/DashboardLayout/DashboardLayout.types.ts
··· 1 + export interface DashboardLayoutProps { 2 + handle: string; 3 + children: React.ReactNode; 4 + onLogout?: () => void; 5 + }
+129
src/components/README.md
··· 1 + # Component Structure 2 + 3 + All components follow a consistent 4-file system. 4 + 5 + ## File Structure 6 + 7 + ``` 8 + /ComponentName/ 9 + ├── ComponentName.tsx # Component implementation 10 + ├── ComponentName.types.ts # TypeScript interfaces 11 + ├── ComponentName.styles.ts # Tailwind class strings 12 + └── ComponentName.constants.ts # Hardcoded values, configs 13 + ``` 14 + 15 + **Simple components** may skip `.constants.ts` if they have no hardcoded values. 16 + 17 + ## Quick Reference 18 + 19 + ### ComponentName.tsx 20 + Component logic and JSX. Import from sibling files. 21 + 22 + ```typescript 23 + import * as styles from './Button.styles'; 24 + import { DEFAULT_VARIANT } from './Button.constants'; 25 + import { ButtonProps } from './Button.types'; 26 + 27 + export const Button: React.FC<ButtonProps> = ({ 28 + variant = DEFAULT_VARIANT, 29 + children 30 + }) => ( 31 + <button className={styles.getButtonStyles(variant)}> 32 + {children} 33 + </button> 34 + ); 35 + ``` 36 + 37 + ### ComponentName.types.ts 38 + All TypeScript interfaces and types. 39 + 40 + ```typescript 41 + export interface ButtonProps { 42 + variant?: 'primary' | 'secondary'; 43 + children: React.ReactNode; 44 + } 45 + ``` 46 + 47 + ### ComponentName.styles.ts 48 + Tailwind class strings. Use `cn()` for dynamic styles. 49 + 50 + ```typescript 51 + import { cn } from '@/lib/utils'; 52 + 53 + export const button = 'px-4 py-2 rounded font-medium'; 54 + 55 + export const getButtonStyles = (variant: string) => 56 + cn(button, variant === 'primary' ? 'bg-blue-600' : 'bg-gray-200'); 57 + ``` 58 + 59 + ### ComponentName.constants.ts 60 + Extract hardcoded values here. 61 + 62 + ```typescript 63 + export const DEFAULT_VARIANT = 'primary' as const; 64 + 65 + export const SOCIAL_LINKS = [ 66 + { href: 'https://github.com', label: 'GitHub' }, 67 + ] as const; 68 + ``` 69 + 70 + ## Styling Rules 71 + 72 + 1. **Use Tailwind utilities only** - No inline styles or CSS modules 73 + 2. **Never use margin** - Use `gap` for spacing between children, `padding` for internal spacing 74 + 3. **Always include line-height** - Every text element needs leading-* 75 + 4. **Scale responsively** - Use breakpoint prefixes: `text-4xl md:text-6xl` 76 + 77 + **Good:** 78 + ```typescript 79 + export const container = 'flex flex-col gap-4 p-6'; 80 + ``` 81 + 82 + **Bad:** 83 + ```typescript 84 + export const container = 'flex flex-col mt-4 mb-8'; // ❌ No margin! 85 + ``` 86 + 87 + ## Common Patterns 88 + 89 + ### Base + Variant 90 + **Card** is the base component. **CardArticle**, **CardRole**, **CardStudy** wrap it with domain-specific logic. 91 + 92 + ```typescript 93 + // CardArticle wraps base Card 94 + import { Card } from '@/components/Card/Card'; 95 + 96 + export const CardArticle: React.FC<CardArticleProps> = ({ article }) => ( 97 + <a href={article.url}> 98 + <Card title={article.title} description={article.subtitle} /> 99 + </a> 100 + ); 101 + ``` 102 + 103 + ### Context-Aware 104 + **Section** provides theme context. **Button**, **Heading**, etc. read from it. 105 + 106 + ```typescript 107 + <Section theme="blue"> 108 + <Button /> {/* Automatically styled for blue theme */} 109 + </Section> 110 + ``` 111 + 112 + ## Design System 113 + 114 + **Colors:** `bones-blue`, `bones-white`, `bones-black`, `bones-yellow` 115 + **Fonts:** `font-sans` (DM Sans), `font-serif` (DM Serif Display) 116 + **Themes:** `mono`, `gray`, `yellow`, `blue`, `red`, `purple` 117 + 118 + ## Quick Start 119 + 120 + ```bash 121 + # Create new component 122 + mkdir src/components/NewComponent 123 + cd src/components/NewComponent 124 + 125 + # Create files 126 + touch NewComponent.tsx NewComponent.types.ts NewComponent.styles.ts NewComponent.constants.ts 127 + ``` 128 + 129 + Look at **Button**, **Card**, or **Navigation** for examples.
+16
src/components/WorksSection/WorksSection.constants.ts
··· 1 + import { WorkType } from '@/types'; 2 + 3 + export const WORK_TYPES: { value: WorkType; label: string }[] = [ 4 + { value: 'journal-article', label: 'Journal Article' }, 5 + { value: 'conference-proceeding', label: 'Conference Proceeding' }, 6 + { value: 'paper', label: 'Paper' }, 7 + { value: 'poster', label: 'Poster' }, 8 + { value: 'abstract', label: 'Abstract' }, 9 + { value: 'preprint', label: 'Preprint' }, 10 + { value: 'book', label: 'Book' }, 11 + { value: 'book-chapter', label: 'Book Chapter' }, 12 + { value: 'dataset', label: 'Dataset' }, 13 + { value: 'other', label: 'Other' }, 14 + ]; 15 + 16 + export const EMPTY_STATE_TEXT = 'No publications added yet' as const;
+43
src/components/WorksSection/WorksSection.styles.ts
··· 1 + export const section = 'bg-white rounded-lg p-6 shadow-sm'; 2 + 3 + export const header = 'flex justify-between items-center gap-4'; 4 + 5 + export const title = 'text-lg font-semibold leading-snug'; 6 + 7 + export const addButton = 8 + 'px-3 py-1.5 text-sm font-medium leading-tight bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors'; 9 + 10 + export const cancelButton = 11 + 'px-3 py-1.5 text-sm font-medium leading-tight bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors'; 12 + 13 + export const content = 'flex flex-col gap-3'; 14 + 15 + export const emptyState = 'text-gray-500 italic text-sm leading-relaxed'; 16 + 17 + export const worksList = 'flex flex-col gap-3'; 18 + 19 + export const workItem = 20 + 'flex justify-between items-start gap-4 p-3 border border-gray-200 rounded-lg'; 21 + 22 + export const workInfo = 'flex flex-col gap-1 flex-1'; 23 + 24 + export const workTitle = 'font-medium text-sm leading-snug'; 25 + 26 + export const workMeta = 'text-xs text-gray-600 leading-relaxed'; 27 + 28 + export const deleteButton = 29 + 'px-2 py-1 text-xs text-red-600 hover:text-red-700 leading-tight transition-colors'; 30 + 31 + export const form = 'flex flex-col gap-4'; 32 + 33 + export const fieldGroup = 'flex flex-col gap-2'; 34 + 35 + export const label = 'text-sm font-medium text-gray-700 leading-tight'; 36 + 37 + export const input = 38 + 'px-3 py-2 border border-gray-300 rounded-lg text-sm leading-tight focus:outline-none focus:ring-2 focus:ring-blue-500'; 39 + 40 + export const select = 41 + 'px-3 py-2 border border-gray-300 rounded-lg text-sm leading-tight focus:outline-none focus:ring-2 focus:ring-blue-500'; 42 + 43 + export const formActions = 'flex gap-2';
+165
src/components/WorksSection/WorksSection.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import * as styles from './WorksSection.styles'; 5 + import { WorksSectionProps } from './WorksSection.types'; 6 + import { WORK_TYPES, EMPTY_STATE_TEXT } from './WorksSection.constants'; 7 + 8 + export const WorksSection: React.FC<WorksSectionProps> = ({ 9 + works, 10 + onAdd, 11 + onDelete, 12 + }) => { 13 + const [isAdding, setIsAdding] = useState(false); 14 + const [isSaving, setIsSaving] = useState(false); 15 + const [doi, setDoi] = useState(''); 16 + const [type, setType] = useState('journal-article'); 17 + 18 + const handleAdd = () => { 19 + setDoi(''); 20 + setType('journal-article'); 21 + setIsAdding(true); 22 + }; 23 + 24 + const handleCancel = () => { 25 + setIsAdding(false); 26 + }; 27 + 28 + const handleSave = async () => { 29 + if (!doi.trim()) return; 30 + 31 + setIsSaving(true); 32 + try { 33 + await onAdd(doi.trim(), type); 34 + setIsAdding(false); 35 + setDoi(''); 36 + setType('journal-article'); 37 + } catch (error) { 38 + console.error('Error adding work:', error); 39 + // TODO: Show error message 40 + } finally { 41 + setIsSaving(false); 42 + } 43 + }; 44 + 45 + const handleDelete = async (workDoi: string) => { 46 + if (!confirm('Are you sure you want to delete this publication?')) return; 47 + try { 48 + await onDelete(workDoi); 49 + } catch (error) { 50 + console.error('Error deleting work:', error); 51 + } 52 + }; 53 + 54 + return ( 55 + <section className={styles.section}> 56 + {/* Header */} 57 + <div className={styles.header}> 58 + <h2 className={styles.title}> 59 + Publications ({works.length}) 60 + </h2> 61 + {!isAdding && ( 62 + <button onClick={handleAdd} className={styles.addButton}> 63 + + Add DOI 64 + </button> 65 + )} 66 + </div> 67 + 68 + {/* Content */} 69 + <div className={styles.content}> 70 + {isAdding && ( 71 + <form className={styles.form} onSubmit={(e) => e.preventDefault()}> 72 + {/* DOI */} 73 + <div className={styles.fieldGroup}> 74 + <label htmlFor="doi" className={styles.label}> 75 + DOI 76 + </label> 77 + <input 78 + id="doi" 79 + type="text" 80 + value={doi} 81 + onChange={(e) => setDoi(e.target.value)} 82 + placeholder="e.g., 10.1038/nature12373" 83 + className={styles.input} 84 + autoFocus 85 + /> 86 + </div> 87 + 88 + {/* Type */} 89 + <div className={styles.fieldGroup}> 90 + <label htmlFor="type" className={styles.label}> 91 + Type 92 + </label> 93 + <select 94 + id="type" 95 + value={type} 96 + onChange={(e) => setType(e.target.value)} 97 + className={styles.select} 98 + > 99 + {WORK_TYPES.map((workType) => ( 100 + <option key={workType.value} value={workType.value}> 101 + {workType.label} 102 + </option> 103 + ))} 104 + </select> 105 + </div> 106 + 107 + {/* Actions */} 108 + <div className={styles.formActions}> 109 + <button 110 + type="button" 111 + onClick={handleSave} 112 + disabled={isSaving || !doi.trim()} 113 + className={styles.addButton} 114 + > 115 + {isSaving ? 'Adding...' : 'Add'} 116 + </button> 117 + <button 118 + type="button" 119 + onClick={handleCancel} 120 + disabled={isSaving} 121 + className={styles.cancelButton} 122 + > 123 + Cancel 124 + </button> 125 + </div> 126 + </form> 127 + )} 128 + 129 + {works.length === 0 && !isAdding ? ( 130 + <p className={styles.emptyState}>{EMPTY_STATE_TEXT}</p> 131 + ) : ( 132 + <div className={styles.worksList}> 133 + {works.map((work) => ( 134 + <div key={work.doi} className={styles.workItem}> 135 + <div className={styles.workInfo}> 136 + <p className={styles.workTitle}> 137 + {work.title || work.doi} 138 + </p> 139 + {work.authors && work.authors.length > 0 && ( 140 + <p className={styles.workMeta}> 141 + {work.authors.join(', ')} 142 + </p> 143 + )} 144 + {(work.journal || work.publicationDate) && ( 145 + <p className={styles.workMeta}> 146 + {[work.journal, work.publicationDate] 147 + .filter(Boolean) 148 + .join(' · ')} 149 + </p> 150 + )} 151 + </div> 152 + <button 153 + onClick={() => handleDelete(work.doi)} 154 + className={styles.deleteButton} 155 + > 156 + Delete 157 + </button> 158 + </div> 159 + ))} 160 + </div> 161 + )} 162 + </div> 163 + </section> 164 + ); 165 + };
+7
src/components/WorksSection/WorksSection.types.ts
··· 1 + import { Work } from '@/types'; 2 + 3 + export interface WorksSectionProps { 4 + works: Work[]; 5 + onAdd: (doi: string, type: string) => Promise<void>; 6 + onDelete: (doi: string) => Promise<void>; 7 + }
+114
src/components/auth/LoginForm.tsx
··· 1 + 'use client'; 2 + 3 + import { useState, useEffect } from 'react'; 4 + 5 + export default function LoginForm() { 6 + const [handle, setHandle] = useState(''); 7 + const [loading, setLoading] = useState(false); 8 + const [error, setError] = useState(''); 9 + const [authMethod, setAuthMethod] = useState<'oauth' | 'app_password'>( 10 + 'app_password' 11 + ); 12 + 13 + useEffect(() => { 14 + // Fetch auth method from server 15 + fetch('/api/auth/method') 16 + .then((res) => res.json()) 17 + .then((data) => setAuthMethod(data.method)) 18 + .catch(() => { 19 + // Default to app_password if fetch fails 20 + setAuthMethod('app_password'); 21 + }); 22 + }, []); 23 + 24 + const handleSubmit = async (e: React.FormEvent) => { 25 + e.preventDefault(); 26 + setLoading(true); 27 + setError(''); 28 + 29 + try { 30 + const response = await fetch('/api/auth/login', { 31 + method: 'POST', 32 + headers: { 33 + 'Content-Type': 'application/json', 34 + }, 35 + body: JSON.stringify({ handle }), 36 + }); 37 + 38 + const data = await response.json(); 39 + 40 + if (!response.ok) { 41 + throw new Error(data.error || 'Failed to login'); 42 + } 43 + 44 + // Handle different response types 45 + if (data.redirect) { 46 + // App password mode - direct redirect 47 + window.location.href = data.redirect; 48 + } else if (data.authUrl) { 49 + // OAuth mode - redirect to authorization URL 50 + window.location.href = data.authUrl; 51 + } 52 + } catch (err) { 53 + setError(err instanceof Error ? err.message : 'An error occurred'); 54 + setLoading(false); 55 + } 56 + }; 57 + 58 + return ( 59 + <form onSubmit={handleSubmit} className="w-full max-w-md space-y-4"> 60 + {authMethod === 'oauth' && ( 61 + <div> 62 + <label 63 + htmlFor="handle" 64 + className="block text-sm font-medium text-gray-700 mb-2" 65 + > 66 + Bluesky Handle 67 + </label> 68 + <input 69 + type="text" 70 + id="handle" 71 + value={handle} 72 + onChange={(e) => setHandle(e.target.value)} 73 + placeholder="username.bsky.social" 74 + className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 75 + required 76 + disabled={loading} 77 + /> 78 + <p className="mt-2 text-sm text-gray-500"> 79 + Enter your Bluesky handle or custom domain 80 + </p> 81 + </div> 82 + )} 83 + 84 + {authMethod === 'app_password' && ( 85 + <div className="bg-blue-50 border border-blue-200 rounded-lg p-4"> 86 + <p className="text-sm text-blue-900"> 87 + Using configured Bluesky account for authentication 88 + </p> 89 + <p className="text-xs text-blue-700 mt-1"> 90 + Authentication method: App Password 91 + </p> 92 + </div> 93 + )} 94 + 95 + {error && ( 96 + <div className="p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"> 97 + {error} 98 + </div> 99 + )} 100 + 101 + <button 102 + type="submit" 103 + disabled={loading || (authMethod === 'oauth' && !handle)} 104 + className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors" 105 + > 106 + {loading ? 'Connecting...' : 'Sign in with Bluesky'} 107 + </button> 108 + 109 + <p className="text-xs text-gray-500 text-center"> 110 + Sign in to access your Lanyard profile 111 + </p> 112 + </form> 113 + ); 114 + }
+278
src/components/events/EventForm.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import { useRouter } from 'next/navigation'; 5 + import type { Event, EventType } from '@/types'; 6 + 7 + interface EventFormProps { 8 + mode: 'create' | 'edit'; 9 + initialData?: Event; 10 + eventIndex?: number; 11 + } 12 + 13 + const EVENT_TYPES: { value: EventType; label: string }[] = [ 14 + { value: 'conference', label: 'Conference' }, 15 + { value: 'symposium', label: 'Symposium' }, 16 + { value: 'workshop', label: 'Workshop' }, 17 + { value: 'seminar', label: 'Seminar' }, 18 + { value: 'lecture', label: 'Lecture' }, 19 + { value: 'poster-session', label: 'Poster Session' }, 20 + { value: 'webinar', label: 'Webinar' }, 21 + { value: 'other', label: 'Other' }, 22 + ]; 23 + 24 + export default function EventForm({ 25 + mode, 26 + initialData, 27 + eventIndex, 28 + }: EventFormProps) { 29 + const router = useRouter(); 30 + const [loading, setLoading] = useState(false); 31 + const [error, setError] = useState(''); 32 + 33 + const [formData, setFormData] = useState({ 34 + name: initialData?.name || '', 35 + type: initialData?.type || ('' as EventType | ''), 36 + startDate: initialData?.startDate 37 + ? new Date(initialData.startDate).toISOString().split('T')[0] 38 + : '', 39 + endDate: initialData?.endDate 40 + ? new Date(initialData.endDate).toISOString().split('T')[0] 41 + : '', 42 + city: initialData?.location?.city || '', 43 + country: initialData?.location?.country || '', 44 + url: initialData?.url || '', 45 + }); 46 + 47 + const handleSubmit = async (e: React.FormEvent) => { 48 + e.preventDefault(); 49 + setLoading(true); 50 + setError(''); 51 + 52 + try { 53 + const payload = { 54 + name: formData.name, 55 + type: formData.type, 56 + startDate: new Date(formData.startDate).toISOString(), 57 + endDate: formData.endDate 58 + ? new Date(formData.endDate).toISOString() 59 + : undefined, 60 + location: 61 + formData.city || formData.country 62 + ? { city: formData.city, country: formData.country } 63 + : undefined, 64 + url: formData.url || undefined, 65 + }; 66 + 67 + const url = 68 + mode === 'edit' 69 + ? `/api/profile/events?index=${eventIndex}` 70 + : '/api/profile/events'; 71 + 72 + const response = await fetch(url, { 73 + method: mode === 'create' ? 'POST' : 'PUT', 74 + headers: { 75 + 'Content-Type': 'application/json', 76 + }, 77 + body: JSON.stringify(payload), 78 + }); 79 + 80 + if (!response.ok) { 81 + const data = await response.json(); 82 + throw new Error(data.error || `Failed to ${mode} event`); 83 + } 84 + 85 + router.push('/dashboard/events'); 86 + router.refresh(); 87 + } catch (err) { 88 + setError(err instanceof Error ? err.message : 'An error occurred'); 89 + setLoading(false); 90 + } 91 + }; 92 + 93 + const handleDelete = async () => { 94 + if (!confirm('Are you sure you want to delete this event?')) { 95 + return; 96 + } 97 + 98 + setLoading(true); 99 + setError(''); 100 + 101 + try { 102 + const response = await fetch( 103 + `/api/profile/events?index=${eventIndex}`, 104 + { 105 + method: 'DELETE', 106 + } 107 + ); 108 + 109 + if (!response.ok) { 110 + const data = await response.json(); 111 + throw new Error(data.error || 'Failed to delete event'); 112 + } 113 + 114 + router.push('/dashboard/events'); 115 + router.refresh(); 116 + } catch (err) { 117 + setError(err instanceof Error ? err.message : 'An error occurred'); 118 + setLoading(false); 119 + } 120 + }; 121 + 122 + return ( 123 + <form onSubmit={handleSubmit} className="bg-white rounded-lg p-6 shadow-sm"> 124 + <div className="space-y-4"> 125 + <div> 126 + <label className="block text-sm font-medium text-gray-700 mb-2"> 127 + Event Name * 128 + </label> 129 + <input 130 + type="text" 131 + value={formData.name} 132 + onChange={(e) => setFormData({ ...formData, name: e.target.value })} 133 + required 134 + placeholder="e.g., NeurIPS 2024" 135 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 136 + /> 137 + </div> 138 + 139 + <div> 140 + <label className="block text-sm font-medium text-gray-700 mb-2"> 141 + Type * 142 + </label> 143 + <select 144 + value={formData.type} 145 + onChange={(e) => 146 + setFormData({ ...formData, type: e.target.value as EventType }) 147 + } 148 + required 149 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 150 + > 151 + <option value="">Select type...</option> 152 + {EVENT_TYPES.map((type) => ( 153 + <option key={type.value} value={type.value}> 154 + {type.label} 155 + </option> 156 + ))} 157 + </select> 158 + </div> 159 + 160 + <div className="grid grid-cols-2 gap-4"> 161 + <div> 162 + <label className="block text-sm font-medium text-gray-700 mb-2"> 163 + Start Date * 164 + </label> 165 + <input 166 + type="date" 167 + value={formData.startDate} 168 + onChange={(e) => 169 + setFormData({ ...formData, startDate: e.target.value }) 170 + } 171 + required 172 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 173 + /> 174 + </div> 175 + <div> 176 + <label className="block text-sm font-medium text-gray-700 mb-2"> 177 + End Date 178 + </label> 179 + <input 180 + type="date" 181 + value={formData.endDate} 182 + onChange={(e) => 183 + setFormData({ ...formData, endDate: e.target.value }) 184 + } 185 + min={formData.startDate} 186 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 187 + /> 188 + </div> 189 + </div> 190 + 191 + <div className="grid grid-cols-2 gap-4"> 192 + <div> 193 + <label className="block text-sm font-medium text-gray-700 mb-2"> 194 + City 195 + </label> 196 + <input 197 + type="text" 198 + value={formData.city} 199 + onChange={(e) => 200 + setFormData({ ...formData, city: e.target.value }) 201 + } 202 + placeholder="e.g., San Francisco" 203 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 204 + /> 205 + </div> 206 + <div> 207 + <label className="block text-sm font-medium text-gray-700 mb-2"> 208 + Country 209 + </label> 210 + <input 211 + type="text" 212 + value={formData.country} 213 + onChange={(e) => 214 + setFormData({ ...formData, country: e.target.value }) 215 + } 216 + placeholder="e.g., USA" 217 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 218 + /> 219 + </div> 220 + </div> 221 + 222 + <div> 223 + <label className="block text-sm font-medium text-gray-700 mb-2"> 224 + Website URL 225 + </label> 226 + <input 227 + type="url" 228 + value={formData.url} 229 + onChange={(e) => setFormData({ ...formData, url: e.target.value })} 230 + placeholder="https://example.com" 231 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 232 + /> 233 + </div> 234 + </div> 235 + 236 + {error && ( 237 + <div className="mt-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"> 238 + {error} 239 + </div> 240 + )} 241 + 242 + <div className="flex flex-col gap-3 mt-6"> 243 + <button 244 + type="submit" 245 + disabled={loading} 246 + className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors" 247 + > 248 + {loading 249 + ? mode === 'create' 250 + ? 'Adding...' 251 + : 'Saving...' 252 + : mode === 'create' 253 + ? 'Add Event' 254 + : 'Save Changes'} 255 + </button> 256 + 257 + <button 258 + type="button" 259 + onClick={() => router.push('/dashboard/events')} 260 + className="w-full py-3 px-6 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors" 261 + > 262 + Cancel 263 + </button> 264 + 265 + {mode === 'edit' && ( 266 + <button 267 + type="button" 268 + onClick={handleDelete} 269 + disabled={loading} 270 + className="w-full text-red-600 py-2 hover:text-red-700 disabled:text-gray-400" 271 + > 272 + Delete Event 273 + </button> 274 + )} 275 + </div> 276 + </form> 277 + ); 278 + }
+290
src/components/links/LinkForm.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import { useRouter } from 'next/navigation'; 5 + import type { Link as WebLink, LinkType, LinkPlatform } from '@/types'; 6 + 7 + interface LinkFormProps { 8 + mode: 'create' | 'edit'; 9 + initialData?: WebLink; 10 + linkIndex?: number; 11 + } 12 + 13 + const LINK_TYPES: { value: LinkType; label: string }[] = [ 14 + { value: 'social', label: 'Social Media' }, 15 + { value: 'academic', label: 'Academic Profile' }, 16 + { value: 'web', label: 'Custom Web Link' }, 17 + ]; 18 + 19 + const PLATFORMS: Record<LinkType, { value: LinkPlatform; label: string }[]> = { 20 + social: [ 21 + { value: 'bluesky', label: 'Bluesky' }, 22 + { value: 'twitter', label: 'Twitter' }, 23 + { value: 'linkedin', label: 'LinkedIn' }, 24 + ], 25 + academic: [ 26 + { value: 'orcid', label: 'ORCID' }, 27 + { value: 'googlescholar', label: 'Google Scholar' }, 28 + { value: 'researchgate', label: 'ResearchGate' }, 29 + { value: 'semble', label: 'Semble' }, 30 + ], 31 + web: [{ value: 'custom', label: 'Custom Link' }], 32 + }; 33 + 34 + export default function LinkForm({ 35 + mode, 36 + initialData, 37 + linkIndex, 38 + }: LinkFormProps) { 39 + const router = useRouter(); 40 + const [loading, setLoading] = useState(false); 41 + const [error, setError] = useState(''); 42 + 43 + const [formData, setFormData] = useState({ 44 + type: initialData?.type || ('' as LinkType | ''), 45 + platform: initialData?.platform || ('' as LinkPlatform | ''), 46 + url: initialData?.url || '', 47 + title: initialData?.title || '', 48 + username: initialData?.username || '', 49 + }); 50 + 51 + const availablePlatforms = 52 + formData.type && PLATFORMS[formData.type] ? PLATFORMS[formData.type] : []; 53 + 54 + const handleTypeChange = (newType: LinkType) => { 55 + setFormData({ 56 + ...formData, 57 + type: newType, 58 + platform: '', // Reset platform when type changes 59 + }); 60 + }; 61 + 62 + const handleSubmit = async (e: React.FormEvent) => { 63 + e.preventDefault(); 64 + setLoading(true); 65 + setError(''); 66 + 67 + try { 68 + const payload = { 69 + type: formData.type, 70 + platform: formData.platform, 71 + url: formData.url, 72 + title: formData.title || undefined, 73 + username: formData.username || undefined, 74 + }; 75 + 76 + const url = 77 + mode === 'edit' 78 + ? `/api/profile/links?index=${linkIndex}` 79 + : '/api/profile/links'; 80 + 81 + const response = await fetch(url, { 82 + method: mode === 'create' ? 'POST' : 'PUT', 83 + headers: { 84 + 'Content-Type': 'application/json', 85 + }, 86 + body: JSON.stringify(payload), 87 + }); 88 + 89 + if (!response.ok) { 90 + const data = await response.json(); 91 + throw new Error(data.error || `Failed to ${mode} link`); 92 + } 93 + 94 + router.push('/dashboard/links'); 95 + router.refresh(); 96 + } catch (err) { 97 + setError(err instanceof Error ? err.message : 'An error occurred'); 98 + setLoading(false); 99 + } 100 + }; 101 + 102 + const handleDelete = async () => { 103 + if (!confirm('Are you sure you want to delete this link?')) { 104 + return; 105 + } 106 + 107 + setLoading(true); 108 + setError(''); 109 + 110 + try { 111 + const response = await fetch(`/api/profile/links?index=${linkIndex}`, { 112 + method: 'DELETE', 113 + }); 114 + 115 + if (!response.ok) { 116 + const data = await response.json(); 117 + throw new Error(data.error || 'Failed to delete link'); 118 + } 119 + 120 + router.push('/dashboard/links'); 121 + router.refresh(); 122 + } catch (err) { 123 + setError(err instanceof Error ? err.message : 'An error occurred'); 124 + setLoading(false); 125 + } 126 + }; 127 + 128 + const showTitle = formData.type === 'web'; 129 + const showUsername = formData.type === 'social' || formData.type === 'academic'; 130 + 131 + return ( 132 + <form onSubmit={handleSubmit} className="bg-white rounded-lg p-6 shadow-sm"> 133 + <div className="space-y-4"> 134 + <div> 135 + <label className="block text-sm font-medium text-gray-700 mb-2"> 136 + Link Type * 137 + </label> 138 + <select 139 + value={formData.type} 140 + onChange={(e) => handleTypeChange(e.target.value as LinkType)} 141 + required 142 + disabled={mode === 'edit'} 143 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100" 144 + > 145 + <option value="">Select type...</option> 146 + {LINK_TYPES.map((type) => ( 147 + <option key={type.value} value={type.value}> 148 + {type.label} 149 + </option> 150 + ))} 151 + </select> 152 + {mode === 'edit' && ( 153 + <p className="mt-1 text-sm text-gray-500"> 154 + Type cannot be changed after creation 155 + </p> 156 + )} 157 + </div> 158 + 159 + {formData.type && ( 160 + <div> 161 + <label className="block text-sm font-medium text-gray-700 mb-2"> 162 + Platform * 163 + </label> 164 + <select 165 + value={formData.platform} 166 + onChange={(e) => 167 + setFormData({ 168 + ...formData, 169 + platform: e.target.value as LinkPlatform, 170 + }) 171 + } 172 + required 173 + disabled={mode === 'edit'} 174 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100" 175 + > 176 + <option value="">Select platform...</option> 177 + {availablePlatforms.map((platform) => ( 178 + <option key={platform.value} value={platform.value}> 179 + {platform.label} 180 + </option> 181 + ))} 182 + </select> 183 + {mode === 'edit' && ( 184 + <p className="mt-1 text-sm text-gray-500"> 185 + Platform cannot be changed after creation 186 + </p> 187 + )} 188 + </div> 189 + )} 190 + 191 + <div> 192 + <label className="block text-sm font-medium text-gray-700 mb-2"> 193 + URL * 194 + </label> 195 + <input 196 + type="url" 197 + value={formData.url} 198 + onChange={(e) => setFormData({ ...formData, url: e.target.value })} 199 + required 200 + placeholder="https://example.com" 201 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 202 + /> 203 + </div> 204 + 205 + {showTitle && ( 206 + <div> 207 + <label className="block text-sm font-medium text-gray-700 mb-2"> 208 + Title 209 + </label> 210 + <input 211 + type="text" 212 + value={formData.title} 213 + onChange={(e) => 214 + setFormData({ ...formData, title: e.target.value }) 215 + } 216 + placeholder="e.g., Personal Website" 217 + maxLength={100} 218 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 219 + /> 220 + <p className="mt-1 text-sm text-gray-500"> 221 + Display name for this link 222 + </p> 223 + </div> 224 + )} 225 + 226 + {showUsername && ( 227 + <div> 228 + <label className="block text-sm font-medium text-gray-700 mb-2"> 229 + Username/Handle 230 + </label> 231 + <input 232 + type="text" 233 + value={formData.username} 234 + onChange={(e) => 235 + setFormData({ ...formData, username: e.target.value }) 236 + } 237 + placeholder="e.g., johndoe" 238 + maxLength={100} 239 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 240 + /> 241 + <p className="mt-1 text-sm text-gray-500"> 242 + Your username on this platform 243 + </p> 244 + </div> 245 + )} 246 + </div> 247 + 248 + {error && ( 249 + <div className="mt-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"> 250 + {error} 251 + </div> 252 + )} 253 + 254 + <div className="flex flex-col gap-3 mt-6"> 255 + <button 256 + type="submit" 257 + disabled={loading} 258 + className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors" 259 + > 260 + {loading 261 + ? mode === 'create' 262 + ? 'Adding...' 263 + : 'Saving...' 264 + : mode === 'create' 265 + ? 'Add Link' 266 + : 'Save Changes'} 267 + </button> 268 + 269 + <button 270 + type="button" 271 + onClick={() => router.push('/dashboard/links')} 272 + className="w-full py-3 px-6 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors" 273 + > 274 + Cancel 275 + </button> 276 + 277 + {mode === 'edit' && ( 278 + <button 279 + type="button" 280 + onClick={handleDelete} 281 + disabled={loading} 282 + className="w-full text-red-600 py-2 hover:text-red-700 disabled:text-gray-400" 283 + > 284 + Delete Link 285 + </button> 286 + )} 287 + </div> 288 + </form> 289 + ); 290 + }
+231
src/components/profile/ProfileForm.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import { useRouter } from 'next/navigation'; 5 + import type { Researcher } from '@/types'; 6 + 7 + interface ProfileFormProps { 8 + profile: Researcher; 9 + } 10 + 11 + const HONORIFIC_OPTIONS = [ 12 + { value: 'Dr', label: 'Dr' }, 13 + { value: 'Prof', label: 'Prof' }, 14 + ]; 15 + 16 + export default function ProfileForm({ profile }: ProfileFormProps) { 17 + const router = useRouter(); 18 + const [loading, setLoading] = useState(false); 19 + const [error, setError] = useState(''); 20 + 21 + const [formData, setFormData] = useState({ 22 + honorifics: profile.honorifics || [], 23 + city: profile.location?.city || '', 24 + country: profile.location?.country || '', 25 + }); 26 + 27 + const handleHonorificToggle = (honorific: 'Dr' | 'Prof') => { 28 + const current = formData.honorifics || []; 29 + if (current.includes(honorific)) { 30 + setFormData({ 31 + ...formData, 32 + honorifics: current.filter((h) => h !== honorific), 33 + }); 34 + } else { 35 + setFormData({ 36 + ...formData, 37 + honorifics: [...current, honorific], 38 + }); 39 + } 40 + }; 41 + 42 + const handleSubmit = async (e: React.FormEvent) => { 43 + e.preventDefault(); 44 + setLoading(true); 45 + setError(''); 46 + 47 + try { 48 + const payload = { 49 + honorifics: formData.honorifics.length > 0 ? formData.honorifics : undefined, 50 + location: 51 + formData.city || formData.country 52 + ? { 53 + city: formData.city || undefined, 54 + country: formData.country || undefined, 55 + } 56 + : undefined, 57 + }; 58 + 59 + const response = await fetch('/api/profile/basics', { 60 + method: 'PUT', 61 + headers: { 62 + 'Content-Type': 'application/json', 63 + }, 64 + body: JSON.stringify(payload), 65 + }); 66 + 67 + if (!response.ok) { 68 + const data = await response.json(); 69 + throw new Error(data.error || 'Failed to update profile'); 70 + } 71 + 72 + router.push('/dashboard'); 73 + router.refresh(); 74 + } catch (err) { 75 + setError(err instanceof Error ? err.message : 'An error occurred'); 76 + setLoading(false); 77 + } 78 + }; 79 + 80 + return ( 81 + <div className="space-y-4"> 82 + {/* Profile Preview (Locked Fields) */} 83 + <div className="bg-white rounded-lg p-6 shadow-sm"> 84 + <h2 className="font-semibold mb-4 flex items-center gap-2"> 85 + <span>Bluesky Profile</span> 86 + <span className="text-xs bg-gray-100 text-gray-600 px-2 py-1 rounded flex items-center gap-1"> 87 + <svg 88 + className="w-3 h-3" 89 + fill="none" 90 + stroke="currentColor" 91 + viewBox="0 0 24 24" 92 + > 93 + <path 94 + strokeLinecap="round" 95 + strokeLinejoin="round" 96 + strokeWidth={2} 97 + d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" 98 + /> 99 + </svg> 100 + Locked 101 + </span> 102 + </h2> 103 + <div className="space-y-3"> 104 + <div> 105 + <label className="block text-sm font-medium text-gray-700 mb-1"> 106 + Display Name 107 + </label> 108 + <div className="text-gray-900 bg-gray-50 px-4 py-2 rounded-lg"> 109 + {profile.displayName || 'Not set'} 110 + </div> 111 + </div> 112 + <div> 113 + <label className="block text-sm font-medium text-gray-700 mb-1"> 114 + Handle 115 + </label> 116 + <div className="text-gray-900 bg-gray-50 px-4 py-2 rounded-lg"> 117 + @{profile.handle} 118 + </div> 119 + </div> 120 + {profile.description && ( 121 + <div> 122 + <label className="block text-sm font-medium text-gray-700 mb-1"> 123 + Bio 124 + </label> 125 + <div className="text-gray-900 bg-gray-50 px-4 py-2 rounded-lg"> 126 + {profile.description} 127 + </div> 128 + </div> 129 + )} 130 + </div> 131 + <p className="text-xs text-gray-500 mt-4"> 132 + These fields are synced from your Bluesky profile and cannot be 133 + edited here. Update them on Bluesky to change them. 134 + </p> 135 + </div> 136 + 137 + {/* Editable Fields Form */} 138 + <form onSubmit={handleSubmit} className="bg-white rounded-lg p-6 shadow-sm"> 139 + <h2 className="font-semibold mb-4">Academic Information</h2> 140 + 141 + <div className="space-y-4"> 142 + <div> 143 + <label className="block text-sm font-medium text-gray-700 mb-2"> 144 + Honorifics 145 + </label> 146 + <div className="flex gap-3"> 147 + {HONORIFIC_OPTIONS.map((option) => ( 148 + <label 149 + key={option.value} 150 + className="flex items-center gap-2 cursor-pointer" 151 + > 152 + <input 153 + type="checkbox" 154 + checked={formData.honorifics.includes( 155 + option.value as 'Dr' | 'Prof' 156 + )} 157 + onChange={() => 158 + handleHonorificToggle(option.value as 'Dr' | 'Prof') 159 + } 160 + className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" 161 + /> 162 + <span className="text-sm text-gray-700">{option.label}</span> 163 + </label> 164 + ))} 165 + </div> 166 + <p className="mt-1 text-sm text-gray-500"> 167 + Select all that apply 168 + </p> 169 + </div> 170 + 171 + <div> 172 + <label className="block text-sm font-medium text-gray-700 mb-2"> 173 + Location 174 + </label> 175 + <div className="grid grid-cols-2 gap-4"> 176 + <div> 177 + <input 178 + type="text" 179 + value={formData.city} 180 + onChange={(e) => 181 + setFormData({ ...formData, city: e.target.value }) 182 + } 183 + placeholder="City" 184 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 185 + /> 186 + </div> 187 + <div> 188 + <input 189 + type="text" 190 + value={formData.country} 191 + onChange={(e) => 192 + setFormData({ ...formData, country: e.target.value }) 193 + } 194 + placeholder="Country" 195 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 196 + /> 197 + </div> 198 + </div> 199 + <p className="mt-1 text-sm text-gray-500"> 200 + Your primary location 201 + </p> 202 + </div> 203 + </div> 204 + 205 + {error && ( 206 + <div className="mt-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"> 207 + {error} 208 + </div> 209 + )} 210 + 211 + <div className="flex flex-col gap-3 mt-6"> 212 + <button 213 + type="submit" 214 + disabled={loading} 215 + className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors" 216 + > 217 + {loading ? 'Saving...' : 'Save Changes'} 218 + </button> 219 + 220 + <button 221 + type="button" 222 + onClick={() => router.push('/dashboard')} 223 + className="w-full py-3 px-6 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors" 224 + > 225 + Cancel 226 + </button> 227 + </div> 228 + </form> 229 + </div> 230 + ); 231 + }
+233
src/components/profile/ProfileView.tsx
··· 1 + 'use client'; 2 + 3 + import Image from 'next/image'; 4 + import QRCodeButton from './QRCodeButton'; 5 + import type { 6 + Researcher, 7 + Affiliation, 8 + Link as WebLink, 9 + Work, 10 + Event, 11 + } from '@/types'; 12 + 13 + interface ProfileViewProps { 14 + profile: Researcher; 15 + affiliations: Affiliation[]; 16 + webLinks: WebLink[]; 17 + works: Work[]; 18 + events: Event[]; 19 + } 20 + 21 + export default function ProfileView({ 22 + profile, 23 + affiliations, 24 + webLinks, 25 + works, 26 + events, 27 + }: ProfileViewProps) { 28 + const primaryAffiliation = affiliations.find((a) => a.isPrimary); 29 + const currentAffiliations = affiliations.filter((a) => !a.endDate); 30 + 31 + // Separate social and custom web links 32 + const socialLinks = webLinks.filter((l) => l.type === 'social' || l.type === 'academic'); 33 + const customLinks = webLinks.filter((l) => l.type === 'web'); 34 + const blueskyProfile = socialLinks.find((s) => s.platform === 'bluesky'); 35 + 36 + return ( 37 + <main className="min-h-screen bg-gray-50"> 38 + {/* Header Section - Mobile-first */} 39 + <div className="bg-white border-b border-gray-200"> 40 + <div className="max-w-2xl mx-auto px-4 py-6"> 41 + {/* Avatar and Basic Info */} 42 + <div className="flex items-start gap-4 mb-4"> 43 + {profile.avatar && ( 44 + <Image 45 + src={profile.avatar} 46 + alt={profile.displayName || profile.handle} 47 + width={80} 48 + height={80} 49 + className="rounded-full" 50 + /> 51 + )} 52 + <div className="flex-1 min-w-0"> 53 + <div className="flex items-baseline gap-2 mb-1"> 54 + {profile.honorifics && profile.honorifics.length > 0 && ( 55 + <span className="text-sm text-gray-600"> 56 + {profile.honorifics.join(', ')} 57 + </span> 58 + )} 59 + </div> 60 + <h1 className="text-2xl font-bold truncate"> 61 + {profile.displayName || profile.handle} 62 + </h1> 63 + <p className="text-gray-600">@{profile.handle}</p> 64 + </div> 65 + </div> 66 + 67 + {/* Primary Action - Follow on Bluesky */} 68 + {blueskyProfile && ( 69 + <a 70 + href={blueskyProfile.url} 71 + target="_blank" 72 + rel="noopener noreferrer" 73 + className="block w-full bg-blue-600 text-white text-center py-3 px-6 rounded-lg font-medium hover:bg-blue-700 transition-colors mb-2" 74 + > 75 + Follow on Bluesky 76 + </a> 77 + )} 78 + 79 + {/* QR Code Button */} 80 + <div className="mb-4"> 81 + <QRCodeButton 82 + url={`${typeof window !== 'undefined' ? window.location.origin : ''}/${profile.handle}`} 83 + handle={profile.handle} 84 + /> 85 + </div> 86 + 87 + {/* Description */} 88 + {profile.description && ( 89 + <p className="text-gray-700 mb-4">{profile.description}</p> 90 + )} 91 + 92 + {/* Current Affiliation */} 93 + {primaryAffiliation && ( 94 + <div className="text-sm text-gray-600"> 95 + <p className="font-medium">{primaryAffiliation.organization.name}</p> 96 + {primaryAffiliation.role && <p>{primaryAffiliation.role}</p>} 97 + </div> 98 + )} 99 + 100 + {/* Location */} 101 + {profile.location && ( 102 + <p className="text-sm text-gray-500 mt-2"> 103 + {profile.location.city && `${profile.location.city}, `} 104 + {profile.location.country} 105 + </p> 106 + )} 107 + </div> 108 + </div> 109 + 110 + {/* Content Sections */} 111 + <div className="max-w-2xl mx-auto px-4 py-6 space-y-6"> 112 + {/* Social & Academic Links */} 113 + {socialLinks.length > 0 && ( 114 + <section className="bg-white rounded-lg p-4 shadow-sm"> 115 + <h2 className="text-lg font-semibold mb-3">Connect</h2> 116 + <div className="space-y-2"> 117 + {socialLinks.map((social, idx) => ( 118 + <a 119 + key={idx} 120 + href={social.url} 121 + target="_blank" 122 + rel="noopener noreferrer" 123 + className="flex items-center gap-3 text-blue-600 hover:underline" 124 + > 125 + <span className="capitalize">{social.platform}</span> 126 + {social.username && ( 127 + <span className="text-gray-500">@{social.username}</span> 128 + )} 129 + </a> 130 + ))} 131 + </div> 132 + </section> 133 + )} 134 + 135 + {/* Custom Web Links */} 136 + {customLinks.length > 0 && ( 137 + <section className="bg-white rounded-lg p-4 shadow-sm"> 138 + <h2 className="text-lg font-semibold mb-3">Links</h2> 139 + <div className="space-y-2"> 140 + {customLinks.map((link, idx) => ( 141 + <a 142 + key={idx} 143 + href={link.url} 144 + target="_blank" 145 + rel="noopener noreferrer" 146 + className="block text-blue-600 hover:underline" 147 + > 148 + {link.title || link.url} 149 + </a> 150 + ))} 151 + </div> 152 + </section> 153 + )} 154 + 155 + {/* Affiliations */} 156 + {currentAffiliations.length > 0 && ( 157 + <section className="bg-white rounded-lg p-4 shadow-sm"> 158 + <h2 className="text-lg font-semibold mb-3">Affiliations</h2> 159 + <div className="space-y-3"> 160 + {currentAffiliations.map((affiliation, idx) => ( 161 + <div key={idx}> 162 + <p className="font-medium"> 163 + {affiliation.organization.name} 164 + </p> 165 + {affiliation.role && ( 166 + <p className="text-sm text-gray-600">{affiliation.role}</p> 167 + )} 168 + <p className="text-xs text-gray-500"> 169 + {new Date(affiliation.startDate).getFullYear()} - Present 170 + </p> 171 + </div> 172 + ))} 173 + </div> 174 + </section> 175 + )} 176 + 177 + {/* Works */} 178 + {works.length > 0 && ( 179 + <section className="bg-white rounded-lg p-4 shadow-sm"> 180 + <h2 className="text-lg font-semibold mb-3"> 181 + Scholarly Contributions 182 + </h2> 183 + <div className="space-y-4"> 184 + {works.map((work, idx) => ( 185 + <div key={idx} className="border-b border-gray-100 last:border-0 pb-3"> 186 + <p className="font-medium">{work.title || work.doi}</p> 187 + {work.authors && work.authors.length > 0 && ( 188 + <p className="text-sm text-gray-600"> 189 + {work.authors.join(', ')} 190 + </p> 191 + )} 192 + {work.venue && ( 193 + <p className="text-sm text-gray-500">{work.venue}</p> 194 + )} 195 + <a 196 + href={`https://doi.org/${work.doi}`} 197 + target="_blank" 198 + rel="noopener noreferrer" 199 + className="text-xs text-blue-600 hover:underline" 200 + > 201 + DOI: {work.doi} 202 + </a> 203 + </div> 204 + ))} 205 + </div> 206 + </section> 207 + )} 208 + 209 + {/* Events */} 210 + {events.length > 0 && ( 211 + <section className="bg-white rounded-lg p-4 shadow-sm"> 212 + <h2 className="text-lg font-semibold mb-3">Academic Events</h2> 213 + <div className="space-y-3"> 214 + {events.map((event, idx) => ( 215 + <div key={idx}> 216 + <p className="font-medium">{event.name}</p> 217 + <p className="text-sm text-gray-600 capitalize"> 218 + {event.type} 219 + </p> 220 + <p className="text-xs text-gray-500"> 221 + {new Date(event.startDate).toLocaleDateString()} 222 + {event.endDate && 223 + ` - ${new Date(event.endDate).toLocaleDateString()}`} 224 + </p> 225 + </div> 226 + ))} 227 + </div> 228 + </section> 229 + )} 230 + </div> 231 + </main> 232 + ); 233 + }
+76
src/components/profile/QRCodeButton.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import QRCode from 'qrcode'; 5 + 6 + interface QRCodeButtonProps { 7 + url: string; 8 + handle: string; 9 + } 10 + 11 + export default function QRCodeButton({ url, handle }: QRCodeButtonProps) { 12 + const [showModal, setShowModal] = useState(false); 13 + const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); 14 + 15 + const generateQRCode = async () => { 16 + try { 17 + const dataUrl = await QRCode.toDataURL(url, { 18 + width: 300, 19 + margin: 2, 20 + color: { 21 + dark: '#000000', 22 + light: '#FFFFFF', 23 + }, 24 + }); 25 + setQrCodeDataUrl(dataUrl); 26 + setShowModal(true); 27 + } catch (err) { 28 + console.error('Error generating QR code:', err); 29 + } 30 + }; 31 + 32 + return ( 33 + <> 34 + <button 35 + onClick={generateQRCode} 36 + className="w-full bg-gray-100 text-gray-900 py-3 px-6 rounded-lg font-medium hover:bg-gray-200 transition-colors" 37 + > 38 + View as QR Code 39 + </button> 40 + 41 + {showModal && ( 42 + <div 43 + className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" 44 + onClick={() => setShowModal(false)} 45 + > 46 + <div 47 + className="bg-white rounded-lg p-6 max-w-sm w-full" 48 + onClick={(e) => e.stopPropagation()} 49 + > 50 + <h3 className="text-lg font-semibold mb-4 text-center"> 51 + Share Profile 52 + </h3> 53 + <div className="flex justify-center mb-4"> 54 + {qrCodeDataUrl && ( 55 + <img 56 + src={qrCodeDataUrl} 57 + alt={`QR Code for ${handle}`} 58 + className="w-64 h-64" 59 + /> 60 + )} 61 + </div> 62 + <p className="text-sm text-gray-600 text-center mb-4"> 63 + Scan this QR code to visit this profile 64 + </p> 65 + <button 66 + onClick={() => setShowModal(false)} 67 + className="w-full bg-blue-600 text-white py-2 px-4 rounded-lg hover:bg-blue-700 transition-colors" 68 + > 69 + Close 70 + </button> 71 + </div> 72 + </div> 73 + )} 74 + </> 75 + ); 76 + }
+161
src/components/profile/ShareProfileButton.tsx
··· 1 + 'use client'; 2 + 3 + import { useState } from 'react'; 4 + import QRCode from 'qrcode'; 5 + 6 + interface ShareProfileButtonProps { 7 + url: string; 8 + handle: string; 9 + } 10 + 11 + export default function ShareProfileButton({ 12 + url, 13 + handle, 14 + }: ShareProfileButtonProps) { 15 + const [showModal, setShowModal] = useState(false); 16 + const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); 17 + const [copied, setCopied] = useState(false); 18 + 19 + const handleShare = async () => { 20 + try { 21 + const dataUrl = await QRCode.toDataURL(url, { 22 + width: 300, 23 + margin: 2, 24 + color: { 25 + dark: '#000000', 26 + light: '#FFFFFF', 27 + }, 28 + }); 29 + setQrCodeDataUrl(dataUrl); 30 + setShowModal(true); 31 + } catch (err) { 32 + console.error('Error generating QR code:', err); 33 + } 34 + }; 35 + 36 + const handleCopyLink = async () => { 37 + try { 38 + await navigator.clipboard.writeText(url); 39 + setCopied(true); 40 + setTimeout(() => setCopied(false), 2000); 41 + } catch (err) { 42 + console.error('Error copying to clipboard:', err); 43 + } 44 + }; 45 + 46 + return ( 47 + <> 48 + <button 49 + onClick={handleShare} 50 + className="flex items-center justify-center gap-2 px-4 py-2 text-sm bg-gray-100 text-gray-900 rounded-lg hover:bg-gray-200 transition-colors" 51 + > 52 + <svg 53 + className="w-4 h-4" 54 + fill="none" 55 + stroke="currentColor" 56 + viewBox="0 0 24 24" 57 + > 58 + <path 59 + strokeLinecap="round" 60 + strokeLinejoin="round" 61 + strokeWidth={2} 62 + d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z" 63 + /> 64 + </svg> 65 + Share Profile 66 + </button> 67 + 68 + {showModal && ( 69 + <div 70 + className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" 71 + onClick={() => setShowModal(false)} 72 + > 73 + <div 74 + className="bg-white rounded-lg p-6 max-w-sm w-full" 75 + onClick={(e) => e.stopPropagation()} 76 + > 77 + <h3 className="text-lg font-semibold mb-4 text-center"> 78 + Share Your Profile 79 + </h3> 80 + 81 + {/* QR Code */} 82 + <div className="flex justify-center mb-4"> 83 + {qrCodeDataUrl && ( 84 + <img 85 + src={qrCodeDataUrl} 86 + alt={`QR Code for ${handle}`} 87 + className="w-64 h-64 border border-gray-200 rounded-lg" 88 + /> 89 + )} 90 + </div> 91 + 92 + {/* URL Display */} 93 + <div className="mb-4"> 94 + <label className="block text-sm font-medium text-gray-700 mb-2"> 95 + Profile URL 96 + </label> 97 + <div className="flex gap-2"> 98 + <input 99 + type="text" 100 + value={url} 101 + readOnly 102 + className="flex-1 px-3 py-2 text-sm border border-gray-300 rounded-lg bg-gray-50" 103 + /> 104 + <button 105 + onClick={handleCopyLink} 106 + className="px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors" 107 + > 108 + {copied ? ( 109 + <svg 110 + className="w-4 h-4" 111 + fill="none" 112 + stroke="currentColor" 113 + viewBox="0 0 24 24" 114 + > 115 + <path 116 + strokeLinecap="round" 117 + strokeLinejoin="round" 118 + strokeWidth={2} 119 + d="M5 13l4 4L19 7" 120 + /> 121 + </svg> 122 + ) : ( 123 + <svg 124 + className="w-4 h-4" 125 + fill="none" 126 + stroke="currentColor" 127 + viewBox="0 0 24 24" 128 + > 129 + <path 130 + strokeLinecap="round" 131 + strokeLinejoin="round" 132 + strokeWidth={2} 133 + d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" 134 + /> 135 + </svg> 136 + )} 137 + </button> 138 + </div> 139 + {copied && ( 140 + <p className="text-xs text-green-600 mt-1"> 141 + Copied to clipboard! 142 + </p> 143 + )} 144 + </div> 145 + 146 + <p className="text-xs text-gray-600 text-center mb-4"> 147 + Share this QR code or link at conferences and events 148 + </p> 149 + 150 + <button 151 + onClick={() => setShowModal(false)} 152 + className="w-full bg-gray-100 text-gray-900 py-2 px-4 rounded-lg hover:bg-gray-200 transition-colors" 153 + > 154 + Close 155 + </button> 156 + </div> 157 + </div> 158 + )} 159 + </> 160 + ); 161 + }
+240
src/components/research/ResearchForm.tsx
··· 1 + 'use client'; 2 + 3 + import { useState, useEffect } from 'react'; 4 + import { useRouter } from 'next/navigation'; 5 + import type { Work, WorkType } from '@/types'; 6 + 7 + interface ResearchFormProps { 8 + mode: 'create' | 'edit'; 9 + initialData?: Work; 10 + } 11 + 12 + const WORK_TYPES: { value: WorkType; label: string }[] = [ 13 + { value: 'abstract', label: 'Abstract' }, 14 + { value: 'poster', label: 'Poster' }, 15 + { value: 'paper', label: 'Paper' }, 16 + { value: 'conference-proceeding', label: 'Conference Proceeding' }, 17 + { value: 'journal-article', label: 'Journal Article' }, 18 + { value: 'book-chapter', label: 'Book Chapter' }, 19 + { value: 'book', label: 'Book' }, 20 + { value: 'preprint', label: 'Preprint' }, 21 + { value: 'dataset', label: 'Dataset' }, 22 + { value: 'other', label: 'Other' }, 23 + ]; 24 + 25 + export default function ResearchForm({ mode, initialData }: ResearchFormProps) { 26 + const router = useRouter(); 27 + const [loading, setLoading] = useState(false); 28 + const [resolvingDOI, setResolvingDOI] = useState(false); 29 + const [error, setError] = useState(''); 30 + const [resolvedMetadata, setResolvedMetadata] = useState<any>(null); 31 + 32 + const [formData, setFormData] = useState<{ 33 + doi: string; 34 + type: WorkType | ''; 35 + }>({ 36 + doi: initialData?.doi || '', 37 + type: initialData?.type || '', 38 + }); 39 + 40 + const handleResolveDOI = async () => { 41 + if (!formData.doi) return; 42 + 43 + setResolvingDOI(true); 44 + setError(''); 45 + setResolvedMetadata(null); 46 + 47 + try { 48 + const response = await fetch( 49 + `/api/doi/resolve?doi=${encodeURIComponent(formData.doi)}` 50 + ); 51 + 52 + if (!response.ok) { 53 + throw new Error('Failed to resolve DOI'); 54 + } 55 + 56 + const data = await response.json(); 57 + setResolvedMetadata(data); 58 + } catch (err) { 59 + setError(err instanceof Error ? err.message : 'Failed to resolve DOI'); 60 + } finally { 61 + setResolvingDOI(false); 62 + } 63 + }; 64 + 65 + const handleSubmit = async (e: React.FormEvent) => { 66 + e.preventDefault(); 67 + setLoading(true); 68 + setError(''); 69 + 70 + try { 71 + const response = await fetch('/api/profile/works', { 72 + method: mode === 'create' ? 'POST' : 'PUT', 73 + headers: { 74 + 'Content-Type': 'application/json', 75 + }, 76 + body: JSON.stringify(formData), 77 + }); 78 + 79 + if (!response.ok) { 80 + const data = await response.json(); 81 + throw new Error(data.error || `Failed to ${mode} work`); 82 + } 83 + 84 + router.push('/dashboard/research'); 85 + router.refresh(); 86 + } catch (err) { 87 + setError(err instanceof Error ? err.message : 'An error occurred'); 88 + setLoading(false); 89 + } 90 + }; 91 + 92 + const handleDelete = async () => { 93 + if (!confirm('Are you sure you want to delete this publication?')) { 94 + return; 95 + } 96 + 97 + setLoading(true); 98 + setError(''); 99 + 100 + try { 101 + const response = await fetch( 102 + `/api/profile/works?doi=${encodeURIComponent(formData.doi)}`, 103 + { 104 + method: 'DELETE', 105 + } 106 + ); 107 + 108 + if (!response.ok) { 109 + const data = await response.json(); 110 + throw new Error(data.error || 'Failed to delete work'); 111 + } 112 + 113 + router.push('/dashboard/research'); 114 + router.refresh(); 115 + } catch (err) { 116 + setError(err instanceof Error ? err.message : 'An error occurred'); 117 + setLoading(false); 118 + } 119 + }; 120 + 121 + return ( 122 + <form onSubmit={handleSubmit} className="bg-white rounded-lg p-6 shadow-sm"> 123 + <div className="space-y-4"> 124 + <div> 125 + <label className="block text-sm font-medium text-gray-700 mb-2"> 126 + DOI * 127 + </label> 128 + <div className="flex gap-2"> 129 + <input 130 + type="text" 131 + value={formData.doi} 132 + onChange={(e) => 133 + setFormData({ ...formData, doi: e.target.value }) 134 + } 135 + required 136 + disabled={mode === 'edit'} 137 + placeholder="10.1234/example" 138 + className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100" 139 + /> 140 + {mode === 'create' && ( 141 + <button 142 + type="button" 143 + onClick={handleResolveDOI} 144 + disabled={!formData.doi || resolvingDOI} 145 + className="px-4 py-2 bg-gray-100 text-gray-700 rounded-lg hover:bg-gray-200 disabled:bg-gray-50 disabled:text-gray-400 transition-colors" 146 + > 147 + {resolvingDOI ? 'Resolving...' : 'Resolve'} 148 + </button> 149 + )} 150 + </div> 151 + <p className="mt-1 text-sm text-gray-500"> 152 + {mode === 'create' 153 + ? 'Metadata will be automatically fetched from the DOI' 154 + : 'DOI cannot be changed after creation'} 155 + </p> 156 + </div> 157 + 158 + {resolvedMetadata && ( 159 + <div className="p-4 bg-blue-50 border border-blue-200 rounded-lg"> 160 + <p className="text-sm font-medium text-blue-900 mb-2"> 161 + DOI Resolved Successfully 162 + </p> 163 + {resolvedMetadata.title && ( 164 + <p className="text-sm text-blue-800 mb-1"> 165 + <strong>Title:</strong> {resolvedMetadata.title} 166 + </p> 167 + )} 168 + {resolvedMetadata.authors && ( 169 + <p className="text-sm text-blue-800"> 170 + <strong>Authors:</strong> {resolvedMetadata.authors.join(', ')} 171 + </p> 172 + )} 173 + </div> 174 + )} 175 + 176 + <div> 177 + <label className="block text-sm font-medium text-gray-700 mb-2"> 178 + Type * 179 + </label> 180 + <select 181 + value={formData.type} 182 + onChange={(e) => 183 + setFormData({ ...formData, type: e.target.value as WorkType }) 184 + } 185 + required 186 + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" 187 + > 188 + <option value="">Select type...</option> 189 + {WORK_TYPES.map((type) => ( 190 + <option key={type.value} value={type.value}> 191 + {type.label} 192 + </option> 193 + ))} 194 + </select> 195 + </div> 196 + </div> 197 + 198 + {error && ( 199 + <div className="mt-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"> 200 + {error} 201 + </div> 202 + )} 203 + 204 + <div className="flex flex-col gap-3 mt-6"> 205 + <button 206 + type="submit" 207 + disabled={loading} 208 + className="w-full bg-blue-600 text-white py-3 px-6 rounded-lg font-medium hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors" 209 + > 210 + {loading 211 + ? mode === 'create' 212 + ? 'Adding...' 213 + : 'Saving...' 214 + : mode === 'create' 215 + ? 'Add Publication' 216 + : 'Save Changes'} 217 + </button> 218 + 219 + <button 220 + type="button" 221 + onClick={() => router.push('/dashboard/research')} 222 + className="w-full py-3 px-6 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors" 223 + > 224 + Cancel 225 + </button> 226 + 227 + {mode === 'edit' && ( 228 + <button 229 + type="button" 230 + onClick={handleDelete} 231 + disabled={loading} 232 + className="w-full text-red-600 py-2 hover:text-red-700 disabled:text-gray-400" 233 + > 234 + Delete Publication 235 + </button> 236 + )} 237 + </div> 238 + </form> 239 + ); 240 + }
+57
src/lib/auth/app-password.ts
··· 1 + /** 2 + * App Password Authentication 3 + * 4 + * Simpler authentication method using Bluesky app passwords. 5 + * Recommended for local development and testing. 6 + * 7 + * To create an app password: 8 + * 1. Go to https://bsky.app/settings/app-passwords 9 + * 2. Create a new app password 10 + * 3. Add it to your .env file 11 + */ 12 + 13 + import { AtpAgent } from '@atproto/api'; 14 + 15 + export async function loginWithAppPassword( 16 + identifier: string, 17 + password: string 18 + ): Promise<{ 19 + did: string; 20 + handle: string; 21 + accessJwt: string; 22 + refreshJwt: string; 23 + }> { 24 + const agent = new AtpAgent({ 25 + service: process.env.PDS_URL || 'https://bsky.social', 26 + }); 27 + 28 + const response = await agent.login({ 29 + identifier, 30 + password, 31 + }); 32 + 33 + if (!response.success) { 34 + throw new Error('Login failed'); 35 + } 36 + 37 + return { 38 + did: response.data.did, 39 + handle: response.data.handle, 40 + accessJwt: response.data.accessJwt, 41 + refreshJwt: response.data.refreshJwt, 42 + }; 43 + } 44 + 45 + export async function getConfiguredCredentials(): Promise<{ 46 + handle: string; 47 + password: string; 48 + } | null> { 49 + const handle = process.env.BLUESKY_HANDLE; 50 + const password = process.env.BLUESKY_APP_PASSWORD; 51 + 52 + if (!handle || !password) { 53 + return null; 54 + } 55 + 56 + return { handle, password }; 57 + }
+36
src/lib/auth/atproto.ts
··· 1 + import { AtpAgent } from '@atproto/api'; 2 + import { getSession } from './session'; 3 + 4 + export async function getAgent(): Promise<AtpAgent | null> { 5 + const session = await getSession(); 6 + 7 + if (!session) { 8 + return null; 9 + } 10 + 11 + const agent = new AtpAgent({ 12 + service: 'https://bsky.social', 13 + }); 14 + 15 + // Resume session 16 + await agent.resumeSession({ 17 + did: session.did, 18 + handle: session.handle, 19 + accessJwt: session.accessToken, 20 + refreshJwt: session.refreshToken, 21 + active: true, 22 + }); 23 + 24 + return agent; 25 + } 26 + 27 + export async function getProfile(did: string) { 28 + const agent = await getAgent(); 29 + 30 + if (!agent) { 31 + throw new Error('Not authenticated'); 32 + } 33 + 34 + const profile = await agent.getProfile({ actor: did }); 35 + return profile.data; 36 + }
+28
src/lib/auth/config.ts
··· 1 + /** 2 + * Authentication Configuration 3 + * 4 + * Centralized configuration for switching between authentication methods 5 + */ 6 + 7 + export type AuthMethod = 'oauth' | 'app_password'; 8 + 9 + export function getAuthMethod(): AuthMethod { 10 + const method = process.env.AUTH_METHOD || 'app_password'; 11 + 12 + if (method !== 'oauth' && method !== 'app_password') { 13 + console.warn( 14 + `Invalid AUTH_METHOD: ${method}. Defaulting to 'app_password'` 15 + ); 16 + return 'app_password'; 17 + } 18 + 19 + return method as AuthMethod; 20 + } 21 + 22 + export function isOAuthEnabled(): boolean { 23 + return getAuthMethod() === 'oauth'; 24 + } 25 + 26 + export function isAppPasswordEnabled(): boolean { 27 + return getAuthMethod() === 'app_password'; 28 + }
+27
src/lib/auth/oauth-client-placeholder.ts
··· 1 + /** 2 + * OAuth Client Placeholder 3 + * 4 + * The @atproto/oauth-client-node package has a complex setup that requires: 5 + * - Proper client metadata configuration 6 + * - State and session stores 7 + * - DPoP (Demonstrated Proof of Possession) setup 8 + * 9 + * For now, this is a placeholder. To implement properly: 10 + * 1. Follow the AT Protocol OAuth documentation 11 + * 2. Set up proper session and state storage 12 + * 3. Configure client metadata correctly 13 + * 14 + * Alternative: Use direct API authentication instead of OAuth for simpler setup 15 + */ 16 + 17 + export async function getOAuthClient() { 18 + throw new Error( 19 + 'OAuth client not yet fully implemented. Please configure OAuth according to AT Protocol documentation.' 20 + ); 21 + } 22 + 23 + export async function createAuthUrl(_handle: string): Promise<string> { 24 + throw new Error( 25 + 'OAuth client not yet fully implemented. Please configure OAuth according to AT Protocol documentation.' 26 + ); 27 + }
+46
src/lib/auth/oauth-client.ts
··· 1 + /** 2 + * OAuth Client Configuration 3 + * 4 + * Note: The @atproto/oauth-client-node package requires complex setup. 5 + * This is a temporary type-safe placeholder implementation. 6 + * 7 + * To properly implement OAuth: 8 + * 1. Review AT Protocol OAuth documentation 9 + * 2. Set up NodeSavedStateStore and NodeSavedSessionStore 10 + * 3. Configure client metadata properly 11 + * 4. Handle DPoP tokens 12 + * 13 + * For initial development, consider using app passwords or direct API auth 14 + */ 15 + 16 + // Placeholder type 17 + export type OAuthClient = { 18 + authorize: (handle: string) => Promise<string>; 19 + callback: (params: URLSearchParams) => Promise<{ 20 + session: { 21 + sub: string; 22 + scope: string; 23 + }; 24 + state: string | null; 25 + }>; 26 + }; 27 + 28 + let oauthClient: OAuthClient | null = null; 29 + 30 + export async function getOAuthClient(): Promise<OAuthClient> { 31 + if (oauthClient) { 32 + return oauthClient; 33 + } 34 + 35 + // TODO: Implement proper OAuth client initialization 36 + // See @atproto/oauth-client-node documentation 37 + 38 + throw new Error( 39 + 'OAuth client not yet fully configured. Please set up OAuth according to AT Protocol documentation.' 40 + ); 41 + } 42 + 43 + export async function createAuthUrl(handle: string): Promise<string> { 44 + const client = await getOAuthClient(); 45 + return await client.authorize(handle); 46 + }
+60
src/lib/auth/session.ts
··· 1 + import { cookies } from 'next/headers'; 2 + 3 + export interface Session { 4 + did: string; 5 + handle: string; 6 + accessToken: string; 7 + refreshToken: string; 8 + expiresAt: number; 9 + } 10 + 11 + const SESSION_COOKIE_NAME = 'lanyard_session'; 12 + const SESSION_MAX_AGE = 60 * 60 * 24 * 30; // 30 days 13 + 14 + export async function createSession(session: Session): Promise<void> { 15 + const cookieStore = await cookies(); 16 + 17 + cookieStore.set(SESSION_COOKIE_NAME, JSON.stringify(session), { 18 + httpOnly: true, 19 + secure: process.env.NODE_ENV === 'production', 20 + sameSite: 'lax', 21 + maxAge: SESSION_MAX_AGE, 22 + path: '/', 23 + }); 24 + } 25 + 26 + export async function getSession(): Promise<Session | null> { 27 + const cookieStore = await cookies(); 28 + const sessionCookie = cookieStore.get(SESSION_COOKIE_NAME); 29 + 30 + if (!sessionCookie) { 31 + return null; 32 + } 33 + 34 + try { 35 + return JSON.parse(sessionCookie.value) as Session; 36 + } catch { 37 + return null; 38 + } 39 + } 40 + 41 + export async function deleteSession(): Promise<void> { 42 + const cookieStore = await cookies(); 43 + cookieStore.delete(SESSION_COOKIE_NAME); 44 + } 45 + 46 + export async function isAuthenticated(): Promise<boolean> { 47 + const session = await getSession(); 48 + 49 + if (!session) { 50 + return false; 51 + } 52 + 53 + // Check if token is expired 54 + if (session.expiresAt < Date.now()) { 55 + await deleteSession(); 56 + return false; 57 + } 58 + 59 + return true; 60 + }
+55
src/lib/data/doi.ts
··· 1 + /** 2 + * DOI resolution utilities 3 + * Fetches metadata from CrossRef and DataCite 4 + */ 5 + 6 + export interface DOIMetadata { 7 + title?: string; 8 + authors?: string[]; 9 + publicationDate?: string; 10 + journal?: string; 11 + type?: string; 12 + abstract?: string; 13 + url?: string; 14 + } 15 + 16 + export async function resolveDOI(doi: string): Promise<DOIMetadata | null> { 17 + try { 18 + // Clean DOI 19 + const cleanDOI = doi.replace(/^(https?:\/\/)?(dx\.)?doi\.org\//, ''); 20 + 21 + // Try CrossRef first 22 + const response = await fetch( 23 + `https://api.crossref.org/works/${encodeURIComponent(cleanDOI)}`, 24 + { 25 + headers: { 26 + Accept: 'application/json', 27 + }, 28 + } 29 + ); 30 + 31 + if (!response.ok) { 32 + return null; 33 + } 34 + 35 + const data = await response.json(); 36 + const work = data.message; 37 + 38 + return { 39 + title: work.title?.[0], 40 + authors: work.author?.map( 41 + (a: { given?: string; family?: string }) => 42 + `${a.given || ''} ${a.family || ''}`.trim() 43 + ), 44 + publicationDate: work.published?.['date-parts']?.[0]?.join('-'), 45 + journal: 46 + work['container-title']?.[0] || work.publisher || work.institution, 47 + type: work.type, 48 + abstract: work.abstract, 49 + url: work.URL, 50 + }; 51 + } catch (error) { 52 + console.error('Error resolving DOI:', error); 53 + return null; 54 + } 55 + }
+245
src/lib/data/repository.ts
··· 1 + /** 2 + * Repository pattern for managing researcher data in PDS 3 + * This provides an abstraction layer for CRUD operations on AT Protocol records 4 + */ 5 + 6 + import { AtpAgent } from '@atproto/api'; 7 + import { TID } from '@atproto/common'; 8 + import type { 9 + Researcher, 10 + Affiliation, 11 + Link as WebLink, 12 + 13 + Work, 14 + Event, 15 + } from '@/types'; 16 + 17 + const LEXICON_PREFIX = 'at.lanyard'; 18 + 19 + export class ResearcherRepository { 20 + constructor(private agent: AtpAgent) {} 21 + 22 + // Profile operations 23 + async getProfile(did: string): Promise<Researcher | null> { 24 + try { 25 + const response = await this.agent.com.atproto.repo.getRecord({ 26 + repo: did, 27 + collection: `${LEXICON_PREFIX}.actor.profile`, 28 + rkey: 'self', 29 + }); 30 + return response.data.value as unknown as Researcher; 31 + } catch { 32 + return null; 33 + } 34 + } 35 + 36 + async createProfile(profile: Omit<Researcher, 'createdAt'>) { 37 + return this.agent.com.atproto.repo.putRecord({ 38 + repo: this.agent.session?.did || '', 39 + collection: `${LEXICON_PREFIX}.actor.profile`, 40 + rkey: 'self', 41 + record: { 42 + ...profile, 43 + createdAt: new Date().toISOString(), 44 + }, 45 + }); 46 + } 47 + 48 + async updateProfile(updates: Partial<Researcher>) { 49 + const current = await this.getProfile(this.agent.session?.did || ''); 50 + if (!current) { 51 + throw new Error('Profile not found'); 52 + } 53 + 54 + return this.agent.com.atproto.repo.putRecord({ 55 + repo: this.agent.session?.did || '', 56 + collection: `${LEXICON_PREFIX}.actor.profile`, 57 + rkey: 'self', 58 + record: { 59 + ...current, 60 + ...updates, 61 + updatedAt: new Date().toISOString(), 62 + }, 63 + }); 64 + } 65 + 66 + // Affiliation operations 67 + async listAffiliations(did: string): Promise<Affiliation[]> { 68 + const response = await this.agent.com.atproto.repo.listRecords({ 69 + repo: did, 70 + collection: `${LEXICON_PREFIX}.actor.affiliation`, 71 + }); 72 + return response.data.records.map((r) => r.value as unknown as Affiliation); 73 + } 74 + 75 + async createAffiliation( 76 + affiliation: Omit<Affiliation, 'createdAt'> 77 + ): Promise<string> { 78 + const rkey = TID.nextStr(); 79 + await this.agent.com.atproto.repo.putRecord({ 80 + repo: this.agent.session?.did || '', 81 + collection: `${LEXICON_PREFIX}.actor.affiliation`, 82 + rkey, 83 + record: { 84 + ...affiliation, 85 + createdAt: new Date().toISOString(), 86 + }, 87 + }); 88 + return rkey; 89 + } 90 + 91 + async updateAffiliation(rkey: string, updates: Partial<Affiliation>) { 92 + const record = await this.agent.com.atproto.repo.getRecord({ 93 + repo: this.agent.session?.did || '', 94 + collection: `${LEXICON_PREFIX}.actor.affiliation`, 95 + rkey, 96 + }); 97 + 98 + return this.agent.com.atproto.repo.putRecord({ 99 + repo: this.agent.session?.did || '', 100 + collection: `${LEXICON_PREFIX}.actor.affiliation`, 101 + rkey, 102 + record: { 103 + ...record.data.value, 104 + ...updates, 105 + }, 106 + }); 107 + } 108 + 109 + async deleteAffiliation(rkey: string) { 110 + return this.agent.com.atproto.repo.deleteRecord({ 111 + repo: this.agent.session?.did || '', 112 + collection: `${LEXICON_PREFIX}.actor.affiliation`, 113 + rkey, 114 + }); 115 + } 116 + 117 + // WebLink operations (all links: social, academic, and custom web) 118 + async listWebLinks(did: string): Promise<WebLink[]> { 119 + const response = await this.agent.com.atproto.repo.listRecords({ 120 + repo: did, 121 + collection: `${LEXICON_PREFIX}.link`, 122 + }); 123 + return response.data.records.map((r) => r.value as unknown as WebLink); 124 + } 125 + 126 + async createWebLink(link: Omit<WebLink, 'createdAt'>): Promise<string> { 127 + const rkey = TID.nextStr(); 128 + await this.agent.com.atproto.repo.putRecord({ 129 + repo: this.agent.session?.did || '', 130 + collection: `${LEXICON_PREFIX}.link`, 131 + rkey, 132 + record: { 133 + ...link, 134 + createdAt: new Date().toISOString(), 135 + }, 136 + }); 137 + return rkey; 138 + } 139 + 140 + async updateWebLink(rkey: string, updates: Partial<WebLink>) { 141 + const record = await this.agent.com.atproto.repo.getRecord({ 142 + repo: this.agent.session?.did || '', 143 + collection: `${LEXICON_PREFIX}.link`, 144 + rkey, 145 + }); 146 + 147 + return this.agent.com.atproto.repo.putRecord({ 148 + repo: this.agent.session?.did || '', 149 + collection: `${LEXICON_PREFIX}.link`, 150 + rkey, 151 + record: { 152 + ...record.data.value, 153 + ...updates, 154 + }, 155 + }); 156 + } 157 + 158 + async deleteWebLink(rkey: string) { 159 + return this.agent.com.atproto.repo.deleteRecord({ 160 + repo: this.agent.session?.did || '', 161 + collection: `${LEXICON_PREFIX}.link`, 162 + rkey, 163 + }); 164 + } 165 + 166 + // Work operations 167 + async listWorks(did: string): Promise<Work[]> { 168 + const response = await this.agent.com.atproto.repo.listRecords({ 169 + repo: did, 170 + collection: `${LEXICON_PREFIX}.document.work`, 171 + }); 172 + return response.data.records.map((r) => r.value as unknown as Work); 173 + } 174 + 175 + async createWork(work: Omit<Work, 'createdAt'>): Promise<string> { 176 + const rkey = TID.nextStr(); 177 + await this.agent.com.atproto.repo.putRecord({ 178 + repo: this.agent.session?.did || '', 179 + collection: `${LEXICON_PREFIX}.document.work`, 180 + rkey, 181 + record: { 182 + ...work, 183 + createdAt: new Date().toISOString(), 184 + }, 185 + }); 186 + return rkey; 187 + } 188 + 189 + async deleteWork(rkey: string) { 190 + return this.agent.com.atproto.repo.deleteRecord({ 191 + repo: this.agent.session?.did || '', 192 + collection: `${LEXICON_PREFIX}.document.work`, 193 + rkey, 194 + }); 195 + } 196 + 197 + // Event operations 198 + async listEvents(did: string): Promise<Event[]> { 199 + const response = await this.agent.com.atproto.repo.listRecords({ 200 + repo: did, 201 + collection: `${LEXICON_PREFIX}.event.academic`, 202 + }); 203 + return response.data.records.map((r) => r.value as unknown as Event); 204 + } 205 + 206 + async createEvent(event: Omit<Event, 'createdAt'>): Promise<string> { 207 + const rkey = TID.nextStr(); 208 + await this.agent.com.atproto.repo.putRecord({ 209 + repo: this.agent.session?.did || '', 210 + collection: `${LEXICON_PREFIX}.event.academic`, 211 + rkey, 212 + record: { 213 + ...event, 214 + createdAt: new Date().toISOString(), 215 + }, 216 + }); 217 + return rkey; 218 + } 219 + 220 + async updateEvent(rkey: string, updates: Partial<Event>) { 221 + const record = await this.agent.com.atproto.repo.getRecord({ 222 + repo: this.agent.session?.did || '', 223 + collection: `${LEXICON_PREFIX}.event.academic`, 224 + rkey, 225 + }); 226 + 227 + return this.agent.com.atproto.repo.putRecord({ 228 + repo: this.agent.session?.did || '', 229 + collection: `${LEXICON_PREFIX}.event.academic`, 230 + rkey, 231 + record: { 232 + ...record.data.value, 233 + ...updates, 234 + }, 235 + }); 236 + } 237 + 238 + async deleteEvent(rkey: string) { 239 + return this.agent.com.atproto.repo.deleteRecord({ 240 + repo: this.agent.session?.did || '', 241 + collection: `${LEXICON_PREFIX}.event.academic`, 242 + rkey, 243 + }); 244 + } 245 + }
+10
src/lib/utils.ts
··· 1 + import { type ClassValue, clsx } from 'clsx'; 2 + import { twMerge } from 'tailwind-merge'; 3 + 4 + /** 5 + * Combines classnames using clsx and tailwind-merge 6 + * Handles conditional classes and merges Tailwind classes intelligently 7 + */ 8 + export function cn(...inputs: ClassValue[]) { 9 + return twMerge(clsx(inputs)); 10 + }
+26
src/proxy.ts
··· 1 + import { NextResponse } from 'next/server'; 2 + import type { NextRequest } from 'next/server'; 3 + 4 + export default function proxy(request: NextRequest) { 5 + const sessionCookie = request.cookies.get('lanyard_session'); 6 + const isAuthPage = request.nextUrl.pathname.startsWith('/auth'); 7 + const isProtectedPage = 8 + request.nextUrl.pathname.startsWith('/dashboard') || 9 + request.nextUrl.pathname.startsWith('/profile/edit'); 10 + 11 + // Redirect authenticated users away from auth page 12 + if (isAuthPage && sessionCookie) { 13 + return NextResponse.redirect(new URL('/dashboard', request.url)); 14 + } 15 + 16 + // Redirect unauthenticated users to auth page 17 + if (isProtectedPage && !sessionCookie) { 18 + return NextResponse.redirect(new URL('/auth', request.url)); 19 + } 20 + 21 + return NextResponse.next(); 22 + } 23 + 24 + export const config = { 25 + matcher: ['/auth', '/dashboard/:path*', '/profile/edit/:path*'], 26 + };
+54
src/types/atproto.d.ts
··· 1 + // Type declarations for AT Protocol packages to fix generated type imports 2 + // These are used by the auto-generated lexicon types from @atproto/lex-cli 3 + 4 + declare namespace ComAtprotoRepoListRecords { 5 + export interface QueryParams { 6 + repo: string; 7 + collection: string; 8 + limit?: number; 9 + cursor?: string; 10 + reverse?: boolean; 11 + } 12 + } 13 + 14 + declare namespace ComAtprotoRepoGetRecord { 15 + export interface QueryParams { 16 + repo: string; 17 + collection: string; 18 + rkey: string; 19 + cid?: string; 20 + } 21 + } 22 + 23 + declare namespace ComAtprotoRepoCreateRecord { 24 + export interface InputSchema { 25 + repo: string; 26 + collection: string; 27 + rkey?: string; 28 + validate?: boolean; 29 + record: Record<string, unknown>; 30 + swapCommit?: string; 31 + } 32 + } 33 + 34 + declare namespace ComAtprotoRepoPutRecord { 35 + export interface InputSchema { 36 + repo: string; 37 + collection: string; 38 + rkey: string; 39 + validate?: boolean; 40 + record: Record<string, unknown>; 41 + swapRecord?: string; 42 + swapCommit?: string; 43 + } 44 + } 45 + 46 + declare namespace ComAtprotoRepoDeleteRecord { 47 + export interface InputSchema { 48 + repo: string; 49 + collection: string; 50 + rkey: string; 51 + swapRecord?: string; 52 + swapCommit?: string; 53 + } 54 + }
+35
src/types/index.ts
··· 1 + /** 2 + * Type exports for Lanyard application 3 + * Re-exports generated AT Protocol lexicon types with convenient aliases 4 + */ 5 + 6 + import type { 7 + AtLanyardResearcher, 8 + AtLanyardWork, 9 + AtLanyardEvent, 10 + AtLanyardLink, 11 + AtLanyardOrganization, 12 + AtLanyardPublication, 13 + AtLanyardLocation, 14 + } from './generated'; 15 + 16 + // Main record types 17 + export type Researcher = AtLanyardResearcher.Record; 18 + export type Work = AtLanyardWork.Record; 19 + export type Event = AtLanyardEvent.Record; 20 + export type Link = AtLanyardLink.Record; 21 + export type Organization = AtLanyardOrganization.Main; 22 + export type Publication = AtLanyardPublication.Main; 23 + export type Location = AtLanyardLocation.Main; 24 + 25 + // Nested types 26 + export type Affiliation = AtLanyardResearcher.Affiliation; 27 + 28 + // Convenience type aliases for enums and unions 29 + export type Honorific = 'Dr' | 'Prof'; 30 + export type WorkType = Work['type']; 31 + export type EventType = Event['type']; 32 + export type LinkType = Link['type']; 33 + export type LinkPlatform = NonNullable<Link['platform']>; 34 + export type OrganizationType = NonNullable<Organization['type']>; 35 + export type PublicationType = NonNullable<Publication['type']>;
+5
src/types/multiformats.d.ts
··· 1 + // Type declarations for multiformats package 2 + // This resolves import issues with the generated AT Protocol types 3 + declare module 'multiformats/cid' { 4 + export { CID } from 'multiformats'; 5 + }
+42
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2020", 4 + "lib": [ 5 + "dom", 6 + "dom.iterable", 7 + "esnext" 8 + ], 9 + "allowJs": true, 10 + "skipLibCheck": true, 11 + "strict": true, 12 + "noEmit": true, 13 + "esModuleInterop": true, 14 + "module": "esnext", 15 + "moduleResolution": "bundler", 16 + "resolveJsonModule": true, 17 + "isolatedModules": true, 18 + "jsx": "react-jsx", 19 + "incremental": true, 20 + "allowImportingTsExtensions": true, 21 + "plugins": [ 22 + { 23 + "name": "next" 24 + } 25 + ], 26 + "paths": { 27 + "@/*": [ 28 + "./src/*" 29 + ] 30 + } 31 + }, 32 + "include": [ 33 + "next-env.d.ts", 34 + "**/*.ts", 35 + "**/*.tsx", 36 + ".next/types/**/*.ts", 37 + ".next/dev/types/**/*.ts" 38 + ], 39 + "exclude": [ 40 + "node_modules" 41 + ] 42 + }