diff --git a/.gitignore b/.gitignore index f77840056a..31c6f7a945 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,9 @@ *.env .agent +# Generated Claude skills (source is docs-site/docs/) +.claude/skills/ + npm-debug.log* yarn-debug.log* yarn-error.log* diff --git a/docs-site/.gitignore b/docs-site/.gitignore new file mode 100644 index 0000000000..7dbe29a8f5 --- /dev/null +++ b/docs-site/.gitignore @@ -0,0 +1,23 @@ +# Dependencies +node_modules/ +/.pnp +.pnp.js + +# Production +/build + +# Generated files +.docusaurus +.cache-loader +sidebars.js + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs-site/README.md b/docs-site/README.md new file mode 100644 index 0000000000..1759795432 --- /dev/null +++ b/docs-site/README.md @@ -0,0 +1,283 @@ +# FinishLine Documentation Site + +This directory contains the Docusaurus-based documentation site for FinishLine developers. + +## Architecture + +**Source of Truth:** `docs-site/docs/` contains all developer documentation in standard Docusaurus markdown format. + +**Claude AI Integration:** Documentation files flagged with `skill: true` in their frontmatter are automatically synced to `.claude/skills/` for Claude AI to use as context when helping with development. + +### Workflow + +1. **Developers edit**: `docs-site/docs/` (tracked in Git) +2. **Run sync**: `yarn skills:sync` generates `.claude/skills/` (gitignored) +3. **Claude reads**: `.claude/skills/` to understand the codebase + +This approach allows us to: + +- Maintain comprehensive documentation for developers +- Selectively sync relevant docs to Claude's skills +- Have docs-only content (deployment, architecture) that Claude doesn't need + +## Prerequisites + +- Node.js 18 or higher +- Yarn package manager (this project uses Yarn workspaces) + +## Setup + +The docs-site is part of the FinishLine monorepo workspace. Dependencies are managed from the root: + +```bash +# From the FinishLine root directory +yarn install +``` + +This will install all dependencies for docs-site along with the rest of the project. + +## Development + +### Running the documentation site locally: + +**From the root directory:** + +```bash +yarn docs:dev +``` + +**Or from within docs-site:** + +```bash +cd docs-site +yarn start +``` + +The Docusaurus development server will start at `http://localhost:3002`. + +The site will automatically reload when you edit files in `docs/`. + +## Building for Production + +To create a production build: + +**From root:** + +```bash +yarn docs:build +``` + +**Or from docs-site:** + +```bash +cd docs-site +yarn build +``` + +The static site will be generated in the `build/` directory. + +To test the production build locally: + +```bash +yarn docs:serve +``` + +## Syncing Skills for Claude + +After editing documentation that should be available to Claude: + +```bash +yarn skills:sync +``` + +This command: + +1. Scans all files in `docs/` for `skill: true` in frontmatter +2. Transforms them to Claude's SKILL.md format +3. Writes them to `.claude/skills/` (gitignored) + +**When to sync:** + +- After adding or editing documentation flagged as a skill +- Before using Claude for development (to ensure it has latest context) +- Can be automated in a pre-commit hook if desired + +## Project Structure + +``` +docs-site/ +├── docs/ # Source of truth - developer documentation +│ ├── intro.md +│ └── general-practices/ +│ ├── backend-endpoints.md +│ └── ... +├── scripts/ +│ ├── sync-skills.js # Generate .claude/skills/ from docs/ +│ └── generate-sidebar.js # Auto-generate sidebars.js from docs/ structure +├── src/ +│ ├── css/ +│ │ └── custom.css # Custom styling +│ └── pages/ +│ └── index.js # Homepage redirect +├── static/ +│ └── img/ # Static assets (logos, favicon) +├── docusaurus.config.js # Docusaurus configuration +├── sidebars.js # Auto-generated sidebar (gitignored) +└── package.json # Dependencies and scripts +``` + +## Adding New Documentation + +### For All Documentation (Developers): + +1. **Create a new markdown file** in `docs/`: + + ```bash + docs/deployment/github-actions.md + ``` + +2. **Add frontmatter:** + + ```yaml + --- + title: GitHub Actions Deployment + description: Guide for deploying FinishLine using GitHub Actions + skill: false # This is docs-only, not a Claude skill + --- + ``` + +3. **Test it:** + ```bash + yarn docs:dev + ``` + +The sidebar will be automatically generated from the folder structure! + +### For Documentation That Should Be a Claude Skill: + +1. **Create the markdown file** as above + +2. **Use `skill: true` in frontmatter:** + + ```yaml + --- + title: Backend Endpoints + description: Guide for creating API endpoints + skill: true + skill_name: backend-endpoints # Maps to folder name in .claude/skills/ + --- + ``` + +3. **Sync to Claude:** + ```bash + yarn skills:sync + ``` + +The sidebar will be automatically generated! + +### Organizing Documentation + +The sidebar navigation is **automatically generated** from the `docs/` folder structure: + +- **Reorder pages**: Rename files (alphabetical order is used) +- **Create categories**: Create nested folders in `docs/` +- **Change labels**: Folder names become category labels (use hyphens: `my-category`) + +The sidebar regenerates automatically when you run `yarn docs:dev` or `yarn docs:build`. + +You can also manually regenerate it: +```bash +yarn generate-sidebar +``` + +## Frontmatter Fields + +All documentation files should have frontmatter: + +| Field | Required | Purpose | Example | +| ------------- | ------------- | ------------------------------ | ---------------------------------- | +| `title` | Yes | Page title | `Backend Endpoints` | +| `description` | Yes | Page description | `Guide for creating API endpoints` | +| `skill` | Yes | Should sync to Claude? | `true` or `false` | +| `skill_name` | If skill:true | Folder name in .claude/skills/ | `backend-endpoints` | + +## Customization + +### Navbar and Footer + +Edit `docusaurus.config.js` to customize: + +- Site title and tagline +- Navbar links +- GitHub repository links +- Production URL + +### Styling + +Edit `src/css/custom.css` to customize: + +- Primary colors (currently set to NER red: #ef4345) +- Dark mode colors +- Font sizes and spacing +- Custom component styles + +### Sidebar Navigation + +The sidebar is **automatically generated** from the `docs/` folder structure. To customize it: + +- **Reorder pages**: Rename files (alphabetical sorting) +- **Create categories**: Create nested folders in `docs/` +- **Change labels**: Folder names become category labels (use hyphens: `my-category`) + +The sidebar regenerates each time you run `yarn docs:dev` or `yarn docs:build`. + +## Troubleshooting + +### Documentation not updating + +If your changes aren't appearing: + +1. Stop the dev server (Ctrl+C) +2. Clear the cache: `yarn clear` +3. Run `yarn docs:dev` again + +### Build errors + +Common issues: + +- **Node version**: Ensure you're running Node.js 18 or higher +- **Dependencies**: From the root directory, try `rm -rf docs-site/node_modules && yarn install` +- **Port conflict**: Docs run on port 3002. If it's in use, Docusaurus will try another port or you can stop the conflicting process + +### Skills not syncing + +If `yarn skills:sync` doesn't generate expected skills: + +- Verify the doc has `skill: true` in frontmatter +- Verify `skill_name` is set for all docs with `skill: true` +- Check the console output for warnings +- Ensure `.claude/skills/` is gitignored (it will be regenerated) + +## Future Enhancements + +Potential improvements for future iterations: + +- **Public deployment**: Deploy to GitHub Pages or Vercel +- **Search functionality**: Add DocSearch or local search plugin +- **Versioning**: Support documentation for multiple FinishLine versions +- **Interactive components**: Add live code examples or API explorers +- **Automated sync**: Pre-commit hook to run skills:sync automatically + +## Contributing + +When contributing to the documentation: + +1. Edit markdown files in `docs-site/docs/` +2. Test your changes locally with `yarn docs:dev` (sidebar auto-generates) +3. If you edited a skill doc (`skill: true`), run `yarn skills:sync` +4. Ensure the site builds successfully with `yarn docs:build` +5. Submit a PR with your documentation changes + +## License + +This documentation is part of the FinishLine project, licensed under GNU AGPLv3. diff --git a/docs-site/babel.config.js b/docs-site/babel.config.js new file mode 100644 index 0000000000..e00595dae7 --- /dev/null +++ b/docs-site/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/.claude/skills/general-practices/backend-endpoints/SKILL.md b/docs-site/docs/general-practices/backend-endpoints.md similarity index 78% rename from .claude/skills/general-practices/backend-endpoints/SKILL.md rename to docs-site/docs/general-practices/backend-endpoints.md index 64d179af78..6cc6782f20 100644 --- a/.claude/skills/general-practices/backend-endpoints/SKILL.md +++ b/docs-site/docs/general-practices/backend-endpoints.md @@ -1,6 +1,8 @@ --- -name: backend-endpoints +title: Backend Endpoints description: Guide for creating backend API endpoints in FinishLine following the Route → Controller → Service pattern with multi-tenant security. Use when creating new endpoints, adding API routes, implementing controllers or services, building backend request handlers, or when asked how the backend works. +skill: true +skill_name: backend-endpoints --- # Backend Endpoints @@ -58,30 +60,28 @@ If a service throws an exception, it bubbles up through the controller's `next(e ## File Locations -| Layer | Path | Naming | -| ------------- | ------------------------------------------------------ | --------------------------------------------- | -| Entry point | `src/backend/index.ts` | — | -| Routes | `src/backend/src/routes/{feature}.routes.ts` | `{feature}Router` | -| Controllers | `src/backend/src/controllers/{feature}.controllers.ts` | `{Feature}Controller` class | -| Services | `src/backend/src/services/{feature}.services.ts` | `{Feature}Service` class | -| Validation | `src/backend/src/utils/validation.utils.ts` | Shared validators | -| Errors | `src/backend/src/utils/errors.utils.ts` | `HttpException` subclasses | -| Express types | `src/backend/custom.d.ts` | `currentUser` and `organization` on `Request` | +| Layer | Path | Naming | +|-------|------|--------| +| Entry point | `src/backend/index.ts` | — | +| Routes | `src/backend/src/routes/{feature}.routes.ts` | `{feature}Router` | +| Controllers | `src/backend/src/controllers/{feature}.controllers.ts` | `{Feature}Controller` class | +| Services | `src/backend/src/services/{feature}.services.ts` | `{Feature}Service` class | +| Validation | `src/backend/src/utils/validation.utils.ts` | Shared validators | +| Errors | `src/backend/src/utils/errors.utils.ts` | `HttpException` subclasses | +| Express types | `src/backend/custom.d.ts` | `currentUser` and `organization` on `Request` | -For query args and transformers, see the [query-args-and-transformers](../query-args-and-transformers/SKILL.md) skill. +For query args and transformers, see the [query-args-and-transformers](./query-args-and-transformers) skill. ## How Endpoint URLs Work The full URL path for any endpoint is the **combination** of the base path registered in `src/backend/index.ts` and the route path in the router file. This is a very common source of confusion. For example, if `index.ts` registers: - ```typescript app.use('/calendar', calendarRouter); ``` And the router defines: - ```typescript calendarRouter.post('/shop/create', ...); ``` @@ -100,8 +100,13 @@ Add validation rules using `express-validator` and the helpers from `validation. // src/backend/src/routes/calendar.routes.ts import express from 'express'; import { body } from 'express-validator'; -import { nonEmptyString, isDate, validateInputs } from '../utils/validation.utils.js'; -import CalendarController from '../controllers/calendar.controllers.js'; +import { + nonEmptyString, + isDate, + validateInputs +} from '../utils/validation.utils.js'; +import CalendarController + from '../controllers/calendar.controllers.js'; const calendarRouter = express.Router(); @@ -127,7 +132,6 @@ export default calendarRouter; - URL params use `param()`, query strings use `query()`, body fields use `body()`. **When to abstract validators:** Keep validation inline in the route by default. Only extract validators into `validation.utils.ts` when: - - The request body contains a **nested object** that is itself a known entity (e.g., a work package embedded inside a project create payload). Create a named validator array like `workPackageProposedChangesValidators`. - The **same set of validations** is repeated across multiple routes (e.g., `descriptionBulletsValidators` used in both work package and project routes). @@ -139,7 +143,8 @@ If creating a brand new feature router, register it in `src/backend/index.ts`: ```typescript // src/backend/index.ts -import calendarRouter from './src/routes/calendar.routes.js'; +import calendarRouter + from './src/routes/calendar.routes.js'; // ... after getUserAndOrganization middleware ... app.use('/calendar', calendarRouter); @@ -154,18 +159,30 @@ Controllers follow a rigid structure: try/catch, extract request data, call serv ```typescript // src/backend/src/controllers/calendar.controllers.ts import { NextFunction, Request, Response } from 'express'; -import CalendarService from '../services/calendar.services.js'; +import CalendarService + from '../services/calendar.services.js'; export default class CalendarController { - static async createShop(req: Request, res: Response, next: NextFunction) { + static async createShop( + req: Request, + res: Response, + next: NextFunction + ) { try { - const { name, description, dateEstablished } = req.body; + const { name, description, dateEstablished } + = req.body; // Parse date strings to Date objects // before passing to the service const parsedDate = new Date(dateEstablished); - const shop = await CalendarService.createShop(req.currentUser, name, description, parsedDate, req.organization); + const shop = await CalendarService.createShop( + req.currentUser, + name, + description, + parsedDate, + req.organization + ); res.status(200).json(shop); } catch (error: unknown) { @@ -194,10 +211,16 @@ Services contain all business logic. // src/backend/src/services/calendar.services.ts import { User, Shop, notGuest } from 'shared'; import prisma from '../prisma/prisma.js'; -import { AccessDeniedGuestException, HttpException } from '../utils/errors.utils.js'; -import { shopTransformer } from '../transformers/calendar.transformer.js'; -import { getShopQueryArgs } from '../prisma-query-args/shop.query-args.js'; -import { userHasPermission } from '../utils/users.utils.js'; +import { + AccessDeniedGuestException, + HttpException +} from '../utils/errors.utils.js'; +import { shopTransformer } + from '../transformers/calendar.transformer.js'; +import { getShopQueryArgs } + from '../prisma-query-args/shop.query-args.js'; +import { userHasPermission } + from '../utils/users.utils.js'; import { Organization } from '@prisma/client'; export default class CalendarService { @@ -223,8 +246,16 @@ export default class CalendarService { organization: Organization ): Promise { // 1. Permission check - if (!(await userHasPermission(submitter.userId, organization.organizationId, notGuest))) { - throw new AccessDeniedGuestException('create shops'); + if ( + !(await userHasPermission( + submitter.userId, + organization.organizationId, + notGuest + )) + ) { + throw new AccessDeniedGuestException( + 'create shops' + ); } // 2. Business rule validation (inline select) @@ -238,7 +269,10 @@ export default class CalendarService { }); if (duplicate) { - throw new HttpException(400, 'A shop with that name already exists'); + throw new HttpException( + 400, + 'A shop with that name already exists' + ); } // 3. Database write (query args for response) @@ -272,7 +306,7 @@ export default class CalendarService { - ALWAYS filter `dateDeleted: null` on queries at both the top level and within nested includes/selects. - Deleting an entity MUST be a soft delete (`dateDeleted: new Date()`), never `prisma.*.delete()`. -For query args and transformer patterns, see the [query-args-and-transformers](../query-args-and-transformers/SKILL.md) skill. +For query args and transformer patterns, see the [query-args-and-transformers](./query-args-and-transformers) skill. ### Step 5: Deciding the Access Level @@ -280,20 +314,22 @@ Every write endpoint (and some sensitive reads) needs a permission check at the ```typescript import { - notGuest, // members and above - isLeadership, // leads and above - isHead, // heads and above - isAdmin // admins and app-admins only + notGuest, // members and above + isLeadership, // leads and above + isHead, // heads and above + isAdmin // admins and app-admins only } from 'shared'; if ( !(await userHasPermission( submitter.userId, organization.organizationId, - isHead // choose the right level + isHead // choose the right level )) ) { - throw new AccessDeniedAdminOnlyException('create event types'); + throw new AccessDeniedAdminOnlyException( + 'create event types' + ); } ``` @@ -312,16 +348,16 @@ Match the exception class to the level: `AccessDeniedGuestException` for `notGue Services throw exceptions from `src/backend/src/utils/errors.utils.ts`. The global `errorHandler` middleware catches them. -| Exception | Status | When to Use | -| ---------------------------------------- | ------ | ----------------------------------------- | -| `HttpException(status, msg)` | any | General-purpose with custom status | -| `NotFoundException(name, id)` | 404 | Entity not found | -| `DeletedException(name, id)` | 404 | Entity is soft-deleted | -| `AccessDeniedException(msg?)` | 403 | Generic permission failure | -| `AccessDeniedAdminOnlyException(action)` | 403 | Non-admin attempting admin action | -| `AccessDeniedMemberException(action)` | 403 | Guest/member attempting restricted action | -| `AccessDeniedGuestException(action)` | 403 | Guest attempting non-guest action | -| `InvalidOrganizationException(item)` | 400 | Entity not in current org | +| Exception | Status | When to Use | +|-----------|--------|-------------| +| `HttpException(status, msg)` | any | General-purpose with custom status | +| `NotFoundException(name, id)` | 404 | Entity not found | +| `DeletedException(name, id)` | 404 | Entity is soft-deleted | +| `AccessDeniedException(msg?)` | 403 | Generic permission failure | +| `AccessDeniedAdminOnlyException(action)` | 403 | Non-admin attempting admin action | +| `AccessDeniedMemberException(action)` | 403 | Guest/member attempting restricted action | +| `AccessDeniedGuestException(action)` | 403 | Guest attempting non-guest action | +| `InvalidOrganizationException(item)` | 400 | Entity not in current org | The `name` parameter for `NotFoundException` and `DeletedException` MUST be one of the values in the `ExceptionObjectNames` type union in `errors.utils.ts`. Add your entity to that type if it's not listed. @@ -329,17 +365,17 @@ The `name` parameter for `NotFoundException` and `DeletedException` MUST be one `src/backend/src/utils/validation.utils.ts` provides reusable validation chains: -| Helper | Validates | -| --------------------------- | ---------------------------- | -| `nonEmptyString(body('x'))` | Non-empty string | -| `intMinZero(body('x'))` | Integer ≥ 0, not a string | -| `decimalMinZero(body('x'))` | Decimal ≥ 0 | -| `isDate(body('x'))` | Parseable date string | -| `isOptionalDate(body('x'))` | Optional parseable date | -| `isRole(body('x'))` | Valid `RoleEnum` value | -| `isStatus(body('x'))` | Valid `WbsElementStatus` | -| `isEventStatus(body('x'))` | Valid `Event_Status` | -| `validateInputs` | Runs validation, returns 400 | +| Helper | Validates | +|--------|-----------| +| `nonEmptyString(body('x'))` | Non-empty string | +| `intMinZero(body('x'))` | Integer ≥ 0, not a string | +| `decimalMinZero(body('x'))` | Decimal ≥ 0 | +| `isDate(body('x'))` | Parseable date string | +| `isOptionalDate(body('x'))` | Optional parseable date | +| `isRole(body('x'))` | Valid `RoleEnum` value | +| `isStatus(body('x'))` | Valid `WbsElementStatus` | +| `isEventStatus(body('x'))` | Valid `Event_Status` | +| `validateInputs` | Runs validation, returns 400 | For complex reusable validators, spread them: `...descriptionBulletsValidators`. @@ -394,7 +430,7 @@ For complex reusable validators, spread them: `...descriptionBulletsValidators`. - [ ] Entity name added to `ExceptionObjectNames` if needed - [ ] All queries filter `dateDeleted: null` at every level - [ ] Delete operations are soft deletes -- [ ] Service returns transformed shared types (see [query-args-and-transformers](../query-args-and-transformers/SKILL.md)) +- [ ] Service returns transformed shared types (see [query-args-and-transformers](./query-args-and-transformers)) - [ ] Multiple writes wrapped in `prisma.$transaction()` - [ ] All imports use `.js` extensions - [ ] Router registered in `index.ts` (if new feature) diff --git a/.claude/skills/general-practices/frontend-forms/SKILL.md b/docs-site/docs/general-practices/frontend-forms.md similarity index 99% rename from .claude/skills/general-practices/frontend-forms/SKILL.md rename to docs-site/docs/general-practices/frontend-forms.md index 5dde3a0b6e..8c982ae0f6 100644 --- a/.claude/skills/general-practices/frontend-forms/SKILL.md +++ b/docs-site/docs/general-practices/frontend-forms.md @@ -1,6 +1,8 @@ --- -name: frontend-forms +title: Frontend Forms description: Guide for building forms in FinishLine using React Hook Form with MUI components and the NERFormModal abstraction. Covers useForm setup, Controller wrapping, create vs edit mode, form-modal reset lifecycle, and shared form field components. Use when creating new forms, adding form fields, building create/edit modals, working with React Hook Form, or debugging form state issues. NEVER use useEffect to sync form state. +skill: true +skill_name: frontend-forms --- # Frontend Forms diff --git a/.claude/skills/general-practices/frontend-hooks-and-apis/SKILL.md b/docs-site/docs/general-practices/frontend-hooks-and-apis.md similarity index 99% rename from .claude/skills/general-practices/frontend-hooks-and-apis/SKILL.md rename to docs-site/docs/general-practices/frontend-hooks-and-apis.md index f67fb42a4d..8c34d5ffcb 100644 --- a/.claude/skills/general-practices/frontend-hooks-and-apis/SKILL.md +++ b/docs-site/docs/general-practices/frontend-hooks-and-apis.md @@ -1,6 +1,8 @@ --- -name: frontend-hooks-and-apis +title: Frontend Hooks and APIs description: Guide for creating React Query hooks and Axios API client functions in FinishLine. Covers query hooks, mutation hooks, API functions, query keys, cache invalidation, toast notifications, and frontend transformers. Use when creating new hooks, adding API calls, writing query or mutation hooks, working with React Query, implementing cache invalidation, or when asked how frontend data fetching works. +skill: true +skill_name: frontend-hooks-and-apis --- # Frontend Hooks and API Client Functions diff --git a/.claude/skills/general-practices/postman-api-testing/SKILL.md b/docs-site/docs/general-practices/postman-api-testing.md similarity index 99% rename from .claude/skills/general-practices/postman-api-testing/SKILL.md rename to docs-site/docs/general-practices/postman-api-testing.md index 6e6bf950d3..c467565f76 100644 --- a/.claude/skills/general-practices/postman-api-testing/SKILL.md +++ b/docs-site/docs/general-practices/postman-api-testing.md @@ -1,6 +1,7 @@ --- -name: postman-api-testing +title: Postman API Testing description: Guide for using Postman to test and interact with the FinishLine API during development. Use when testing API endpoints, debugging backend issues, verifying request/response formats, or when asked how to use Postman with the local development environment. +skill: false --- # Postman API Testing diff --git a/.claude/skills/general-practices/prisma-schema-shared-types/SKILL.md b/docs-site/docs/general-practices/prisma-schema-shared-types.md similarity index 99% rename from .claude/skills/general-practices/prisma-schema-shared-types/SKILL.md rename to docs-site/docs/general-practices/prisma-schema-shared-types.md index 0c2295eca8..8a6dc72c9f 100644 --- a/.claude/skills/general-practices/prisma-schema-shared-types/SKILL.md +++ b/docs-site/docs/general-practices/prisma-schema-shared-types.md @@ -1,6 +1,8 @@ --- -name: prisma-schema-shared-types +title: Prisma Schema and Shared Types description: Guide for defining Prisma data models and keeping shared TypeScript types in sync in FinishLine. Covers schema conventions, enum patterns, multi-tenant organizationId scoping, the migration workflow, and the shared type barrel export. Use when adding new database models, creating or editing Prisma schema, defining shared types or interfaces, adding enums, running migrations, or when asked how the data layer works. +skill: true +skill_name: prisma-schema-shared-types --- # Prisma Schema and Shared Types diff --git a/.claude/skills/general-practices/query-args-and-transformers/SKILL.md b/docs-site/docs/general-practices/query-args-and-transformers.md similarity index 91% rename from .claude/skills/general-practices/query-args-and-transformers/SKILL.md rename to docs-site/docs/general-practices/query-args-and-transformers.md index 5a58a7f5f2..20f69b43fc 100644 --- a/.claude/skills/general-practices/query-args-and-transformers/SKILL.md +++ b/docs-site/docs/general-practices/query-args-and-transformers.md @@ -1,6 +1,8 @@ --- -name: query-args-and-transformers +title: Query Args and Transformers description: Guide for Prisma query args and transformer functions in FinishLine. Query args define reusable select/include objects for Prisma queries. Transformers convert Prisma results into shared types for the API. Use when creating query args, writing transformers, fetching data from Prisma for API responses, or when asked how data flows from the database to the frontend. +skill: true +skill_name: query-args-and-transformers --- # Query Args and Transformers @@ -43,11 +45,11 @@ This separation exists because Prisma's auto-generated types (column names, nest ## File Locations -| Layer | Path | Naming | -| ------------ | ----------------------------------------------------------- | ---------------------- | -| Query args | `src/backend/src/prisma-query-args/{feature}.query-args.ts` | `get{Entity}QueryArgs` | -| Transformers | `src/backend/src/transformers/{feature}.transformer.ts` | `{entity}Transformer` | -| Shared types | `src/shared/src/types/{feature}-types.ts` | TypeScript interfaces | +| Layer | Path | Naming | +|-------|------|--------| +| Query args | `src/backend/src/prisma-query-args/{feature}.query-args.ts` | `get{Entity}QueryArgs` | +| Transformers | `src/backend/src/transformers/{feature}.transformer.ts` | `{entity}Transformer` | +| Shared types | `src/shared/src/types/{feature}-types.ts` | TypeScript interfaces | ## Query Args @@ -60,9 +62,12 @@ Every query args file follows the same pattern: export a type alias using `Retur import { Prisma } from '@prisma/client'; import { getUserQueryArgs } from './user.query-args.js'; -export type ShopQueryArgs = ReturnType; +export type ShopQueryArgs = + ReturnType; -export const getShopQueryArgs = (organizationId: string) => +export const getShopQueryArgs = ( + organizationId: string +) => Prisma.validator()({ include: { userCreated: getUserQueryArgs(organizationId) @@ -103,7 +108,9 @@ A good example of selective fetching is `getWorkPackagePreviewQueryArgs`, which ```typescript export const getWorkPackagePreviewQueryArgs = () => - Prisma.validator()({ + Prisma.validator< + Prisma.Work_PackageDefaultArgs + >()({ select: { blockedBy: true, wbsElement: { @@ -144,12 +151,10 @@ export const getWorkPackagePreviewQueryArgs = () => Be very careful about nested query args. Every level of nesting adds database joins and increases query cost. Only include nested relations when the transformer actually needs that data to satisfy the shared type. **Good reasons to nest:** - - The shared type has a `userCreated: User` field → nest `getUserQueryArgs` - The shared type has a `teams: Team[]` field that needs team names → nest with `select: { teamName: true, teamId: true }` **Bad reasons to nest:** - - "The frontend might need it eventually" — add it when it's actually needed - Nesting three or more levels deep without confirming the transformer uses all that data @@ -160,10 +165,14 @@ When nesting gets deep, consider whether a separate endpoint with its own query Many query args accept `organizationId` to scope nested relations. The most common case is filtering user roles to the current organization: ```typescript -export const getUserQueryArgs = (organizationId?: string) => +export const getUserQueryArgs = ( + organizationId?: string +) => Prisma.validator()({ select: { - roles: organizationId ? { where: { organizationId } } : true, + roles: organizationId + ? { where: { organizationId } } + : true, userId: true, firstName: true, lastName: true, @@ -179,8 +188,12 @@ Pass `organizationId` through from the service method. If your query args don't Query args MUST filter out soft-deleted records in nested relations using `where: { dateDeleted: null }`. This applies at every nesting level: ```typescript -export const getWorkPackageQueryArgs = (organizationId: string) => - Prisma.validator()({ +export const getWorkPackageQueryArgs = ( + organizationId: string +) => + Prisma.validator< + Prisma.Work_PackageDefaultArgs + >()({ include: { blockedBy: { where: { dateDeleted: null } @@ -193,7 +206,9 @@ export const getWorkPackageQueryArgs = (organizationId: string) => include: { descriptionBullets: { where: { dateDeleted: null }, - ...getDescriptionBulletQueryArgs(organizationId) + ...getDescriptionBulletQueryArgs( + organizationId + ) }, changes: { where: { @@ -227,10 +242,14 @@ A transformer is a pure function that takes a Prisma result (typed using the que // src/backend/src/transformers/calendar.transformer.ts import { Prisma } from '@prisma/client'; import { Shop } from 'shared'; -import { ShopQueryArgs } from '../prisma-query-args/shop.query-args.js'; -import { userTransformer } from './user.transformer.js'; - -export const shopTransformer = (shop: Prisma.ShopGetPayload): Shop => { +import { ShopQueryArgs } + from '../prisma-query-args/shop.query-args.js'; +import { userTransformer } + from './user.transformer.js'; + +export const shopTransformer = ( + shop: Prisma.ShopGetPayload +): Shop => { return { shopId: shop.shopId, name: shop.name, @@ -248,16 +267,18 @@ export const shopTransformer = (shop: Prisma.ShopGetPayload): Sho ### Common Transformer Operations **Renaming fields** — when Prisma column names differ from the shared type: - ```typescript color: calendar.colorHexCode, ``` **Mapping enums** — Prisma enums and shared enums are separate types. Create a mapping: - ```typescript -export const eventStatusTransformer = (status: PrismaEventStatus): EventStatus => { - const mapping: Record = { +export const eventStatusTransformer = ( + status: PrismaEventStatus +): EventStatus => { + const mapping: Record< + PrismaEventStatus, EventStatus + > = { UNCONFIRMED: EventStatus.UNCONFIRMED, CONFIRMED: EventStatus.CONFIRMED, SCHEDULED: EventStatus.SCHEDULED, @@ -268,14 +289,12 @@ export const eventStatusTransformer = (status: PrismaEventStatus): EventStatus = ``` **Converting nulls to undefined** — Prisma uses `null` for optional fields, but shared types often use `undefined`: - ```typescript location: event.location ?? undefined, zoomLink: event.zoomLink ?? undefined, ``` **Transforming nested relations** — call other transformers for nested objects: - ```typescript requiredMembers: event.requiredMembers.map(userTransformer), @@ -287,8 +306,8 @@ teams: event.teams.map((team) => ({ })), ``` -**Computing derived fields** — some shared types have fields that don't exist in the database: +**Computing derived fields** — some shared types have fields that don't exist in the database: ```typescript endDate: calculateEndDate( wpInput.startDate, wpInput.duration @@ -301,7 +320,11 @@ deleted: wpInput.wbsElement.dateDeleted !== null, Transformers compose naturally. A `shopMachineryTransformer` calls `shopTransformer`, which calls `userTransformer`: ```typescript -export const shopMachineryTransformer = (sm: Prisma.Shop_MachineryGetPayload): ShopMachinery => { +export const shopMachineryTransformer = ( + sm: Prisma.Shop_MachineryGetPayload< + ShopMachineryQueryArgs + > +): ShopMachinery => { return { shopMachineryId: sm.shopMachineryId, shop: shopTransformer(sm.shop), @@ -319,19 +342,19 @@ When the frontend needs a lightweight version of an entity (for dropdowns, lists ```typescript // Query args: minimal select export const getWorkPackagePreviewQueryArgs = () => - Prisma.validator()({ - select: { - /* only essential fields */ - } + Prisma.validator< + Prisma.Work_PackageDefaultArgs + >()({ + select: { /* only essential fields */ } }); // Transformer: maps to preview type export const workPackagePreviewTransformer = ( - wp: Prisma.Work_PackageGetPayload + wp: Prisma.Work_PackageGetPayload< + WorkPackagePreviewQueryArgs + > ): WorkPackagePreview => { - return { - /* minimal fields */ - }; + return { /* minimal fields */ }; }; ``` diff --git a/.claude/skills/general-practices/react-components/SKILL.md b/docs-site/docs/general-practices/react-components.md similarity index 99% rename from .claude/skills/general-practices/react-components/SKILL.md rename to docs-site/docs/general-practices/react-components.md index 861a669e90..66805457d8 100644 --- a/.claude/skills/general-practices/react-components/SKILL.md +++ b/docs-site/docs/general-practices/react-components.md @@ -1,6 +1,8 @@ --- -name: react-components +title: React Components description: Guide for building and organizing React components in FinishLine. Covers shared vs page-specific component decisions, prop interface design, MUI sx styling, styled() MUI extensions, stateless component patterns, and the container/view split. Use when creating new React components, refactoring UI code, deciding where a component belongs, or when asked about component architecture or styling conventions. +skill: true +skill_name: react-components --- # React Component Architecture diff --git a/.claude/skills/general-practices/repository-overview/SKILL.md b/docs-site/docs/general-practices/repository-overview.md similarity index 89% rename from .claude/skills/general-practices/repository-overview/SKILL.md rename to docs-site/docs/general-practices/repository-overview.md index 28359d707e..424f4f0845 100644 --- a/.claude/skills/general-practices/repository-overview/SKILL.md +++ b/docs-site/docs/general-practices/repository-overview.md @@ -1,6 +1,8 @@ --- -name: repository-overview +title: Repository Overview description: High-level overview of the FinishLine monorepo structure, tech stack, tools, and how they work together. Use when onboarding to the codebase, asking about the project structure, wondering what technology FinishLine uses, asking where files live, or needing to understand how the frontend, backend, and shared packages relate to each other. +skill: true +skill_name: repository-overview --- # Repository Overview @@ -50,7 +52,6 @@ src/backend/ ``` Key technology choices: - - **Express 5** for HTTP routing and middleware - **Prisma 6** as the ORM with PostgreSQL - **express-validator** for request input validation on routes @@ -81,7 +82,6 @@ src/frontend/ ``` Key technology choices: - - **React 19** with functional components and hooks - **Vite 6** for dev server and production builds - **Material-UI (MUI) v6** for the component library and styling @@ -123,7 +123,6 @@ src/shared/ ``` Types are imported throughout the codebase as: - ```typescript import { Project, User, WbsNumber } from 'shared'; ``` @@ -213,23 +212,23 @@ FinishLine uses an unconventional HTTP method pattern: **GET for reads, POST for When looking for code related to a specific feature, files follow a consistent naming pattern across the stack: -| Layer | Path Pattern | Example (Calendar) | -| ----------------- | ----------------------------------------------------------- | ------------------------- | -| Routes | `src/backend/src/routes/{feature}.routes.ts` | `calendar.routes.ts` | -| Controllers | `src/backend/src/controllers/{feature}.controllers.ts` | `calendar.controllers.ts` | -| Services | `src/backend/src/services/{feature}.services.ts` | `calendar.services.ts` | -| Prisma Query Args | `src/backend/src/prisma-query-args/{feature}.query-args.ts` | `calendar.query-args.ts` | -| Transformers | `src/backend/src/transformers/{feature}.transformer.ts` | `calendar.transformer.ts` | -| Backend Utils | `src/backend/src/utils/{feature}.utils.ts` | `calendar.utils.ts` | -| Backend Tests | `src/backend/tests/unit/{feature}.test.ts` | `calendar.test.ts` | -| Shared Types | `src/shared/src/types/{feature}-types.ts` | `calendar-types.ts` | -| Frontend APIs | `src/frontend/src/apis/{feature}.api.ts` | `calendar.api.ts` | -| Frontend Hooks | `src/frontend/src/hooks/{feature}.hooks.ts` | `calendar.hooks.ts` | -| Frontend Pages | `src/frontend/src/pages/{FeaturePage}/` | `CalendarPage/` | -| Frontend Utils | `src/frontend/src/utils/{feature}.utils.ts` | `calendar.utils.ts` | -| Frontend Tests | `src/frontend/src/tests/pages/{FeaturePage}/` | — | -| URL Builders | `src/frontend/src/utils/urls.ts` | (all in one file) | -| Frontend Routes | `src/frontend/src/utils/routes.ts` | (all in one file) | +| Layer | Path Pattern | Example (Calendar) | +|-------|-------------|-------------------| +| Routes | `src/backend/src/routes/{feature}.routes.ts` | `calendar.routes.ts` | +| Controllers | `src/backend/src/controllers/{feature}.controllers.ts` | `calendar.controllers.ts` | +| Services | `src/backend/src/services/{feature}.services.ts` | `calendar.services.ts` | +| Prisma Query Args | `src/backend/src/prisma-query-args/{feature}.query-args.ts` | `calendar.query-args.ts` | +| Transformers | `src/backend/src/transformers/{feature}.transformer.ts` | `calendar.transformer.ts` | +| Backend Utils | `src/backend/src/utils/{feature}.utils.ts` | `calendar.utils.ts` | +| Backend Tests | `src/backend/tests/unit/{feature}.test.ts` | `calendar.test.ts` | +| Shared Types | `src/shared/src/types/{feature}-types.ts` | `calendar-types.ts` | +| Frontend APIs | `src/frontend/src/apis/{feature}.api.ts` | `calendar.api.ts` | +| Frontend Hooks | `src/frontend/src/hooks/{feature}.hooks.ts` | `calendar.hooks.ts` | +| Frontend Pages | `src/frontend/src/pages/{FeaturePage}/` | `CalendarPage/` | +| Frontend Utils | `src/frontend/src/utils/{feature}.utils.ts` | `calendar.utils.ts` | +| Frontend Tests | `src/frontend/src/tests/pages/{FeaturePage}/` | — | +| URL Builders | `src/frontend/src/utils/urls.ts` | (all in one file) | +| Frontend Routes | `src/frontend/src/utils/routes.ts` | (all in one file) | ## Feature Areas @@ -259,7 +258,6 @@ FinishLine requires **Docker** for the PostgreSQL database regardless of how you ### Initial Setup First time setup (or after pulling new dependencies): - ```bash yarn install # Install all workspace dependencies yarn prisma:generate # Generate the Prisma client from the schema @@ -268,7 +266,6 @@ yarn prisma:generate # Generate the Prisma client from the schema ### Database Setup The PostgreSQL database always runs in a Docker container. The `yarn database:setup` command handles everything: it writes the `DATABASE_URL` to `src/backend/.env`, starts a PostgreSQL container named `finishline` on port 5432, creates the `nerpm` database, and runs Prisma migrations with seed data: - ```bash yarn database:setup # One-time: create Postgres container + seed DB ``` @@ -280,14 +277,12 @@ After initial setup, the container persists. If you restart your machine, start You have two options for running the frontend and backend: on your host machine or in Docker containers. Either way, they connect to the same PostgreSQL container. **Option A: Host machine (recommended for faster iteration)** - ```bash yarn start # Builds shared, starts backend (nodemon, port 3001) # + frontend (vite, port 3000) concurrently ``` Or run them individually: - ```bash yarn frontend # Frontend dev server on port 3000 yarn backend:dev # Backend with nodemon on port 3001 @@ -295,7 +290,6 @@ yarn workspace shared build # Rebuild shared (required after changing shared t ``` **Option B: Docker containers** - ```bash yarn docker:start # Start frontend + backend + DB containers yarn docker:dev # Full docker dev environment with watch mode @@ -305,7 +299,6 @@ yarn docker:i # Install deps inside containers ### Database Commands These commands manage the Prisma schema and database state: - ```bash yarn prisma:generate # Regenerate Prisma client — run after ANY schema.prisma change yarn prisma:migrate # Create and apply a new migration — run after adding/changing diff --git a/docs-site/docs/intro.md b/docs-site/docs/intro.md new file mode 100644 index 0000000000..4aa5c8c705 --- /dev/null +++ b/docs-site/docs/intro.md @@ -0,0 +1,45 @@ +--- +title: Introduction +description: Welcome to the FinishLine developer documentation +skill: false +--- + +# FinishLine Developer Documentation + +Welcome to the FinishLine developer documentation! This site contains comprehensive guides for developing and maintaining the FinishLine project management platform. + +## What is FinishLine? + +FinishLine is a full-stack ERP and project management application built for **Northeastern Electric Racing (NER)**, a student engineering organization at Northeastern University that designs, builds, and races electric vehicles. + +## Documentation Structure + +The documentation is organized by topic in the sidebar. Browse the categories to find guides on: + +- Setting up your development environment +- Backend architecture and patterns +- API development and testing +- Database queries and data transformations +- And more! + +## Getting Started + +If you're new to the project, we recommend starting with: + +1. [Repository Overview](general-practices/repository-overview) - Understand the overall architecture and set up your development environment +2. [Backend Endpoints](general-practices/backend-endpoints) - Learn the backend patterns and API structure +3. [Postman API Testing](general-practices/postman-api-testing) - Learn how to test APIs with Postman + +## Contributing + +This documentation is the source of truth for developer guides. To contribute: + +1. Edit the relevant documentation file in `docs-site/docs/` +2. Run `yarn docs:dev` to see your changes +3. If you edited a skill doc (`skill: true`), run `yarn skills:sync` to update Claude's skills +4. Submit a pull request with your documentation changes + +## Need Help? + +- Check the [GitHub repository](https://github.com/Northeastern-Electric-Racing/FinishLine) +- Reach out to the development team on Slack diff --git a/docs-site/docusaurus.config.js b/docs-site/docusaurus.config.js new file mode 100644 index 0000000000..5e4a9cd5f8 --- /dev/null +++ b/docs-site/docusaurus.config.js @@ -0,0 +1,97 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'FinishLine Documentation', + tagline: 'Developer documentation for Northeastern Electric Racing\'s project management platform', + favicon: 'img/favicon.ico', + + // Production URL - update this when deploying + url: 'https://northeastern-electric-racing.github.io', + // Base URL - update if deploying to a subdirectory (e.g., /FinishLine/) + baseUrl: '/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'Northeastern-Electric-Racing', // Usually your GitHub org/user name. + projectName: 'FinishLine', // Usually your repo name. + + onBrokenLinks: 'throw', + + // Markdown configuration + markdown: { + format: 'mdx', + mermaid: false, + hooks: { + onBrokenMarkdownLinks: 'warn', + }, + }, + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + // Point to the source documentation files in docs-site/docs/ + editUrl: + 'https://github.com/Northeastern-Electric-Racing/FinishLine/edit/main/docs-site/docs/', + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Social card for link previews (uses logo for now) + image: 'img/logo.png', + navbar: { + title: 'FinishLine Docs', + logo: { + alt: 'NER Logo', + src: 'img/logo.png', + href: '/docs/intro', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'tutorialSidebar', + position: 'left', + label: 'Documentation', + }, + { + href: 'https://github.com/Northeastern-Electric-Racing/FinishLine', + label: 'GitHub', + position: 'right', + }, + ], + }, + + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/docs-site/package.json b/docs-site/package.json new file mode 100644 index 0000000000..3192c0b650 --- /dev/null +++ b/docs-site/package.json @@ -0,0 +1,48 @@ +{ + "name": "finishline-docs", + "version": "1.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start --port 3002", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "sync-skills": "node scripts/sync-skills.js", + "generate-sidebar": "node scripts/generate-sidebar.js", + "docs:dev": "yarn generate-sidebar && yarn start", + "docs:build": "yarn generate-sidebar && yarn build" + }, + "dependencies": { + "@docusaurus/core": "^3.1.0", + "@docusaurus/preset-classic": "^3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.1.0", + "@docusaurus/types": "^3.1.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/docs-site/scripts/generate-sidebar.js b/docs-site/scripts/generate-sidebar.js new file mode 100644 index 0000000000..d67fc5fee5 --- /dev/null +++ b/docs-site/scripts/generate-sidebar.js @@ -0,0 +1,104 @@ +const fs = require('fs'); +const path = require('path'); + +// Paths +const DOCS_DIR = path.join(__dirname, '../docs'); +const SIDEBAR_PATH = path.join(__dirname, '../sidebars.js'); + +/** + * Recursively build sidebar structure from docs directory + */ +function buildSidebarStructure(dir, basePath = '') { + const items = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + // Separate files and directories + const files = entries.filter((e) => e.isFile() && e.name.endsWith('.md') && e.name !== 'intro.md'); + const directories = entries.filter((e) => e.isDirectory()); + + // Sort alphabetically + files.sort((a, b) => a.name.localeCompare(b.name)); + directories.sort((a, b) => a.name.localeCompare(b.name)); + + // Process directories (categories) + directories.forEach((dirEntry) => { + const dirPath = path.join(dir, dirEntry.name); + const categoryItems = buildSidebarStructure(dirPath, path.join(basePath, dirEntry.name)); + + if (categoryItems.length > 0) { + // Convert directory name to human-readable label + const label = dirEntry.name + .split('-') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + + items.push({ + type: 'category', + label: label, + items: categoryItems, + }); + } + }); + + // Process files in current directory + files.forEach((file) => { + const docId = path.join(basePath, file.name.replace('.md', '')).replace(/\\/g, '/'); + items.push(docId); + }); + + return items; +} + +/** + * Generate sidebars.js file + */ +function generateSidebars() { + try { + console.log('🔄 Generating sidebar...\n'); + + if (!fs.existsSync(DOCS_DIR)) { + console.error(`❌ Error: Docs directory not found at ${DOCS_DIR}`); + process.exit(1); + } + + const sidebarItems = buildSidebarStructure(DOCS_DIR); + + const sidebarsContent = `/** + * Auto-generated sidebar configuration. + * + * This file is automatically generated from the docs/ folder structure. + * To regenerate: yarn generate-sidebar + * + * To modify the sidebar: + * - Rename folders/files to change labels + * - Reorder by renaming (alphabetical order is used) + * - Create nested folders for hierarchical categories + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + tutorialSidebar: [ + { + type: 'doc', + id: 'intro', + label: 'Introduction', + }, +${sidebarItems.map((item) => ' ' + JSON.stringify(item, null, 2).split('\n').join('\n ')).join(',\n')}, + ], +}; + +export default sidebars; +`; + + fs.writeFileSync(SIDEBAR_PATH, sidebarsContent); + console.log('✓ Generated sidebars.js\n'); + } catch (error) { + console.error('\n❌ Error generating sidebar:'); + console.error(error.message); + process.exit(1); + } +} + +generateSidebars(); diff --git a/docs-site/scripts/sync-skills.js b/docs-site/scripts/sync-skills.js new file mode 100644 index 0000000000..301315e46a --- /dev/null +++ b/docs-site/scripts/sync-skills.js @@ -0,0 +1,224 @@ +const fs = require('fs'); +const path = require('path'); + +// Paths +const DOCS_DIR = path.join(__dirname, '../docs'); +const SKILLS_DIR = path.join(__dirname, '../../.claude/skills'); + +/** + * Recursively find all markdown files + */ +function findMarkdownFiles(dir, fileList = []) { + const files = fs.readdirSync(dir); + + files.forEach((file) => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + findMarkdownFiles(filePath, fileList); + } else if (file.endsWith('.md')) { + fileList.push(filePath); + } + }); + + return fileList; +} + +/** + * Parse frontmatter from markdown + */ +function parseFrontmatter(content) { + // Handle both Unix (\n) and Windows (\r\n) line endings + const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---/; + const match = content.match(frontmatterRegex); + + if (!match) { + return { metadata: {}, content }; + } + + const yamlContent = match[1]; + const restOfContent = content.slice(match[0].length); + + // Parse YAML + const lines = yamlContent.split('\n'); + const metadata = {}; + let currentKey = null; + let currentValue = ''; + + lines.forEach((line) => { + const keyMatch = line.match(/^(\w+):\s*(.*)$/); + if (keyMatch) { + // Save previous key-value pair + if (currentKey) { + let value = currentValue.trim(); + // Handle booleans + if (value === 'true') value = true; + else if (value === 'false') value = false; + // Remove quotes + else if (typeof value === 'string') { + value = value.replace(/^["']|["']$/g, ''); + } + metadata[currentKey] = value; + } + // Start new key + currentKey = keyMatch[1]; + currentValue = keyMatch[2]; + } else if (currentKey && line.trim()) { + // Continue multi-line value + currentValue += ' ' + line.trim(); + } + }); + + // Save last key-value pair + if (currentKey) { + let value = currentValue.trim(); + if (value === 'true') value = true; + else if (value === 'false') value = false; + else if (typeof value === 'string') { + value = value.replace(/^["']|["']$/g, ''); + } + metadata[currentKey] = value; + } + + return { metadata, content: restOfContent }; +} + +/** + * Transform to Claude SKILL.md format + */ +function transformToSkillFormat(metadata, content) { + const skillFrontmatter = `--- +name: ${metadata.skill_name} +description: >- + ${metadata.description} +---`; + + return skillFrontmatter + content; +} + +/** + * Transform Docusaurus links to SKILL.md links + * Handles: ./doc or ../category/doc → proper SKILL.md paths + * Avoids double-adding /SKILL.md if it's already there + */ +function transformLinksForSkills(content) { + // Match markdown links and transform them + content = content.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (fullMatch, linkText, linkPath) => { + // Skip if already ends with /SKILL.md + if (linkPath.endsWith('/SKILL.md')) { + return fullMatch; + } + + // Skip external links (http/https) + if (linkPath.startsWith('http://') || linkPath.startsWith('https://')) { + return fullMatch; + } + + // Skip anchor links + if (linkPath.startsWith('#')) { + return fullMatch; + } + + // Transform ./doc → ../doc/SKILL.md + if (linkPath.startsWith('./')) { + const cleanPath = linkPath.substring(2); // Remove ./ + return `[${linkText}](../${cleanPath}/SKILL.md)`; + } + + // Transform ../doc → ../../doc/SKILL.md + if (linkPath.startsWith('../')) { + return `[${linkText}](../${linkPath}/SKILL.md)`; + } + + // Leave other links unchanged + return fullMatch; + }); + + return content; +} + +/** + * Process a single doc file + */ +function processDocFile(docPath) { + const content = fs.readFileSync(docPath, 'utf-8'); + const { metadata, content: bodyContent } = parseFrontmatter(content); + + // Skip if not flagged as a skill + if (!metadata.skill) { + return null; + } + + // Validate required fields + if (!metadata.skill_name) { + console.warn(`⚠️ ${path.basename(docPath)} has skill:true but no skill_name, skipping`); + return null; + } + + // Transform content + const transformedContent = transformToSkillFormat(metadata, bodyContent); + const linkedContent = transformLinksForSkills(transformedContent); + + // Determine skill path (recreate folder/file/SKILL.md structure) + const relativePath = path.relative(DOCS_DIR, path.dirname(docPath)); + const skillDir = path.join(SKILLS_DIR, relativePath, metadata.skill_name); + const skillPath = path.join(skillDir, 'SKILL.md'); + + // Create directory and write + fs.mkdirSync(skillDir, { recursive: true }); + fs.writeFileSync(skillPath, linkedContent); + + const relativeSkillPath = path.relative(SKILLS_DIR, skillPath); + console.log(`✓ Synced: ${path.basename(docPath)} → ${relativeSkillPath}`); + + return skillPath; +} + +/** + * Main function + */ +function main() { + try { + console.log('🔄 Syncing documentation to skills...\n'); + + // Check if docs exists + if (!fs.existsSync(DOCS_DIR)) { + console.error(`❌ Error: Docs directory not found at ${DOCS_DIR}`); + console.error('Create documentation in docs-site/docs/ first'); + process.exit(1); + } + + // Clean skills directory + if (fs.existsSync(SKILLS_DIR)) { + fs.rmSync(SKILLS_DIR, { recursive: true }); + console.log('✓ Cleaned skills directory'); + } + + // Create skills directory + fs.mkdirSync(SKILLS_DIR, { recursive: true }); + + // Find all docs + const docFiles = findMarkdownFiles(DOCS_DIR); + console.log(`Found ${docFiles.length} documentation files\n`); + + // Process each file + let syncedCount = 0; + docFiles.forEach((docPath) => { + const result = processDocFile(docPath); + if (result) syncedCount++; + }); + + if (syncedCount === 0) { + console.warn('\n⚠️ No skills generated! Make sure your docs have skill:true in frontmatter'); + } else { + console.log(`\n✅ Sync complete! ${syncedCount} skills generated\n`); + } + } catch (error) { + console.error('\n❌ Error syncing documentation:'); + console.error(error.message); + process.exit(1); + } +} + +main(); diff --git a/docs-site/src/css/custom.css b/docs-site/src/css/custom.css new file mode 100644 index 0000000000..b6ccea4897 --- /dev/null +++ b/docs-site/src/css/custom.css @@ -0,0 +1,30 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #ef4345; + --ifm-color-primary-dark: #ec2022; + --ifm-color-primary-darker: #e61113; + --ifm-color-primary-darkest: #be0e10; + --ifm-color-primary-light: #f26668; + --ifm-color-primary-lighter: #f37577; + --ifm-color-primary-lightest: #f79c9d; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #f26668; + --ifm-color-primary-dark: #f04446; + --ifm-color-primary-darker: #ef3537; + --ifm-color-primary-darkest: #d91e20; + --ifm-color-primary-light: #f4888a; + --ifm-color-primary-lighter: #f59799; + --ifm-color-primary-lightest: #f8b7b8; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/docs-site/src/pages/index.js b/docs-site/src/pages/index.js new file mode 100644 index 0000000000..1f6f29f007 --- /dev/null +++ b/docs-site/src/pages/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import { Redirect } from '@docusaurus/router'; + +export default function Home() { + return ; +} diff --git a/docs-site/static/img/favicon.ico b/docs-site/static/img/favicon.ico new file mode 100644 index 0000000000..f2f3cabc84 Binary files /dev/null and b/docs-site/static/img/favicon.ico differ diff --git a/docs-site/static/img/logo.png b/docs-site/static/img/logo.png new file mode 100644 index 0000000000..77b5d37c91 Binary files /dev/null and b/docs-site/static/img/logo.png differ diff --git a/package.json b/package.json index 8a9c37b41a..13cdd0da5b 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "workspaces": [ "src/backend", "src/frontend", - "src/shared" + "src/shared", + "docs-site" ], "scripts": { "prettier-check": "yarn prettier --check .", @@ -59,7 +60,11 @@ "docker:i": "cd devContainerization && docker compose -f docker-compose.dev.yml exec -T backend sh -c \"yarn install && cd src/backend && npx prisma generate\" && docker compose -f docker-compose.dev.yml exec -T frontend sh -c \"yarn install\"", "docker:test": "yarn test:setup && cd devContainerization && docker compose -f docker-compose.dev.yml exec backend bash -c \"yarn test:backend\" && docker compose -f docker-compose.dev.yml exec frontend sh -c \"yarn test:frontend\" && yarn test:teardown", "docker:rebuild": "docker compose -f devContainerization/docker-compose.dev.yml rm -f -s && yarn docker:start", - "db:pull": "node scripts/db-pull.mjs" + "db:pull": "node scripts/db-pull.mjs", + "docs:dev": "yarn workspace finishline-docs docs:dev", + "docs:build": "yarn workspace finishline-docs docs:build", + "docs:serve": "yarn workspace finishline-docs serve", + "skills:sync": "yarn workspace finishline-docs sync-skills" }, "resolutions": { "@types/react": "17.0.1", @@ -153,6 +158,8 @@ "build", "coverage", "docs", + "docs-site/.docusaurus", + "docs-site/build", "lambda", "node_modules", "public", diff --git a/src/backend/index.ts b/src/backend/index.ts index 88b099ddef..262412cd31 100644 --- a/src/backend/index.ts +++ b/src/backend/index.ts @@ -1,4 +1,4 @@ -import express from 'express'; +import express, { Router } from 'express'; import cors from 'cors'; import cookieParser from 'cookie-parser'; import { getUserAndOrganization, prodHeaders, requireJwtDev, requireJwtProd } from './src/utils/auth.utils.js'; @@ -16,7 +16,8 @@ import wbsElementTemplatesRouter from './src/routes/wbs-element-templates.routes import carsRouter from './src/routes/cars.routes.js'; import organizationRouter from './src/routes/organizations.routes.js'; import recruitmentRouter from './src/routes/recruitment.routes.js'; -import { slackEvents } from './src/routes/slack.routes.js'; +import { getReceiver } from './src/integrations/slack.js'; +import './src/routes/slack.routes.js'; import announcementsRouter from './src/routes/announcements.routes.js'; import onboardingRouter from './src/routes/onboarding.routes.js'; import popUpsRouter from './src/routes/pop-up.routes.js'; @@ -61,9 +62,15 @@ const options: cors.CorsOptions = { allowedHeaders }; -// so we can listen to slack messages -// NOTE: must be done before using json -app.use('/slack', slackEvents.requestListener()); +// Mount Slack Bolt receiver BEFORE other middleware to handle raw body parsing +// Bolt's receiver handles its own body parsing and request verification +// The receiver is configured to handle requests at /slack/events +// Only mount if Slack is configured (when SLACK_BOT_TOKEN is set) +const receiver = getReceiver(); +if (receiver) { + app.use(receiver.router as unknown as Router); +} + app.get('/health', (_req, res) => { res.status(200).json({ status: 'healthy' }); }); diff --git a/src/backend/package.json b/src/backend/package.json index 7f9ad3489d..fb2d599888 100644 --- a/src/backend/package.json +++ b/src/backend/package.json @@ -11,8 +11,7 @@ }, "dependencies": { "@prisma/client": "^6.2.1", - "@slack/events-api": "^3.0.1", - "@slack/web-api": "^7.8.0", + "@slack/bolt": "^3.22.0", "@types/concat-stream": "^2.0.0", "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.12", diff --git a/src/backend/src/controllers/slack.controllers.ts b/src/backend/src/controllers/slack.controllers.ts index 177f12a0a6..506f953740 100644 --- a/src/backend/src/controllers/slack.controllers.ts +++ b/src/backend/src/controllers/slack.controllers.ts @@ -1,6 +1,6 @@ -import { getWorkspaceId } from '../integrations/slack.js'; +import { getWorkspaceId, replyToMessageInThread } from '../integrations/slack.js'; import OrganizationsService from '../services/organizations.services.js'; -import SlackServices from '../services/slack.services.js'; +import SlackServices, { SlackBlockActionBody, SaboSubmissionActionValue } from '../services/slack.services.js'; export default class SlackController { static async processMessageEvent(event: any) { @@ -15,4 +15,71 @@ export default class SlackController { console.log(error); } } + + /** + * Handles the Slack block action for SABO submission confirmation. + * Performs action-specific validation and extracts relevant fields from the Slack action body. + * If validation fails, replies to the user in Slack with an error message. + * + * @param body The validated Slack block action body (general structure validated in routes) + */ + static async handleSaboSubmittedAction(body: SlackBlockActionBody) { + const { user, container, actions } = body; + const channelId = container.channel_id; + const threadTs = container.thread_ts || container.message_ts; + const [firstAction] = actions; + + try { + // Action-specific validation: verify action_id + if (firstAction.action_id !== 'sabo_submitted_confirmation') { + console.error('Unexpected action_id:', firstAction.action_id); + await replyToMessageInThread( + channelId, + threadTs, + `❌ An error occurred: Unexpected action type "${firstAction.action_id}". Please contact the software team.` + ); + return; + } + + // Action-specific validation: verify value format + let actionValue: SaboSubmissionActionValue; + try { + actionValue = JSON.parse(firstAction.value); + } catch (parseError) { + const parseErrorMsg = parseError instanceof Error ? parseError.message : 'Unknown parse error'; + await replyToMessageInThread( + channelId, + threadTs, + `❌ An error occurred: Invalid action data format.\n\n*Error:* ${parseErrorMsg}\n*Value:* \`${firstAction.value}\`\n\nPlease contact the software team.` + ); + return; + } + + // Validate that reimbursementRequestId exists in the parsed value + if (!actionValue.reimbursementRequestId || typeof actionValue.reimbursementRequestId !== 'string') { + const actionValueStr = JSON.stringify(actionValue, null, 2); + await replyToMessageInThread( + channelId, + threadTs, + `❌ An error occurred: Missing or invalid reimbursement request ID.\n\n*Parsed value:*\n\`\`\`${actionValueStr}\`\`\`\n\nPlease contact the software team.` + ); + return; + } + + // Extract validated fields + const userSlackId = user.id; + const { reimbursementRequestId } = actionValue; + + // Pass the extracted fields to the service layer for business logic + await SlackServices.handleSaboSubmittedAction(userSlackId, reimbursementRequestId); + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + await replyToMessageInThread( + channelId, + threadTs, + `❌ An unexpected error occurred while processing your request.\n\n*Error message:* ${errorMessage}\n\nPlease contact the software team and provide them with this information.` + ); + throw error; + } + } } diff --git a/src/backend/src/integrations/slack.ts b/src/backend/src/integrations/slack.ts index 683aa26060..2005e2a9e0 100644 --- a/src/backend/src/integrations/slack.ts +++ b/src/backend/src/integrations/slack.ts @@ -1,7 +1,52 @@ -import { ChatPostMessageResponse, WebClient } from '@slack/web-api'; +import bolt from '@slack/bolt'; +import type { App, ExpressReceiver } from '@slack/bolt'; import { HttpException } from '../utils/errors.utils.js'; -const slack = new WebClient(process.env.SLACK_BOT_TOKEN); +const { App: AppClass, ExpressReceiver: ExpressReceiverClass } = bolt; + +let receiver: ExpressReceiver | null = null; +let slackApp: App | null = null; +let slack: any = null; // Type will be inferred from slackApp.client (WebClient from Bolt) + +/** + * Initializes the Slack Bolt app, receiver, and client if not already initialized + * Only initializes if SLACK_BOT_TOKEN is present + */ +const initializeSlack = () => { + const { SLACK_BOT_TOKEN, SLACK_SIGNING_SECRET } = process.env; + + // Don't initialize if no token is configured (e.g., in tests) + if (!SLACK_BOT_TOKEN) { + return; + } + + // Don't re-initialize if already initialized + if (slackApp) { + return; + } + + // Initialize the receiver, app, and client + receiver = new ExpressReceiverClass({ + signingSecret: SLACK_SIGNING_SECRET || '', + endpoints: '/slack/events' + }); + + slackApp = new AppClass({ + token: SLACK_BOT_TOKEN, + receiver + }); + + slack = slackApp.client; +}; + +/** + * Get the Slack WebClient (initializes Slack if needed) + * @returns the Slack WebClient or null if no token is configured + */ +const getSlackClient = () => { + initializeSlack(); + return slack; +}; /** * Send a slack message @@ -12,14 +57,13 @@ const slack = new WebClient(process.env.SLACK_BOT_TOKEN); * @returns the channel id and timestamp of the created slack message */ export const sendMessage = async (slackId: string, message: string, link?: string, linkButtonText?: string) => { - const { SLACK_BOT_TOKEN } = process.env; - if (!SLACK_BOT_TOKEN) return; + const client = getSlackClient(); + if (!client) return; const block = generateSlackTextBlock(message, link, linkButtonText); try { - const response: ChatPostMessageResponse = await slack.chat.postMessage({ - token: SLACK_BOT_TOKEN, + const response = await client.chat.postMessage({ channel: slackId, text: message, blocks: [block], @@ -28,7 +72,8 @@ export const sendMessage = async (slackId: string, message: string, link?: strin return response && response.channel && response.ts && { channelId: response.channel, ts: response.ts }; } catch (error) { - throw new HttpException(500, 'Error sending slack message, reason: ' + (error as any).data.error); + console.error('Failed to send Slack message:', (error as any)?.data?.error ?? error); + return undefined; } }; @@ -47,21 +92,21 @@ export const replyToMessageInThread = async ( link?: string, linkButtonText?: string ) => { - const { SLACK_BOT_TOKEN } = process.env; - if (!SLACK_BOT_TOKEN) return; + const client = getSlackClient(); + if (!client) return; const block = generateSlackTextBlock(message, link, linkButtonText); try { - await slack.chat.postMessage({ - token: SLACK_BOT_TOKEN, + await client.chat.postMessage({ channel: slackId, thread_ts: parentTimestamp, text: message, blocks: [block] }); } catch (error) { - throw new HttpException(500, 'Error sending slack reply to thread, reason: ' + (error as any).data.error); + console.error('Failed to send Slack thread reply:', (error as any)?.data?.error ?? error); + return undefined; } }; @@ -80,21 +125,21 @@ export const editMessage = async ( link?: string, linkButtonText?: string ) => { - const { SLACK_BOT_TOKEN } = process.env; - if (!SLACK_BOT_TOKEN) return; + const client = getSlackClient(); + if (!client) return; const block = generateSlackTextBlock(message, link, linkButtonText); try { - await slack.chat.update({ - token: SLACK_BOT_TOKEN, + await client.chat.update({ channel: slackId, ts: timestamp, text: message, blocks: [block] }); } catch (error) { - throw new HttpException(500, 'Error sending slack reply to thread, reason: ' + (error as any).data.error); + console.error('Failed to edit Slack message:', (error as any)?.data?.error ?? error); + return undefined; } }; @@ -105,18 +150,18 @@ export const editMessage = async ( * @param emoji - the emoji to react with */ export const reactToMessage = async (slackId: string, parentTimestamp: string, emoji: string) => { - const { SLACK_BOT_TOKEN } = process.env; - if (!SLACK_BOT_TOKEN) return; + const client = getSlackClient(); + if (!client) return; try { - await slack.reactions.add({ - token: SLACK_BOT_TOKEN, + await client.reactions.add({ channel: slackId, timestamp: parentTimestamp, name: emoji }); } catch (error) { - throw new HttpException(500, 'Error reacting to slack message, reason: ' + (error as any).data.error); + console.error('Failed to react to Slack message:', (error as any)?.data?.error ?? error); + return undefined; } }; @@ -161,12 +206,15 @@ const generateSlackTextBlock = (message: string, link?: string, linkButtonText?: * @returns an array of strings of all the slack ids of the users in the given channel */ export const getUsersInChannel = async (channelId: string) => { + const client = getSlackClient(); + if (!client) return []; + let members: string[] = []; let cursor: string | undefined; try { do { - const response = await slack.conversations.members({ + const response = await client.conversations.members({ channel: channelId, cursor, limit: 200 @@ -192,8 +240,11 @@ export const getUsersInChannel = async (channelId: string) => { * @returns the name of the channel or undefined if it cannot be found */ export const getChannelName = async (channelId: string) => { + const client = getSlackClient(); + if (!client) return undefined; + try { - const channelRes = await slack.conversations.info({ channel: channelId }); + const channelRes = await client.conversations.info({ channel: channelId }); return channelRes.channel?.name; } catch (error) { return undefined; @@ -206,8 +257,11 @@ export const getChannelName = async (channelId: string) => { * @returns the name of the user (real name if no display name), undefined if cannot be found */ export const getUserName = async (userId: string) => { + const client = getSlackClient(); + if (!client) return undefined; + try { - const userRes = await slack.users.info({ user: userId }); + const userRes = await client.users.info({ user: userId }); return userRes.user?.profile?.display_name || userRes.user?.real_name; } catch (error) { return undefined; @@ -219,8 +273,13 @@ export const getUserName = async (userId: string) => { * @returns the id of the workspace */ export const getWorkspaceId = async () => { + const client = getSlackClient(); + if (!client) { + throw new HttpException(500, 'Slack client not configured'); + } + try { - const response = await slack.auth.test(); + const response = await client.auth.test(); if (response.ok) { return response.team_id; } @@ -230,4 +289,57 @@ export const getWorkspaceId = async () => { } }; -export default slack; +/** + * Sends a slack ephemeral message to a user + * @param channelId - the channel id of the channel to send to + * @param threadTs - the timestamp of the thread to send to + * @param userId - the id of the user to send to + * @param text - the text of the message to send (should always be populated in case blocks can't be rendered, but if blocks render text will not) + * @param blocks - the blocks of the message to send + */ +export async function sendEphemeralMessage( + channelId: string, + threadTs: string, + userId: string, + text: string, + blocks: any[] +) { + const client = getSlackClient(); + if (!client) return; + + try { + await client.chat.postEphemeral({ + channel: channelId, + user: userId, + thread_ts: threadTs, + text, + blocks + }); + } catch (err: unknown) { + if (err instanceof Error) { + throw new HttpException(500, `Failed to send slack notifications: ${err.message}`); + } + } +} + +/** + * Get the Slack Bolt app instance (initializes Slack if needed) + * @returns the Slack Bolt App or null if no token is configured + */ +export const getSlackApp = (): App | null => { + initializeSlack(); + return slackApp; +}; + +/** + * Get the Express receiver instance (initializes Slack if needed) + * @returns the ExpressReceiver or null if no token is configured + */ +export const getReceiver = (): ExpressReceiver | null => { + initializeSlack(); + return receiver; +}; + +// Export the getters for any direct usage if needed +export { getSlackClient }; +export default getSlackClient; diff --git a/src/backend/src/prisma-query-args/event.query-args.ts b/src/backend/src/prisma-query-args/event.query-args.ts index cdd0042195..2384f45740 100644 --- a/src/backend/src/prisma-query-args/event.query-args.ts +++ b/src/backend/src/prisma-query-args/event.query-args.ts @@ -13,12 +13,7 @@ export const getEventQueryArgs = (organizationId: string) => optionalMembers: getUserQueryArgs(organizationId), confirmedMembers: getUserWithSettingsQueryArgs(organizationId), deniedMembers: getUserQueryArgs(organizationId), - teams: { - select: { - teamName: true, - teamId: true - } - }, + teams: true, teamType: { select: { teamTypeId: true, diff --git a/src/backend/src/prisma/seed.ts b/src/backend/src/prisma/seed.ts index 8b641d8659..a785823598 100644 --- a/src/backend/src/prisma/seed.ts +++ b/src/backend/src/prisma/seed.ts @@ -284,6 +284,23 @@ const performSeed: () => Promise = async () => { } }); + const miles = await prisma.car.create({ + data: { + wbsElement: { + create: { + name: 'Miles', + carNumber: 1, + projectNumber: 0, + workPackageNumber: 0, + organizationId + } + } + }, + include: { + wbsElement: true + } + }); + /** * Make an initial change request for car 1 using the wbs of the genesis project */ @@ -1378,7 +1395,7 @@ const performSeed: () => Promise = async () => { await ChangeRequestsService.reviewChangeRequest(joeShmoe, project3WP1ActivationCrId, 'Approved!', true, ner, null); /** Work Package 2 */ - await seedWorkPackage( + const { workPackage: project3WP2 } = await seedWorkPackage( lexLuther, 'Laser Canon Research', changeRequestProject7Id, @@ -1403,7 +1420,7 @@ const performSeed: () => Promise = async () => { WorkPackageStage.Testing, weeksFromNow(3).toISOString().split('T')[0], 4, - [], + [project3WP1.wbsNum, project3WP2.wbsNum], [], zatanna, WbsElementStatus.Active, diff --git a/src/backend/src/routes/slack.routes.ts b/src/backend/src/routes/slack.routes.ts index a66fe01b69..c152ab664f 100644 --- a/src/backend/src/routes/slack.routes.ts +++ b/src/backend/src/routes/slack.routes.ts @@ -1,8 +1,123 @@ -import { createEventAdapter } from '@slack/events-api'; +import { getSlackApp } from '../integrations/slack.js'; import SlackController from '../controllers/slack.controllers.js'; -export const slackEvents = createEventAdapter(process.env.SLACK_SIGNING_SECRET || ''); +// Register Slack event listeners only if the Slack app is configured +const slackApp = getSlackApp(); -slackEvents.on('message', SlackController.processMessageEvent); +if (slackApp) { + // Register message event listener + slackApp.message(async ({ message, logger }: any) => { + try { + await SlackController.processMessageEvent(message); + } catch (error) { + logger.error('Error processing message event:', error); + console.error(error); + } + }); +} -slackEvents.on('error', console.log); +/** + * Validates the general structure of a Slack block action payload. + * This validation is action-agnostic and only checks that the required fields exist. + * Action-specific validation (like action_id and value format) happens in the controller. + * + * @param body The Slack action body to validate + * @returns true if valid, false otherwise + */ +function validateSlackActionBody(body: any): boolean { + // Check required top-level fields + if (!body || typeof body !== 'object') { + console.error('Invalid body: not an object'); + return false; + } + + if (body.type !== 'block_actions') { + console.error('Invalid body type:', body.type); + return false; + } + + // Validate user object + if (!body.user || typeof body.user !== 'object') { + console.error('Invalid or missing user object'); + return false; + } + + if (!body.user.id || typeof body.user.id !== 'string') { + console.error('Invalid or missing user.id'); + return false; + } + + if (!body.user.team_id || typeof body.user.team_id !== 'string') { + console.error('Invalid or missing user.team_id'); + return false; + } + + // Validate actions array exists and has at least one action + if (!Array.isArray(body.actions) || body.actions.length === 0) { + console.error('Invalid or empty actions array'); + return false; + } + + const [action] = body.actions; + if (!action.action_id || typeof action.action_id !== 'string') { + console.error('Invalid or missing action_id'); + return false; + } + + if (!action.value || typeof action.value !== 'string') { + console.error('Invalid or missing action value'); + return false; + } + + // Validate container object (for message timestamp and channel) + if (!body.container || typeof body.container !== 'object') { + console.error('Invalid or missing container object'); + return false; + } + + if (!body.container.message_ts || typeof body.container.message_ts !== 'string') { + console.error('Invalid or missing container.message_ts'); + return false; + } + + if (!body.container.channel_id || typeof body.container.channel_id !== 'string') { + console.error('Invalid or missing container.channel_id'); + return false; + } + + // Validate thread_ts if it exists (optional but if present should be string) + if (body.container.thread_ts && typeof body.container.thread_ts !== 'string') { + console.error('Invalid container.thread_ts type'); + return false; + } + + return true; +} + +if (slackApp) { + // Register interactive action handler for SABO submission confirmation + slackApp.action('sabo_submitted_confirmation', async ({ ack, body, logger, respond }: any) => { + await ack(); + + try { + // Validate the incoming action body structure + if (!validateSlackActionBody(body)) { + logger.error('Invalid Slack action body structure'); + return; + } + + await SlackController.handleSaboSubmittedAction(body); + + // If no error, delete the original message + await respond({ delete_original: true }); + } catch (error) { + // Can't pass to normal middleware because not normal request + logger.error('Error handling sabo_submitted_confirmation action:', error); + } + }); + + // Error handler + slackApp.error(async (error: Error) => { + console.error('Slack app error:', error); + }); +} diff --git a/src/backend/src/services/calendar.services.ts b/src/backend/src/services/calendar.services.ts index 5a7b5e9362..7aa1033af7 100644 --- a/src/backend/src/services/calendar.services.ts +++ b/src/backend/src/services/calendar.services.ts @@ -14,7 +14,8 @@ import { FilterArgs, Machinery, ScheduleSlot, - notGuest + notGuest, + isSameDay } from 'shared'; import { getCalendarQueryArgs } from '../prisma-query-args/calendar.query-args.js'; import { getEventTypeQueryArgs } from '../prisma-query-args/event-type.query-args.js'; @@ -65,7 +66,7 @@ import { updateUserAvailability, areUsersinList } from '../utils/users.utils.js'; -import { Conflict_Status, Event_Status, Organization } from '@prisma/client'; +import { Conflict_Status, Event_Status, Organization, Team } from '@prisma/client'; export default class CalendarService { /** @@ -286,8 +287,8 @@ export default class CalendarService { if (!hasPermission) { throw new AccessDeniedException('Only admins and heads can create events under this event type'); } - } else if (notGuest(submitter.role)) { - throw new AccessDeniedGuestException('Guests cannot create events'); + } else if (!(await userHasPermission(submitter.userId, organization.organizationId, notGuest))) { + throw new AccessDeniedGuestException('create events'); } // Validate event follows event type configuration @@ -497,10 +498,6 @@ export default class CalendarService { where: { userId: { in: optionalMemberIds.concat(requiredMemberIds) } } }); - if (!members) { - throw new NotFoundException('User', 'Cannot find members who are invited to the design review'); - } - // get the user settings for all the members invited, who are leaderingship const memberUserSettings = await prisma.user_Settings.findMany({ where: { userId: { in: members.map((member) => member.userId) } } @@ -514,17 +511,12 @@ export default class CalendarService { if (newEvent.status === Event_Status.UNCONFIRMED) { for (const memberUserSetting of memberUserSettings) { if (memberUserSetting.slackId) { - try { - // For each project associated with this event - await sendSlackEventConfirmNotification( - memberUserSetting.slackId, - newEvent.eventId, - newEvent.title, - projects.map((project) => project.wbsElement.name).join(', ') - ); - } catch (err: unknown) { - console.error('Failed to send slack notification for event:', err); - } + await sendSlackEventConfirmNotification( + memberUserSetting.slackId, + newEvent.eventId, + newEvent.title, + projects.map((project) => project.wbsElement.name).join(', ') + ); } } } @@ -532,22 +524,24 @@ export default class CalendarService { // Send popup notification await sendEventPopUp(newEvent, members, submitter, workPackageNames, organization.organizationId); + const teamsToNotify = new Set(); for (const project of projects) { - const projectTeams = project.teams; - if (projectTeams.length > 0) { - try { - await sendSlackEventNotifications( - projectTeams, - createdEvent, - submitter, - workPackageNames, - project.wbsElement.name - ); - } catch (err: unknown) { - console.error('Failed to send slack notification for event:', err); - } + for (const team of project.teams) { + teamsToNotify.add(team); } } + + for (const team of newEvent.teams) { + teamsToNotify.add(team); + } + + await sendSlackEventNotifications( + Array.from(teamsToNotify), + createdEvent, + submitter, + workPackageNames, + organization.name + ); } return createdEvent; @@ -617,15 +611,6 @@ export default class CalendarService { // NOTE: Use editScheduleSlot to modify individual schedule slots - // question document is required if the status is scheduled or done - if (foundEventType.requiresConfirmation) { - if (status === Event_Status.SCHEDULED || status === Event_Status.DONE) { - if (questionDocumentLink == null) { - throw new HttpException(400, 'doc template link is required for scheduled and done design reviews'); - } - } - } - if (requiredMemberIds.length > 0 && requiredMemberIds.some((rMemberId) => optionalMemberIds.includes(rMemberId))) { throw new HttpException(400, 'required members cannot be in optional members'); } @@ -1468,6 +1453,24 @@ export default class CalendarService { ...getEventQueryArgs(organization.organizationId) }); + // Remove the scheduled time from confirmed members' availabilities so they can't be + // double-booked for other events that require confirmation during the same time slot + const startHour = startTime.getHours(); + const endHour = endTime.getHours(); + for (const member of event.confirmedMembers) { + if (!member.drScheduleSettings) continue; + const existingAvailability = member.drScheduleSettings.availabilities.find((a) => isSameDay(a.dateSet, startTime)); + if (!existingAvailability) continue; + // Availability index i represents local hour (10 + i); remove indices that fall within [startHour, endHour) + const updatedAvailability = existingAvailability.availability.filter( + (i) => !(10 + i >= startHour && 10 + i < endHour) + ); + await prisma.availability.update({ + where: { availabilityId: existingAvailability.availabilityId }, + data: { availability: updatedAvailability } + }); + } + const { eventTypeId } = updatedEvent; const foundEventType = await prisma.event_Type.findUnique({ where: { eventTypeId } diff --git a/src/backend/src/services/finance.services.ts b/src/backend/src/services/finance.services.ts index 6bd7dcf915..1ce12e4da0 100644 --- a/src/backend/src/services/finance.services.ts +++ b/src/backend/src/services/finance.services.ts @@ -421,6 +421,7 @@ export default class FinanceServices { const reimbursementRequests = await prisma.reimbursement_Request.findMany({ where: { + dateDeleted: null, reimbursementProducts: { some: { reimbursementProductReason: { @@ -460,7 +461,7 @@ export default class FinanceServices { } }); - const { pendingFinance, pendingLeadership, submittedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); + const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); const totalBalance = reimbursementRequests.reduce((acc, curr) => { @@ -472,9 +473,9 @@ export default class FinanceServices { const data: ReimbursementRequestData = { totalBudget: project.budget, - pendingFinance, - pendingLeadership, - submittedToSabo, + approved, + pendingApproval, + addedToSabo, reimbursed, available }; @@ -558,7 +559,7 @@ export default class FinanceServices { const totalBudget = team.projects.reduce((acc, curr) => acc + curr.budget, 0); - const { pendingFinance, pendingLeadership, submittedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); + const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); const totalBalance = reimbursementRequests.reduce((acc, curr) => { @@ -570,9 +571,9 @@ export default class FinanceServices { const data: ReimbursementRequestData = { totalBudget, - pendingFinance, - pendingLeadership, - submittedToSabo, + approved, + pendingApproval, + addedToSabo, reimbursed, available }; @@ -611,33 +612,79 @@ export default class FinanceServices { if (!division) throw new NotFoundException('Team Type', teamTypeId); - const results: ReimbursementRequestData = { - totalBudget: 0, - pendingFinance: 0, - pendingLeadership: 0, - submittedToSabo: 0, - reimbursed: 0, - available: 0 - }; - + const projectsById = new Map(); for (const team of division.teams) { - const data: ReimbursementRequestData = await this.getReimbursementRequestTeamData( - organization, - team.teamId, - startDate, - endDate, - carNumber - ); - - results.totalBudget += data.totalBudget; - results.pendingFinance += data.pendingFinance; - results.pendingLeadership += data.pendingLeadership; - results.submittedToSabo += data.submittedToSabo; - results.reimbursed += data.reimbursed; - results.available += data.available; + for (const project of team.projects) { + if (!projectsById.has(project.projectId)) { + projectsById.set(project.projectId, { budget: project.budget }); + } + } } + const totalBudget = [...projectsById.values()].reduce((acc, p) => acc + p.budget, 0); + const divisionProjectIds = [...projectsById.keys()]; - return results; + const reimbursementRequests = await prisma.reimbursement_Request.findMany({ + where: { + dateDeleted: null, + reimbursementProducts: { + some: { + dateDeleted: null, + reimbursementProductReason: { + wbsElement: { + project: { + projectId: { in: divisionProjectIds } + } + } + } + } + }, + reimbursementStatuses: { + none: { + type: Reimbursement_Status_Type.DENIED + } + }, + ...getReimbursementRequestWhereInput(startDate, endDate, carNumber) + }, + select: { + reimbursementStatuses: true, + totalCost: true, + reimbursementProducts: { + where: { + dateDeleted: null, + reimbursementProductReason: { + wbsElement: { + project: { + projectId: { in: divisionProjectIds } + } + } + } + }, + select: { + cost: true + } + } + } + }); + + const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); + + const totalBalance = + reimbursementRequests.reduce((acc, curr) => { + const teamProductsCost = curr.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0); + return acc + teamProductsCost; + }, 0) / 100; + + const available = totalBudget - totalBalance; + + const data: ReimbursementRequestData = { + totalBudget, + approved, + pendingApproval, + addedToSabo, + reimbursed, + available + }; + return data; } static async getSpendingBarTeamData( @@ -817,10 +864,16 @@ export default class FinanceServices { } }); - const allTotalBudget = teams.reduce((teamAcc, team) => { - const teamBudget = team.projects.reduce((projAcc, project) => projAcc + project.budget, 0); - return teamAcc + teamBudget; - }, 0); + // project budgets no longer double counted if in multiple teams + const projectsById = new Map(); + for (const team of teams) { + for (const project of team.projects) { + if (!projectsById.has(project.projectId)) { + projectsById.set(project.projectId, { budget: project.budget }); + } + } + } + const allTotalBudget = [...projectsById.values()].reduce((acc, p) => acc + p.budget, 0); const cashTotalBudget = cashReimbursementRequests.reduce((reqAcc, rr) => { @@ -833,9 +886,9 @@ export default class FinanceServices { }, 0) / 100; const { - pendingFinance: allPendingFinance, - pendingLeadership: allPendingLeadership, - submittedToSabo: allSubmittedToSabo, + approved: allApproved, + pendingApproval: allPendingApproval, + addedToSabo: allAddedToSabo, reimbursed: allReimbursed } = computeRRTotals(allReimbursementRequests); @@ -844,9 +897,9 @@ export default class FinanceServices { const allAvailable = allTotalBudget - allTotalBalance; const { - pendingFinance: cashPendingFinance, - pendingLeadership: cashPendingLeadership, - submittedToSabo: cashSubmittedToSabo, + approved: cashApproved, + pendingApproval: cashPendingApproval, + addedToSabo: cashAddedToSabo, reimbursed: cashReimbursed } = computeRRTotals(cashReimbursementRequests); @@ -855,9 +908,9 @@ export default class FinanceServices { const cashAvailable = cashTotalBudget - cashTotalBalance; const { - pendingFinance: budgetPendingFinance, - pendingLeadership: budgetPendingLeadership, - submittedToSabo: budgetSubmittedToSabo, + approved: budgetApproved, + pendingApproval: budgetPendingApproval, + addedToSabo: budgetAddedToSabo, reimbursed: budgetReimbursed } = computeRRTotals(budgetReimbursementRequests); @@ -867,27 +920,27 @@ export default class FinanceServices { const allData: ReimbursementRequestData = { totalBudget: allTotalBudget, - pendingFinance: allPendingFinance, - pendingLeadership: allPendingLeadership, - submittedToSabo: allSubmittedToSabo, + approved: allApproved, + pendingApproval: allPendingApproval, + addedToSabo: allAddedToSabo, reimbursed: allReimbursed, available: allAvailable }; const cashData: ReimbursementRequestData = { totalBudget: cashTotalBudget, - pendingFinance: cashPendingFinance, - pendingLeadership: cashPendingLeadership, - submittedToSabo: cashSubmittedToSabo, + approved: cashApproved, + pendingApproval: cashPendingApproval, + addedToSabo: cashAddedToSabo, reimbursed: cashReimbursed, available: cashAvailable }; const budgetData: ReimbursementRequestData = { totalBudget: budgetTotalBudget, - pendingFinance: budgetPendingFinance, - pendingLeadership: budgetPendingLeadership, - submittedToSabo: budgetSubmittedToSabo, + approved: budgetApproved, + pendingApproval: budgetPendingApproval, + addedToSabo: budgetAddedToSabo, reimbursed: budgetReimbursed, available: budgetAvailable }; @@ -984,39 +1037,21 @@ export default class FinanceServices { const totalBudget = category.budget; - const totals: Partial> = { - [Reimbursement_Status_Type.PENDING_FINANCE]: 0, - [Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL]: 0, - [Reimbursement_Status_Type.SABO_SUBMITTED]: 0, - [Reimbursement_Status_Type.REIMBURSED]: 0 - }; - - reimbursementRequests.forEach((req) => { - const lastStatus = req.reimbursementStatuses.at(-1)?.type; - - if (lastStatus && totals[lastStatus] !== undefined) { - const categoryProductsCost = req.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0); - totals[lastStatus] += categoryProductsCost; - } - }); + const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests); - const pendingFinance = totals[Reimbursement_Status_Type.PENDING_FINANCE] ?? 0; - const pendingLeadership = totals[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL] ?? 0; - const submittedToSabo = totals[Reimbursement_Status_Type.SABO_SUBMITTED] ?? 0; - const reimbursed = totals[Reimbursement_Status_Type.REIMBURSED] ?? 0; - - const totalBalance = reimbursementRequests.reduce((acc, curr) => { - const categoryProductsCost = curr.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0); - return acc + categoryProductsCost; - }, 0); + const totalBalance = + reimbursementRequests.reduce((acc, curr) => { + const categoryProductsCost = curr.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0); + return acc + categoryProductsCost; + }, 0) / 100; const available = totalBudget - totalBalance; const data: ReimbursementRequestData = { totalBudget, - pendingFinance, - pendingLeadership, - submittedToSabo, + approved, + pendingApproval, + addedToSabo, reimbursed, available }; diff --git a/src/backend/src/services/reimbursement-requests.services.ts b/src/backend/src/services/reimbursement-requests.services.ts index f3f3a57621..bba9cb8ab0 100644 --- a/src/backend/src/services/reimbursement-requests.services.ts +++ b/src/backend/src/services/reimbursement-requests.services.ts @@ -418,12 +418,26 @@ export default class ReimbursementRequestService { totalCost, accountCodeId: accountCode.accountCodeId, vendorId: vendor.vendorId + }, + include: { + notificationSlackThreads: true } }); //set any deleted receipts with a dateDeleted await removeDeletedReceiptPictures(receiptPictures, oldReimbursementRequest.receiptPictures || [], submitter); + try { + await sendPendingSaboSubmissionNotification( + updatedReimbursementRequest.notificationSlackThreads, + submitter.userId, + updatedReimbursementRequest.recipientId, + updatedReimbursementRequest.reimbursementRequestId + ); + } catch (e: unknown) { + console.error('Error sending pending SABO submission notification:', e); + } + return updatedReimbursementRequest; } @@ -1288,15 +1302,12 @@ export default class ReimbursementRequestService { ...getReimbursementStatusQueryArgs(organization.organizationId) }); - try { - await sendPendingSaboSubmissionNotification( - reimbursementRequest.notificationSlackThreads, - submitter.userId, - reimbursementRequest.recipientId - ); - } catch (e: unknown) { - console.error('Error sending pending SABO submission notification:', e); - } + await sendPendingSaboSubmissionNotification( + reimbursementRequest.notificationSlackThreads, + submitter.userId, + reimbursementRequest.recipientId, + reimbursementRequest.reimbursementRequestId + ); return reimbursementStatusTransformer(reimbursementStatus); } @@ -1370,11 +1381,7 @@ export default class ReimbursementRequestService { ...getReimbursementStatusQueryArgs(organization.organizationId) }); - try { - await sendSubmittedToSaboNotification(reimbursementRequest.notificationSlackThreads); - } catch (e: unknown) { - console.error('Error sending submitted to SABO notification:', e); - } + await sendSubmittedToSaboNotification(reimbursementRequest.notificationSlackThreads); return reimbursementStatusTransformer(reimbursementStatus); } @@ -1443,11 +1450,7 @@ export default class ReimbursementRequestService { 'Reimbursement Request successfully updated, however no slack message was sent as recipient is missing their settings!' ); - try { - await sendReimbursementRequestDeniedNotification(recipientSettings.slackId, reimbursementRequestId); - } catch (e: unknown) { - console.error('Error sending reimbursement request denied notification:', e); - } + await sendReimbursementRequestDeniedNotification(recipientSettings.slackId, reimbursementRequestId); return reimbursementStatusTransformer(reimbursementStatus); } @@ -1734,14 +1737,10 @@ export default class ReimbursementRequestService { ...getReimbursementStatusQueryArgs(organization.organizationId) }); - try { - await sendReimbursementRequestPendingFinanceNotification( - reimbursementRequest.notificationSlackThreads, - reimbursementRequest.assigneeId - ); - } catch (e: unknown) { - console.error('Error sending reimbursement request pending finance notification:', e); - } + await sendReimbursementRequestPendingFinanceNotification( + reimbursementRequest.notificationSlackThreads, + reimbursementRequest.assigneeId + ); return reimbursementStatusTransformer(updatedReimbursementStatus); } @@ -1795,11 +1794,7 @@ export default class ReimbursementRequestService { ...getReimbursementStatusQueryArgs(organization.organizationId) }); - try { - await sendReimbursementRequestChangesRequestedNotification(reimbursementRequest.notificationSlackThreads, user.userId); - } catch (e: unknown) { - console.error('Error sending reimbursement request changes requested notification:', e); - } + await sendReimbursementRequestChangesRequestedNotification(reimbursementRequest.notificationSlackThreads, user.userId); return reimbursementStatusTransformer(deletedStatus); } @@ -2075,7 +2070,7 @@ export default class ReimbursementRequestService { // find all names that have been tagged in the @FirstLast format const taggedNames = [...comment.matchAll(tagRegex)].map((match) => match[1]); - // spliot the tagged names into first and last names + // split the tagged names into first and last names const splitTaggedNames = taggedNames.map((name) => { const match = name.match(/([A-Z][a-z'-]+)([A-Z][a-z'-]+)/); diff --git a/src/backend/src/services/slack.services.ts b/src/backend/src/services/slack.services.ts index 1b18935e97..5afb0914fe 100644 --- a/src/backend/src/services/slack.services.ts +++ b/src/backend/src/services/slack.services.ts @@ -1,9 +1,10 @@ import { getChannelName, getUserName } from '../integrations/slack.js'; import AnnouncementService from './announcement.services.js'; -import { Announcement } from 'shared'; +import { Announcement, ReimbursementStatusType } from 'shared'; import prisma from '../prisma/prisma.js'; import { blockToMentionedUsers, blockToString } from '../utils/slack.utils.js'; -import { NotFoundException } from '../utils/errors.utils.js'; +import { InvalidOrganizationException, NotFoundException } from '../utils/errors.utils.js'; +import ReimbursementRequestService from './reimbursement-requests.services.js'; /** * Represents a slack event for a message in a channel. @@ -66,7 +67,138 @@ export interface SlackRichTextBlock { usergroup_id?: string; } +/** + * Represents a Slack block action body structure. + * The general structure is validated in routes, while action-specific fields + * (action_id and value format) are validated in controllers. + */ +export interface SlackBlockActionBody { + type: 'block_actions'; + user: { + id: string; + username: string; + name: string; + team_id: string; + }; + api_app_id: string; + token: string; + container: { + type: string; + message_ts: string; + channel_id: string; + is_ephemeral: boolean; + thread_ts?: string; // Optional - if present, the message is in a thread + }; + trigger_id: string; + team: { + id: string; + domain: string; + }; + enterprise: null | { + id: string; + name: string; + }; + is_enterprise_install: boolean; + channel: { + id: string; + name: string; + }; + state: { + values: Record; + }; + response_url: string; + actions: Array<{ + action_id: string; // Validated in controller, not routes + block_id: string; + text?: any; + value: string; // Validated for format in controller, not routes + style?: string; + type: string; + action_ts: string; + }>; +} + +/** + * Represents the parsed value from a SABO submission action + */ +export interface SaboSubmissionActionValue { + reimbursementRequestId: string; +} + export default class SlackServices { + /** + * Handles the Slack button click for marking a reimbursement request as SABO submitted. + * This performs the business logic for processing the SABO submission confirmation. + * + * @param userSlackId The Slack user ID of the user who clicked the button + * @param teamSlackId The Slack team ID (workspace ID) where the action occurred + * @param reimbursementRequestId The ID of the reimbursement request to mark as submitted + * @param interactiveMessageTs The timestamp of the interactive message (to delete after processing) + */ + static async handleSaboSubmittedAction(userSlackId: string, reimbursementRequestId: string): Promise { + // Find the user by their slack ID + const user = await prisma.user.findFirst({ + where: { + userSettings: { + slackId: userSlackId + } + } + }); + + if (!user) { + console.error('User not found for slack ID:', userSlackId); + throw new NotFoundException('User', userSlackId); + } + + // Find the reimbursement request + const reimbursementRequest = await prisma.reimbursement_Request.findUnique({ + where: { + reimbursementRequestId + }, + include: { + organization: true, + reimbursementStatuses: true, + notificationSlackThreads: true + } + }); + + if (!reimbursementRequest) { + throw new NotFoundException('Reimbursement Request', reimbursementRequestId); + } + + // Verify that the user's organization matches the reimbursement request's organization + const userOrganization = await prisma.user.findFirst({ + where: { + userId: user.userId + }, + include: { + organizations: true + } + }); + + const hasAccess = userOrganization?.organizations.some( + (org) => org.organizationId === reimbursementRequest.organizationId + ); + + if (!hasAccess) { + throw new InvalidOrganizationException('Reimbursement Request'); + } + + // If the reimbursement request has already been submitted to SABO, just return (message will be deleted by route) + if ( + reimbursementRequest.reimbursementStatuses.some((status) => status.type === ReimbursementStatusType.SABO_SUBMITTED) + ) { + return; + } + + // Call the service function to mark as SABO submitted + await ReimbursementRequestService.markReimbursementRequestAsSaboSubmitted( + reimbursementRequestId, + user, + reimbursementRequest.organization + ); + } + /** * Given a slack event representing a message in a channel, * make the appropriate announcement change in prisma. diff --git a/src/backend/src/transformers/change-requests.transformer.ts b/src/backend/src/transformers/change-requests.transformer.ts index ccd4120ce3..4d7e311869 100644 --- a/src/backend/src/transformers/change-requests.transformer.ts +++ b/src/backend/src/transformers/change-requests.transformer.ts @@ -8,8 +8,8 @@ import { WbsElementStatus, WorkPackageProposedChanges, WorkPackageStage, - isProjectWbs, - BudgetChangeRequest + BudgetChangeRequest, + isWorkPackageWbs } from 'shared'; import { wbsNumOf } from '../utils/utils.js'; import { calculateChangeRequestStatus, convertCRScopeWhyType } from '../utils/change-requests.utils.js'; @@ -132,7 +132,7 @@ const changeRequestTransformer = ( const status = calculateChangeRequestStatus(changeRequest); const wbsName = changeRequest.wbsElement - ? isProjectWbs(changeRequest.wbsElement) + ? !isWorkPackageWbs(changeRequest.wbsElement) ? changeRequest.wbsElement?.name : `${changeRequest.wbsElement?.workPackage?.project.wbsElement.name} - ${changeRequest.wbsElement?.name}` : undefined; diff --git a/src/backend/src/utils/auth.utils.ts b/src/backend/src/utils/auth.utils.ts index 3b3acd4d58..a2a9eb2f64 100644 --- a/src/backend/src/utils/auth.utils.ts +++ b/src/backend/src/utils/auth.utils.ts @@ -33,7 +33,7 @@ export const requireJwtProd = (req: Request, res: Response, next: NextFunction) req.path === '/users/auth/login' || // logins dont have cookies yet req.path === '/' || // base route is available so aws can listen and check the health req.method === 'OPTIONS' || // this is a pre-flight request and those don't send cookies - req.path === '/slack' // slack http endpoint is only used from slack api + req.path.startsWith('/slack') // slack endpoints (events and interactions) are only used from slack api ) { return next(); } else if ( @@ -65,7 +65,7 @@ export const requireJwtDev = (req: Request, res: Response, next: NextFunction) = req.path === '/' || // base route is available so aws can listen and check the health req.method === 'OPTIONS' || // this is a pre-flight request and those don't send cookies req.path === '/users' || // dev login needs the list of users to log in - req.path === '/slack' // slack http endpoint is only used from slack api + req.path.startsWith('/slack') // slack endpoints (events and interactions) are only used from slack api ) { next(); } else if ( @@ -185,7 +185,7 @@ export const getUserAndOrganization = async (req: Request, res: Response, next: req.path === '/' || // base route is available so aws can listen and check the health req.method === 'OPTIONS' || // this is a pre-flight request and those don't send cookies req.path === '/users' || // dev login needs the list of users to log in - req.path === '/slack' || // slack http endpoint is only used from slack api + req.path.startsWith('/slack') || // slack endpoints (events and interactions) are only used from slack api req.path.startsWith('/notifications') // Notifications route has its own auth, only called from gh ) { return next(); diff --git a/src/backend/src/utils/calendar.utils.ts b/src/backend/src/utils/calendar.utils.ts index 34c4ed603f..ef1c6fb6b4 100644 --- a/src/backend/src/utils/calendar.utils.ts +++ b/src/backend/src/utils/calendar.utils.ts @@ -117,21 +117,9 @@ export function validateEventTypeConfiguration( const missingBoth = !eventData.location && !eventData.zoomLink; // Check required fields - if (eventType.requiredMembers && eventData.requiredMemberIds.length === 0) { - throw new InvalidEventTypeConfigurationException('at least one required member'); - } - if (eventType.teamType && !eventData.teamTypeId) { - throw new InvalidEventTypeConfigurationException('a team type'); - } if (requiresLocationOrZoom && missingBoth) { throw new InvalidEventTypeConfigurationException('a location or zoom link'); } - if (eventType.workPackage && eventData.workPackageIds.length === 0) { - throw new InvalidEventTypeConfigurationException('at least one work package'); - } - if (eventType.questionDocument && !eventData.questionDocumentLink) { - throw new InvalidEventTypeConfigurationException('a question document'); - } // For requiresConfirmation events, the event must have an initialDateScheduled if (eventType.requiresConfirmation && !eventData.initialDateScheduled) { diff --git a/src/backend/src/utils/change-requests.utils.ts b/src/backend/src/utils/change-requests.utils.ts index 76a7551181..67b2d4e184 100644 --- a/src/backend/src/utils/change-requests.utils.ts +++ b/src/backend/src/utils/change-requests.utils.ts @@ -608,18 +608,12 @@ export const sendCRSubmitterReviewedNotification = async ( ) => { const creatorUserSettings = await prisma.user_Settings.findUnique({ where: { userId: foundCR.submitterId } }); if (creatorUserSettings && creatorUserSettings.slackId) { - try { - await sendSlackCRReviewedNotification( - creatorUserSettings.slackId, - foundCR.crId, - foundCR.identifier, - foundCR.reviewNotes - ); - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${err.message}`); - } - } + await sendSlackCRReviewedNotification( + creatorUserSettings.slackId, + foundCR.crId, + foundCR.identifier, + foundCR.reviewNotes + ); } }; diff --git a/src/backend/src/utils/finance.utils.ts b/src/backend/src/utils/finance.utils.ts index 5c64bf1da4..184af8b031 100644 --- a/src/backend/src/utils/finance.utils.ts +++ b/src/backend/src/utils/finance.utils.ts @@ -8,43 +8,49 @@ export const getProjectSegmentedWhereInput = ( ): { where: { wbsElement: { - organizationId: string; - dateDeleted: null; - carNumber?: number; - dateCreated?: { gte?: Date; lte?: Date }; + is: { + organizationId: string; + dateDeleted: null; + carNumber?: number; + dateCreated?: { gte?: Date; lte?: Date }; + }; }; }; } => { const baseWhere: { where: { wbsElement: { - organizationId: string; - dateDeleted: null; - carNumber?: number; - dateCreated?: { gte?: Date; lte?: Date }; + is: { + organizationId: string; + dateDeleted: null; + carNumber?: number; + dateCreated?: { gte?: Date; lte?: Date }; + }; }; }; } = Prisma.validator()({ where: { wbsElement: { - organizationId, - dateDeleted: null + is: { + organizationId, + dateDeleted: null + } } } }); - if (startDate) { - baseWhere.where.wbsElement.dateCreated = { + if (startDate !== undefined) { + baseWhere.where.wbsElement.is.dateCreated = { gte: startDate }; } - if (endDate) { - baseWhere.where.wbsElement.dateCreated = { ...baseWhere.where.wbsElement.dateCreated, lte: endDate }; + if (endDate !== undefined) { + baseWhere.where.wbsElement.is.dateCreated = { ...baseWhere.where.wbsElement.is.dateCreated, lte: endDate }; } if (carNumber !== undefined) { - baseWhere.where.wbsElement.carNumber = carNumber; + baseWhere.where.wbsElement.is.carNumber = carNumber; } return baseWhere; @@ -80,7 +86,7 @@ export const getReimbursementRequestWhereInput = ( }) }; - if (carNumber !== undefined) { + if (carNumber) { baseWhere.reimbursementProducts = { some: { OR: [ @@ -117,34 +123,48 @@ export const computeRRTotals = ( reimbursementProducts?: { cost: number }[]; }[] ): { - pendingFinance: number; - pendingLeadership: number; - submittedToSabo: number; + approved: number; + pendingApproval: number; + addedToSabo: number; reimbursed: number; } => { - const totals: Partial> = { - [Reimbursement_Status_Type.PENDING_FINANCE]: 0, - [Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL]: 0, - [Reimbursement_Status_Type.SABO_SUBMITTED]: 0, - [Reimbursement_Status_Type.REIMBURSED]: 0 - }; + let pendingApproval = 0; + let approved = 0; + let addedToSabo = 0; + let reimbursed = 0; reimbursementRequests.forEach((req) => { const lastStatus = req.reimbursementStatuses.at(-1)?.type; + if (!lastStatus) return; - if (lastStatus && totals[lastStatus] !== undefined) { - // If reimbursementProducts are provided, sum their costs; otherwise use totalCost - const costToAdd = req.reimbursementProducts - ? req.reimbursementProducts.reduce((acc, prod) => acc + prod.cost, 0) - : req.totalCost; - totals[lastStatus] += costToAdd; + // If reimbursementProducts are provided, sum their costs; otherwise use totalCost + const costToAdd = req.reimbursementProducts + ? req.reimbursementProducts.reduce((acc, prod) => acc + prod.cost, 0) + : req.totalCost; + + switch (lastStatus) { + case Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL: + pendingApproval += costToAdd; + break; + case Reimbursement_Status_Type.LEADERSHIP_APPROVED: + case Reimbursement_Status_Type.PENDING_FINANCE: + case Reimbursement_Status_Type.ADVISOR_APPROVED: + approved += costToAdd; + break; + case Reimbursement_Status_Type.SABO_SUBMITTED: + case Reimbursement_Status_Type.PENDING_SABO_SUBMISSION: + addedToSabo += costToAdd; + break; + case Reimbursement_Status_Type.REIMBURSED: + reimbursed += costToAdd; + break; } }); - const pendingFinance = (totals[Reimbursement_Status_Type.PENDING_FINANCE] ?? 0) / 100; - const pendingLeadership = (totals[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL] ?? 0) / 100; - const submittedToSabo = (totals[Reimbursement_Status_Type.SABO_SUBMITTED] ?? 0) / 100; - const reimbursed = (totals[Reimbursement_Status_Type.REIMBURSED] ?? 0) / 100; - - return { pendingFinance, pendingLeadership, submittedToSabo, reimbursed }; + return { + approved: approved / 100, + pendingApproval: pendingApproval / 100, + addedToSabo: addedToSabo / 100, + reimbursed: reimbursed / 100 + }; }; diff --git a/src/backend/src/utils/slack.utils.ts b/src/backend/src/utils/slack.utils.ts index 02ec57a8d6..55973973a8 100644 --- a/src/backend/src/utils/slack.utils.ts +++ b/src/backend/src/utils/slack.utils.ts @@ -17,6 +17,7 @@ import { getUsersInChannel, reactToMessage, replyToMessageInThread, + sendEphemeralMessage, sendMessage } from '../integrations/slack.js'; import { getUserSlackId, getUserSlackMentionOrName } from './users.utils.js'; @@ -147,22 +148,16 @@ export const sendReimbursementRequestCreatedNotificationAndCreateMessageInfo = a if (!financeTeam) throw new HttpException(500, 'Finance team does not exist!'); - try { - const messageInfo = await sendMessage(financeTeam.slackId, msg, link, linkButtonText); - if (!messageInfo) return; // Not on prod + const messageInfo = await sendMessage(financeTeam.slackId, msg, link, linkButtonText); + if (!messageInfo) return; - await prisma.message_Info.create({ - data: { - reimbursementRequestId: requestId, - channelId: messageInfo.channelId, - timestamp: messageInfo.ts - } - }); - } catch (error: unknown) { - if (error instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${error.message}`); + await prisma.message_Info.create({ + data: { + reimbursementRequestId: requestId, + channelId: messageInfo.channelId, + timestamp: messageInfo.ts } - } + }); }; /** @@ -177,26 +172,14 @@ export const sendReimbursementRequestDeniedNotification = async (slackId: string const link = `https://finishlinebyner.com/finance/reimbursement-requests/${requestId}`; const linkButtonText = 'View Reimbursement Request'; - try { - await sendMessage(slackId, msg, link, linkButtonText); - } catch (error: unknown) { - if (error instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${error.message}`); - } - } + await sendMessage(slackId, msg, link, linkButtonText); }; export const sendThreadResponse = async (threads: SlackMessageThread[], message: string) => { if (process.env.NODE_ENV !== 'production' && !DEV_TESTING_OVERRIDE) return; // don't send msgs unless in prod - try { - if (threads && threads.length !== 0) { - const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, message)); - await Promise.all(msgs); - } - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notifications: ${err.message}`); - } + if (threads && threads.length !== 0) { + const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, message)); + await Promise.all(msgs); } }; @@ -235,12 +218,58 @@ export const sendSubmittedToSaboNotification = async (threads: SlackMessageThrea export const sendPendingSaboSubmissionNotification = async ( threads: SlackMessageThread[], financeUserId: string, - pendingSubmissionFromId: string + pendingSubmissionFromId: string, + reimbursementRequestId: string ) => { await sendThreadResponse( threads, `${await getUserSlackMentionOrName(financeUserId)} has added this reimbursement request to Concur. ${await getUserSlackMentionOrName(pendingSubmissionFromId)}, please check your email to approve the request in Concur and mark it as submitted on Finishline.` ); + const userId = await getUserSlackId(financeUserId); + if (threads && threads.length !== 0 && userId) { + const msgs = threads.map((thread) => + sendEphemeralMessage( + thread.channelId, + thread.timestamp, + userId, + 'Approve the request on concur and then click the button below to mark it as submitted on Finishline.', + [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Approve the request on concur and then click the button below to mark it as submitted on Finishline.' + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '' + } + }, + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: "✓ I've approved the request on Concur" + }, + style: 'primary', + action_id: 'sabo_submitted_confirmation', + value: JSON.stringify({ + reimbursementRequestId + }) + } + ] + } + ] + ) + ); + await Promise.all(msgs); + } }; export const sendSlackEventConfirmNotification = async ( @@ -257,13 +286,7 @@ export const sendSlackEventConfirmNotification = async ( : `http://localhost:3000/calendar/event/${eventId}`; const linkButtonText = 'Confirm Availability'; - try { - await sendMessage(slackId, msg, fullLink, linkButtonText); - } catch (error: unknown) { - if (error instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${error.message}`); - } - } + await sendMessage(slackId, msg, fullLink, linkButtonText); }; /** @@ -390,15 +413,9 @@ export const sendEventUserConfirmationToThread = async (threads: SlackMessageThr if (process.env.NODE_ENV !== 'production' && !DEV_TESTING_OVERRIDE) return; // don't send msgs unless in prod const slackPing = userToSlackPing(submitter); const fullMsg = `${slackPing} confirmed their availability!`; - try { - if (threads && threads.length !== 0) { - const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg)); - await Promise.all(msgs); - } - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${err.message}`); - } + if (threads && threads.length !== 0) { + const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg)); + await Promise.all(msgs); } }; @@ -406,15 +423,9 @@ export const sendEventConfirmationToThread = async (threads: SlackMessageThread[ if (process.env.NODE_ENV !== 'production' && !DEV_TESTING_OVERRIDE) return; // don't send msgs unless in prod const slackPing = userToSlackPing(submitter); const fullMsg = `${slackPing} All of the required attendees have confirmed their availability!`; - try { - if (threads && threads.length !== 0) { - const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg)); - await Promise.all(msgs); - } - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${err.message}`); - } + if (threads && threads.length !== 0) { + const msgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg)); + await Promise.all(msgs); } }; @@ -456,19 +467,13 @@ export const sendEventScheduledSlackNotif = async (threads: SlackMessageThread[] const docLink = event.questionDocumentLink ? `<${event.questionDocumentLink}|Doc Link>` : ''; const threadMsg = `This event has been Scheduled! \n` + docLink; - try { - if (threads && threads.length !== 0) { - const msgs = threads.map((thread) => editMessage(thread.channelId, thread.timestamp, msg)); - await Promise.all(msgs); - const threadMsgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, threadMsg)); - await Promise.all(threadMsgs); - const reactions = threads.map((thread) => reactToMessage(thread.channelId, thread.timestamp, 'calendar')); - await Promise.all(reactions); - } - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${err.message}`); - } + if (threads && threads.length !== 0) { + const msgs = threads.map((thread) => editMessage(thread.channelId, thread.timestamp, msg)); + await Promise.all(msgs); + const threadMsgs = threads.map((thread) => replyToMessageInThread(thread.channelId, thread.timestamp, threadMsg)); + await Promise.all(threadMsgs); + const reactions = threads.map((thread) => reactToMessage(thread.channelId, thread.timestamp, 'calendar')); + await Promise.all(reactions); } }; @@ -509,20 +514,14 @@ export const sendSlackCRStatusToThread = async ( const fullMsg = `This Change Request was ${approved ? 'approved! :tada:' : 'denied.'} Click the link to view.`; const fullLink = `https://finishlinebyner.com/cr/${crId}`; const btnText = `View CR#${identifier}`; - try { - if (threads && threads.length !== 0) { - const msgs = threads.map((thread) => - replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg, fullLink, btnText) - ); - const reactions = threads.map((thread) => - reactToMessage(thread.channelId, thread.timestamp, approved ? 'white_check_mark' : 'x') - ); - await Promise.all([...msgs, ...reactions]); - } - } catch (err: unknown) { - if (err instanceof Error) { - throw new HttpException(500, `Failed to send slack notification: ${err.message}`); - } + if (threads && threads.length !== 0) { + const msgs = threads.map((thread) => + replyToMessageInThread(thread.channelId, thread.timestamp, fullMsg, fullLink, btnText) + ); + const reactions = threads.map((thread) => + reactToMessage(thread.channelId, thread.timestamp, approved ? 'white_check_mark' : 'x') + ); + await Promise.all([...msgs, ...reactions]); } }; diff --git a/src/frontend/src/components/NERDataGrid.tsx b/src/frontend/src/components/NERDataGrid.tsx index b8aca1b45e..676b7f8e6c 100644 --- a/src/frontend/src/components/NERDataGrid.tsx +++ b/src/frontend/src/components/NERDataGrid.tsx @@ -13,7 +13,7 @@ interface NERDataGridProps { columns: GridColDef[]; pageSizeDefault?: number; rowsPerPageOptions?: number[]; - onAdd: () => void; + onAdd?: () => void; addLabel?: string; // optional label for the add/create button (defaults to 'Add') onRowClick?: (item: T) => void; // optional simple search fields (keys of mapped row) or a custom filter function @@ -97,9 +97,11 @@ function NERDataGrid({ placeholder="Search" sx={{ flex: 1 }} /> - + {onAdd && ( + + )} diff --git a/src/frontend/src/pages/CalendarPage/CalendarPage.tsx b/src/frontend/src/pages/CalendarPage/CalendarPage.tsx index 3c7324105e..171fad8bf9 100644 --- a/src/frontend/src/pages/CalendarPage/CalendarPage.tsx +++ b/src/frontend/src/pages/CalendarPage/CalendarPage.tsx @@ -34,7 +34,8 @@ import { convertIntToDay, eventsToEventInstances, eventsToNextEventInstance, - getOverlapTime + getOverlapTime, + getSundayOfWeek } from '../../utils/calendar.utils'; import { filterEventTransformer } from '../../apis/transformers/calendar.transformer'; import WarningIcon from '@mui/icons-material/Warning'; @@ -43,6 +44,7 @@ import UpcomingMeetingsCard from './UpcomingMeetingsCard'; import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; import RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked'; import { EventInstance } from 'shared'; +import CalendarWeekView from './CalendarWeekView'; // localStorage key for calendar filters const CALENDAR_FILTERS_KEY = 'calendar-filters'; @@ -85,7 +87,12 @@ interface NewCalendarPageProps { yourEvents: EventInstance[]; reviewEvents: Event[]; allCalendars: Calendar[]; - onCreateEventClick: (date: Date) => void; + onCreateEventClick: (date: Date, startTime?: Date, endTime?: Date) => void; + viewMode: 'month' | 'week'; + displayMonthYear: Date; + setDisplayMonthYear: (date: Date) => void; + displayWeek: Date; + setDisplayWeek: (date: Date) => void; } const NewCalendarPage: React.FC = ({ @@ -93,7 +100,12 @@ const NewCalendarPage: React.FC = ({ yourEvents, reviewEvents, allCalendars, - onCreateEventClick + onCreateEventClick, + viewMode, + displayMonthYear, + setDisplayMonthYear, + displayWeek, + setDisplayWeek }) => { const theme = useTheme(); const history = useHistory(); @@ -111,7 +123,6 @@ const NewCalendarPage: React.FC = ({ const [memberIds, setMemberIds] = useState(savedFilters.memberIds ?? []); const [teamIds, setTeamIds] = useState(savedFilters.teamIds ?? []); - const [displayMonthYear, setDisplayMonthYear] = useState(new Date()); const [showInvitedEvents, setShowInvitedEvents] = useState(savedFilters.showInvitedEvents ?? true); const [showTeamEvents, setShowTeamEvents] = useState(savedFilters.showTeamEvents ?? true); const [openFilterModal, setOpenFilterModal] = useState(false); @@ -155,8 +166,14 @@ const NewCalendarPage: React.FC = ({ } }, [allTeams, teamList, additionalTeamIds.length, showTeamEvents, allEventsMode]); - const startPeriod = new Date(displayMonthYear.getFullYear(), displayMonthYear.getMonth() - 1, 15); - const endPeriod = new Date(displayMonthYear.getFullYear(), displayMonthYear.getMonth() + 1, 15); + const startPeriod = + viewMode === 'week' + ? new Date(displayWeek.getFullYear(), displayWeek.getMonth(), displayWeek.getDate()) + : new Date(displayMonthYear.getFullYear(), displayMonthYear.getMonth() - 1, 15); + const endPeriod = + viewMode === 'week' + ? new Date(displayWeek.getFullYear(), displayWeek.getMonth(), displayWeek.getDate() + 7, 23, 59, 59) + : new Date(displayMonthYear.getFullYear(), displayMonthYear.getMonth() + 1, 15); // When allEventsMode is true, we don't filter by members/teams, but still filter by date and calendars const filterArgs = allEventsMode @@ -522,7 +539,7 @@ const NewCalendarPage: React.FC = ({ )} - + = ({ }} > - - {enumToArray(DAY_NAMES).map((day, index) => ( - - - { - // Day of the week display based on current breakpoint - isLargerView ? day : isExtraSmallView ? day.charAt(0) : day.substring(0, 3) - } - + {viewMode === 'week' ? ( + { + const newWeek = new Date(displayWeek); + newWeek.setDate(newWeek.getDate() + offset * 7); + setDisplayWeek(newWeek); + }} + onCreateEventClick={onCreateEventClick} + /> + ) : ( + <> + + {enumToArray(DAY_NAMES).map((day, index) => ( + + + { + // Day of the week display based on current breakpoint + isLargerView ? day : isExtraSmallView ? day.charAt(0) : day.substring(0, 3) + } + + + ))} - ))} - - - {startOfEachWeek - .filter((week) => daysThisMonth.slice(week, week + 7).length > 0) - .map((week, weekIndex) => ( - - {daysThisMonth.slice(week, week + 7).map((day, dayIndex) => { - const cardDate = new Date( - displayMonthYear.getFullYear(), - displayMonthYear.getMonth() + (isDayInDifferentMonth(day, week) ? (day > 15 ? -1 : 1) : 0), - day - ); - return ( - - - - ); - })} - - ))} - + + {startOfEachWeek + .filter((week) => daysThisMonth.slice(week, week + 7).length > 0) + .map((week, weekIndex) => ( + + {daysThisMonth.slice(week, week + 7).map((day, dayIndex) => { + const cardDate = new Date( + displayMonthYear.getFullYear(), + displayMonthYear.getMonth() + (isDayInDifferentMonth(day, week) ? (day > 15 ? -1 : 1) : 0), + day + ); + return ( + + + + ); + })} + + ))} + + + )} = ({ > setDisplayMonthYear(newDate)} + value={viewMode === 'week' ? displayWeek : displayMonthYear} + onMonthChange={(newDate) => { + if (viewMode !== 'week') setDisplayMonthYear(newDate); + }} onChange={(newDate) => { - if (newDate) setDisplayMonthYear(newDate); + if (!newDate) return; + if (viewMode === 'week') { + setDisplayWeek(getSundayOfWeek(newDate)); + } else { + setDisplayMonthYear(newDate); + } }} slotProps={{ day: { diff --git a/src/frontend/src/pages/CalendarPage/CalendarTab.tsx b/src/frontend/src/pages/CalendarPage/CalendarTab.tsx index 3ff73f85a5..808988e3af 100644 --- a/src/frontend/src/pages/CalendarPage/CalendarTab.tsx +++ b/src/frontend/src/pages/CalendarPage/CalendarTab.tsx @@ -1,7 +1,7 @@ import { routes } from '../../utils/routes'; import NewCalendarPage from './CalendarPage'; import PageLayout from '../../components/PageLayout'; -import { Box } from '@mui/material'; +import { Box, ToggleButton, ToggleButtonGroup } from '@mui/material'; import FullPageTabs from '../../components/FullPageTabs'; import { useState } from 'react'; import { useCurrentUser } from '../../hooks/users.hooks'; @@ -15,16 +15,34 @@ import CreateEventModal from './Components/CreateEventModal'; import { useHistory } from 'react-router-dom'; import { NERButton } from '../../components/NERButton'; import { Add } from '@mui/icons-material'; -import { eventsToEventInstances } from '../../utils/calendar.utils'; +import { eventsToEventInstances, getSundayOfWeek } from '../../utils/calendar.utils'; const CalendarTab: React.FC = () => { const [tabIndex, setTabIndex] = useState(0); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [createModalDate, setCreateModalDate] = useState(new Date()); + const [createModalStartTime, setCreateModalStartTime] = useState(undefined); + const [createModalEndTime, setCreateModalEndTime] = useState(undefined); + const [viewMode, setViewMode] = useState<'month' | 'week'>('month'); + const [displayMonthYear, setDisplayMonthYear] = useState(new Date()); + const [displayWeek, setDisplayWeek] = useState(() => getSundayOfWeek(new Date())); const user = useCurrentUser(); const history = useHistory(); const canViewReviews = isHead(user.role) || isLead(user.role); + const handleViewModeToggle = (_: React.MouseEvent, newMode: 'month' | 'week' | null) => { + if (!newMode || newMode === viewMode) return; + if (newMode === 'week') { + setDisplayWeek(getSundayOfWeek(displayMonthYear)); + } else { + // Show the month containing Thursday of the displayed week (majority month rule) + const thursday = new Date(displayWeek); + thursday.setDate(thursday.getDate() + 4); + setDisplayMonthYear(new Date(thursday.getFullYear(), thursday.getMonth(), 1)); + } + setViewMode(newMode); + }; + const tabs = [ { tabUrlValue: '', tabName: 'Calendar' }, { tabUrlValue: 'yourEvents', tabName: 'Your Events' } @@ -91,11 +109,13 @@ const CalendarTab: React.FC = () => { if (canViewReviews) tabs.push({ tabUrlValue: 'reviews', tabName: 'Review Bookings' }); - const handleNewEventClick = (date?: Date) => { + const handleNewEventClick = (date?: Date, startTime?: Date, endTime?: Date) => { if (tabIndex !== 0) { history.push(routes.CALENDAR); } setCreateModalDate(date || new Date()); + setCreateModalStartTime(startTime); + setCreateModalEndTime(endTime); setIsCreateModalOpen(true); }; @@ -116,14 +136,44 @@ const CalendarTab: React.FC = () => { } headerRight={ - } - onClick={() => handleNewEventClick()} - > - New Event - + + + + Month + + + Week + + + } + onClick={() => handleNewEventClick()} + > + New Event + + } > {tabIndex === 0 ? ( @@ -133,6 +183,11 @@ const CalendarTab: React.FC = () => { yourEvents={eventsToEventInstances(yourEvents)} allCalendars={allCalendars} onCreateEventClick={handleNewEventClick} + viewMode={viewMode} + displayMonthYear={displayMonthYear} + setDisplayMonthYear={setDisplayMonthYear} + displayWeek={displayWeek} + setDisplayWeek={setDisplayWeek} /> ) : ( { {isCreateModalOpen && ( setIsCreateModalOpen(false)} + onClose={() => { + setIsCreateModalOpen(false); + setCreateModalStartTime(undefined); + setCreateModalEndTime(undefined); + }} eventTypes={allEventTypes} defaultDate={createModalDate} + defaultStartTime={createModalStartTime} + defaultEndTime={createModalEndTime} /> )} diff --git a/src/frontend/src/pages/CalendarPage/CalendarWeekView.tsx b/src/frontend/src/pages/CalendarPage/CalendarWeekView.tsx new file mode 100644 index 0000000000..a9203af55b --- /dev/null +++ b/src/frontend/src/pages/CalendarPage/CalendarWeekView.tsx @@ -0,0 +1,938 @@ +/* + * This file is part of NER's FinishLine and licensed under GNU AGPLv3. + * See the LICENSE file in the repository root folder for details. + */ +import { useRef, useState, useCallback } from 'react'; +import { Box, Card, Stack, Tooltip, Typography, useTheme } from '@mui/material'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import { Calendar, ConflictStatus, EventInstance, EventStatus, EventType, isGuest } from 'shared'; +import { EventClickContent } from './EventClickPopup'; +import EditEventModal from './Components/EditEventModal'; +import DeleteSeriesConfirmationModal from './Components/DeleteSeriesConfirmationModal'; +import NERDeleteModal from '../../components/NERDeleteModal'; +import { useDeleteEvent, useDeleteScheduleSlot } from '../../hooks/calendar.hooks'; +import { useToast } from '../../hooks/toasts.hooks'; +import { useCurrentUser } from '../../hooks/users.hooks'; +import { getMutedColor } from '../../utils/calendar.utils'; +import { getTeamTypeIcon } from './CalendarDayCard'; + +// ─── Layout constants ──────────────────────────────────────────────────────── + +const HOUR_HEIGHT = 60; // px per hour (1px = 1 minute) +const TOTAL_HEIGHT = 24 * HOUR_HEIGHT; // 1440px +const MIN_EVENT_HEIGHT = 18; // px minimum for very short events +const TIME_GUTTER_WIDTH = 56; // px for the hour-label column +const SNAP_MINUTES = 15; // drag-to-create snap interval +const DAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +const getMinutesFromMidnight = (date: Date): number => date.getHours() * 60 + date.getMinutes(); + +const snapToInterval = (minutes: number): number => Math.round(minutes / SNAP_MINUTES) * SNAP_MINUTES; + +const formatHour = (hour: number): string => { + if (hour === 0) return '12 AM'; + if (hour === 12) return '12 PM'; + if (hour < 12) return `${hour} AM`; + return `${hour - 12} PM`; +}; + +const formatMinutes = (totalMinutes: number): string => { + const h = Math.floor(totalMinutes / 60); + const m = totalMinutes % 60; + const period = h < 12 ? 'AM' : 'PM'; + const displayH = h === 0 ? 12 : h > 12 ? h - 12 : h; + return `${displayH}:${m.toString().padStart(2, '0')} ${period}`; +}; + +const getWeekDays = (sundayOfWeek: Date): Date[] => + Array.from({ length: 7 }, (_, i) => { + const d = new Date(sundayOfWeek); + d.setDate(sundayOfWeek.getDate() + i); + return d; + }); + +const isSameDay = (a: Date, b: Date): boolean => + a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); + +// ─── Event layout ───────────────────────────────────────────────────────────── + +interface LayoutEvent { + event: EventInstance; + top: number; + height: number; + col: number; + totalCols: number; +} + +/** + * Positions events within a single day column using a greedy lane-assignment + * algorithm so that overlapping events appear side-by-side. + */ +const computeEventLayouts = (events: EventInstance[]): LayoutEvent[] => { + if (events.length === 0) return []; + + const sorted = [...events].sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime()); + + // Greedy column assignment: track the end-time of the last event placed in each column. + const colEndTimes: number[] = []; + const placements: { event: EventInstance; col: number }[] = []; + + for (const event of sorted) { + const startMs = new Date(event.startTime).getTime(); + const endMs = new Date(event.endTime).getTime(); + let col = colEndTimes.findIndex((e) => e <= startMs); + if (col === -1) { + col = colEndTimes.length; + colEndTimes.push(endMs); + } else { + colEndTimes[col] = endMs; + } + placements.push({ event, col }); + } + + return placements.map(({ event, col }) => { + const startMs = new Date(event.startTime).getTime(); + const endMs = new Date(event.endTime).getTime(); + + // totalCols = highest column index used by concurrent events + 1 + const concurrent = placements.filter(({ event: other }) => { + const oStart = new Date(other.startTime).getTime(); + const oEnd = new Date(other.endTime).getTime(); + return oStart < endMs && oEnd > startMs; + }); + const totalCols = Math.max(...concurrent.map((p) => p.col)) + 1; + + const startMin = getMinutesFromMidnight(new Date(event.startTime)); + const endMin = getMinutesFromMidnight(new Date(event.endTime)); + const durationMin = Math.max(endMin - startMin, SNAP_MINUTES); + + return { + event, + top: (startMin / 60) * HOUR_HEIGHT, + height: Math.max((durationMin / 60) * HOUR_HEIGHT, MIN_EVENT_HEIGHT), + col, + totalCols + }; + }); +}; + +// ─── Component props ────────────────────────────────────────────────────────── + +interface CalendarWeekViewProps { + allEventTypes: EventType[]; + allCalendars: Calendar[]; + eventInstances: EventInstance[]; + displayWeek: Date; // Sunday of the displayed week + onNavigateWeek: (offset: -1 | 1) => void; + onCreateEventClick: (date: Date, startTime?: Date, endTime?: Date) => void; +} + +// ─── Drag state ─────────────────────────────────────────────────────────────── + +interface DragState { + dayIndex: number; + dayDate: Date; + startMinutes: number; + currentMinutes: number; // updated as mouse moves +} + +// ─── Main component ─────────────────────────────────────────────────────────── + +const CalendarWeekView: React.FC = ({ + allEventTypes, + allCalendars, + eventInstances, + displayWeek, + onNavigateWeek, + onCreateEventClick +}) => { + const theme = useTheme(); + const user = useCurrentUser(); + const toast = useToast(); + const scrollContainerRef = useRef(null); + + const [lockedTooltipEventId, setLockedTooltipEventId] = useState(null); + const [selectedEvent, setSelectedEvent] = useState(null); + const [showEditModal, setShowEditModal] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [showSeriesDeleteModal, setShowSeriesDeleteModal] = useState(false); + const [dragState, setDragState] = useState(null); + + const isDraggingRef = useRef(false); + const dragStartRef = useRef<{ dayIndex: number; dayDate: Date; startMinutes: number } | null>(null); + const dragEndMinutesRef = useRef(0); + + const { mutateAsync: deleteEvent } = useDeleteEvent(selectedEvent?.eventId ?? ''); + const { mutateAsync: deleteScheduleSlot } = useDeleteScheduleSlot( + selectedEvent?.eventId ?? '', + selectedEvent?.scheduleSlotId ?? '' + ); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + + const weekDays = getWeekDays(displayWeek); + + // Format the week date range for the navigation header + const formatWeekRange = (): string => { + const [start, , , , , , end] = weekDays; + const startStr = start.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); + if (start.getFullYear() !== end.getFullYear()) { + return `${startStr}, ${start.getFullYear()} – ${end.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`; + } + if (start.getMonth() !== end.getMonth()) { + return `${startStr} – ${end.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`; + } + return `${startStr} – ${end.getDate()}, ${end.getFullYear()}`; + }; + + // Partition events into timed vs all-day + const timedEvents = eventInstances.filter((e) => !e.allDay); + const allDayEvents = eventInstances.filter((e) => e.allDay); + + // Build per-day event lists for the timed grid + const eventsByDay: EventInstance[][] = weekDays.map((day) => + timedEvents.filter((e) => isSameDay(new Date(e.startTime), day)) + ); + + // Build per-day all-day event lists + const allDayEventsByDay: EventInstance[][] = weekDays.map((day) => + allDayEvents.filter((e) => { + const start = new Date(e.startTime); + const end = new Date(e.endTime); + // Normalize end to compare day boundaries + const dayStart = new Date(day); + const dayEnd = new Date(day); + dayEnd.setDate(dayEnd.getDate() + 1); + return start < dayEnd && end > dayStart; + }) + ); + + // Calendar color lookup + const getEventColor = (event: EventInstance): string => { + const eventType = allEventTypes.find((et) => et.eventTypeId === event.eventTypeId); + const calendar = allCalendars.find((cal) => cal.eventTypes.some((et) => et.eventTypeId === eventType?.eventTypeId)); + return calendar?.color ?? '#888888'; + }; + + // ─── Scroll to current time on mount ────────────────────────────────────── + + const scrollInitialized = useRef(false); + const timeGridRef = useCallback( + (node: HTMLDivElement | null) => { + if (node && !scrollInitialized.current) { + scrollInitialized.current = true; + const now = new Date(); + const isThisWeek = weekDays.some((d) => isSameDay(d, now)); + const targetMinutes = isThisWeek ? getMinutesFromMidnight(now) : 8 * 60; + const targetPx = (targetMinutes / 60) * HOUR_HEIGHT; + // Center the current time in the viewport (visible height ~768px = 12 hours) + node.scrollTop = Math.max(0, targetPx - node.clientHeight / 2); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [displayWeek] + ); + + // ─── Drag-to-create handlers ─────────────────────────────────────────────── + + const getMinutesFromMouseY = (e: React.MouseEvent, container: HTMLDivElement): number => { + const rect = container.getBoundingClientRect(); + const y = e.clientY - rect.top + container.scrollTop; + const rawMinutes = (y / HOUR_HEIGHT) * 60; + return Math.max(0, Math.min(23 * 60 + 59, rawMinutes)); + }; + + const handleTimeGridMouseDown = (e: React.MouseEvent, dayIndex: number, dayDate: Date) => { + if (isGuest(user.role)) return; + const dayStart = new Date(dayDate); + dayStart.setHours(0, 0, 0, 0); + if (dayStart < today) return; // past days are not clickable + + e.preventDefault(); + const container = scrollContainerRef.current; + if (!container) return; + + const rawMinutes = getMinutesFromMouseY(e, container); + const snapped = snapToInterval(rawMinutes); + + isDraggingRef.current = true; + dragStartRef.current = { dayIndex, dayDate, startMinutes: snapped }; + dragEndMinutesRef.current = snapped + 60; // default 1-hour slot for click (no drag) + setDragState({ dayIndex, dayDate, startMinutes: snapped, currentMinutes: snapped + SNAP_MINUTES }); + }; + + const handleTimeGridMouseMove = (e: React.MouseEvent) => { + if (!isDraggingRef.current || !dragStartRef.current) return; + const container = scrollContainerRef.current; + if (!container) return; + + const rawMinutes = getMinutesFromMouseY(e, container); + const snapped = Math.max(snapToInterval(rawMinutes), dragStartRef.current.startMinutes + SNAP_MINUTES); + dragEndMinutesRef.current = Math.min(snapped, 24 * 60); + setDragState((prev) => (prev ? { ...prev, currentMinutes: Math.min(snapped, 24 * 60) } : null)); + }; + + const handleTimeGridMouseUp = () => { + if (!isDraggingRef.current || !dragStartRef.current) { + isDraggingRef.current = false; + dragStartRef.current = null; + setDragState(null); + return; + } + + isDraggingRef.current = false; + + const { dayDate, startMinutes } = dragStartRef.current; + // Use the ref (updated synchronously) instead of dragState (async React state) + const endMinutes = dragEndMinutesRef.current; + dragStartRef.current = null; + + setDragState(null); + + const startTime = new Date(dayDate); + startTime.setHours(Math.floor(startMinutes / 60), startMinutes % 60, 0, 0); + const endTime = new Date(dayDate); + endTime.setHours(Math.floor(endMinutes / 60), endMinutes % 60, 0, 0); + + onCreateEventClick(dayDate, startTime, endTime); + }; + + const handleTimeGridMouseLeave = () => { + if (isDraggingRef.current) { + isDraggingRef.current = false; + dragStartRef.current = null; + setDragState(null); + } + }; + + // ─── Edit / delete handlers ──────────────────────────────────────────────── + + const handleEdit = (event: EventInstance) => { + setSelectedEvent(event); + setShowEditModal(true); + }; + + const handleDelete = (event: EventInstance) => { + setSelectedEvent(event); + if (event.recurring) { + setShowSeriesDeleteModal(true); + } else { + setShowDeleteModal(true); + } + }; + + const handleDeleteConfirm = async () => { + try { + setShowDeleteModal(false); + setLockedTooltipEventId(null); + await deleteEvent(); + toast.success('Event deleted successfully!'); + } catch (err) { + if (err instanceof Error) toast.error(err.message); + } + }; + + const handleSeriesDeleteConfirm = async (deleteEntireEvent: boolean) => { + try { + setShowSeriesDeleteModal(false); + setLockedTooltipEventId(null); + if (deleteEntireEvent) { + await deleteEvent(); + toast.success('Event deleted successfully!'); + } else { + await deleteScheduleSlot(); + toast.success('Event occurrence deleted successfully!'); + } + } catch (err) { + if (err instanceof Error) toast.error(err.message); + } + }; + + // ─── Sub-components ──────────────────────────────────────────────────────── + + const WeekEventBlock = ({ event, layout }: { event: EventInstance; layout: LayoutEvent }) => { + const [blockHovered, setBlockHovered] = useState(false); + const [tooltipHovered, setTooltipHovered] = useState(false); + const isLocked = lockedTooltipEventId === event.eventId + event.scheduleSlotId; + const isOpen = isLocked || blockHovered || tooltipHovered; + + const baseColor = getEventColor(event); + const isPending = + event.status === EventStatus.UNCONFIRMED || + event.status === EventStatus.CONFIRMED || + event.approved === ConflictStatus.PENDING || + event.approved === ConflictStatus.DENIED; + const bgColor = isPending ? getMutedColor(baseColor, 0.45) : baseColor; + + const widthPct = 100 / layout.totalCols; + const leftPct = (layout.col / layout.totalCols) * 100; + const showTime = layout.height >= 36; + + return ( + setTooltipHovered(true)} onMouseLeave={() => setTooltipHovered(false)}> + setLockedTooltipEventId(null)} + onEdit={handleEdit} + onDelete={handleDelete} + clickedDate={new Date(event.startTime)} + /> + + } + slotProps={{ + popper: { sx: { zIndex: 1200 } }, + tooltip: { + sx: { + maxWidth: 'none', + borderRadius: 4, + p: 0, + bgcolor: 'transparent', + boxShadow: '0 0 15px rgba(255,255,255,1.0)' + } + }, + arrow: { sx: { color: theme.palette.grey[900], fontSize: 16 } } + }} + PopperProps={{ modifiers: [{ name: 'offset', options: { offset: [0, 4] } }] }} + > + setBlockHovered(true)} + onMouseLeave={() => { + setTimeout(() => { + if (!isLocked && !tooltipHovered) setBlockHovered(false); + }, 100); + }} + onClick={(e) => { + e.stopPropagation(); + setLockedTooltipEventId(event.eventId + event.scheduleSlotId); + }} + onMouseDown={(e) => e.stopPropagation()} // prevent drag when clicking an event + sx={{ + position: 'absolute', + top: layout.top, + height: layout.height, + left: `calc(${leftPct}% + 1px)`, + width: `calc(${widthPct}% - 2px)`, + bgcolor: bgColor, + borderRadius: 1, + overflow: 'hidden', + cursor: 'pointer', + zIndex: 2, + ...(isPending && { border: `1px dashed ${baseColor}`, opacity: 0.85 }) + }} + > + + {getTeamTypeIcon(event.teamType?.name ?? '')} {event.title} + + {showTime && ( + + {new Date(event.startTime).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })} + {' – '} + {new Date(event.endTime).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })} + + )} + + + ); + }; + + const AllDayEventBlock = ({ event }: { event: EventInstance }) => { + const [blockHovered, setBlockHovered] = useState(false); + const [tooltipHovered, setTooltipHovered] = useState(false); + const isLocked = lockedTooltipEventId === event.eventId + event.scheduleSlotId; + const isOpen = isLocked || blockHovered || tooltipHovered; + + const baseColor = getEventColor(event); + const isPending = + event.status === EventStatus.UNCONFIRMED || + event.status === EventStatus.CONFIRMED || + event.approved === ConflictStatus.PENDING || + event.approved === ConflictStatus.DENIED; + const bgColor = isPending ? getMutedColor(baseColor, 0.45) : baseColor; + + return ( + setTooltipHovered(true)} onMouseLeave={() => setTooltipHovered(false)}> + setLockedTooltipEventId(null)} + onEdit={handleEdit} + onDelete={handleDelete} + clickedDate={new Date(event.startTime)} + /> + + } + slotProps={{ + popper: { sx: { zIndex: 1200 } }, + tooltip: { + sx: { + maxWidth: 'none', + borderRadius: 4, + p: 0, + bgcolor: 'transparent', + boxShadow: '0 0 15px rgba(255,255,255,1.0)' + } + }, + arrow: { sx: { color: theme.palette.grey[900], fontSize: 16 } } + }} + PopperProps={{ modifiers: [{ name: 'offset', options: { offset: [0, 4] } }] }} + > + setBlockHovered(true)} + onMouseLeave={() => { + setTimeout(() => { + if (!isLocked && !tooltipHovered) setBlockHovered(false); + }, 100); + }} + onClick={(e) => { + e.stopPropagation(); + setLockedTooltipEventId(event.eventId + event.scheduleSlotId); + }} + sx={{ + bgcolor: bgColor, + borderRadius: 0.5, + px: 0.5, + py: 0.25, + mb: 0.25, + cursor: 'pointer', + overflow: 'hidden', + ...(isPending && { border: `1px dashed ${baseColor}`, opacity: 0.85 }) + }} + > + + {event.title} + + + + ); + }; + + // ─── Render ──────────────────────────────────────────────────────────────── + + return ( + + {/* Locked tooltip backdrop */} + {lockedTooltipEventId && ( + setLockedTooltipEventId(null)} + /> + )} + + {/* Navigation header — outside the white box, matching the month view's header area */} + + onNavigateWeek(-1)} + sx={{ + cursor: 'pointer', + display: 'flex', + alignItems: 'center', + color: 'rgba(255,255,255,0.7)', + '&:hover': { color: 'white' } + }} + > + + + t.typography.h4.fontFamily, + fontWeight: 600, + fontSize: 18, + minWidth: 220, + textAlign: 'center' + }} + data-testid="week-date-range" + > + {formatWeekRange()} + + onNavigateWeek(1)} + sx={{ + cursor: 'pointer', + display: 'flex', + alignItems: 'center', + color: 'rgba(255,255,255,0.7)', + '&:hover': { color: 'white' } + }} + > + + + + + {/* White-bordered grid box — column headers + all-day row + scrollable time grid */} + + {/* Column headers: day names + dates */} + + {/* Spacer for the time gutter */} + + {weekDays.map((day, i) => { + const isToday = isSameDay(day, today); + return ( + + + {DAY_LABELS[i]} + + + + {day.getDate()} + + + + ); + })} + + + {/* All-day row */} + + + All day + + {weekDays.map((_day, i) => ( + + {allDayEventsByDay[i].map((event) => ( + + ))} + + ))} + + + {/* Scrollable time grid */} + { + (scrollContainerRef as React.MutableRefObject).current = node; + timeGridRef(node); + }} + onMouseMove={handleTimeGridMouseMove} + onMouseUp={handleTimeGridMouseUp} + onMouseLeave={handleTimeGridMouseLeave} + data-testid="week-time-grid" + sx={{ + flex: 1, + overflowY: 'auto', + overflowX: 'hidden', + scrollbarColor: `${theme.palette.primary.main} transparent`, + '&::-webkit-scrollbar': { width: '6px' }, + '&::-webkit-scrollbar-track': { background: 'transparent' }, + '&::-webkit-scrollbar-thumb': { background: theme.palette.primary.main, borderRadius: '3px' }, + userSelect: 'none' + }} + > + {/* Inner container — full 24-hour height */} + + {/* Time gutter */} + + {Array.from({ length: 24 }, (_, hour) => ( + + {hour > 0 && ( + + {formatHour(hour)} + + )} + + ))} + + + {/* Day columns */} + + {/* Horizontal hour and half-hour lines — rendered once across all columns */} + {Array.from({ length: 24 }, (_, hour) => ( + + + {hour < 23 && ( + + )} + + ))} + + {/* Current time indicator */} + {weekDays.some((d) => isSameDay(d, today)) && + (() => { + const todayIndex = weekDays.findIndex((d) => isSameDay(d, today)); + const nowMinutes = getMinutesFromMidnight(new Date()); + const topPx = (nowMinutes / 60) * HOUR_HEIGHT; + const colWidth = 100 / 7; + return ( + + ); + })()} + + {/* Per-day columns */} + {weekDays.map((day, dayIndex) => { + const isToday = isSameDay(day, today); + const isPastDay = day < today; + const canCreate = !isPastDay && !isGuest(user.role); + const layouts = computeEventLayouts(eventsByDay[dayIndex]); + + return ( + handleTimeGridMouseDown(e, dayIndex, day) : undefined} + sx={{ + flex: 1, + position: 'relative', + borderLeft: '1px solid rgba(255,255,255,0.08)', + bgcolor: isToday ? 'rgba(255,255,255,0.025)' : 'transparent', + cursor: canCreate ? 'crosshair' : 'default' + }} + > + {/* Drag selection overlay */} + {dragState?.dayIndex === dayIndex && + (() => { + const minStart = Math.min(dragState.startMinutes, dragState.currentMinutes); + const minEnd = Math.max(dragState.startMinutes, dragState.currentMinutes); + const topPx = (minStart / 60) * HOUR_HEIGHT; + const heightPx = ((minEnd - minStart) / 60) * HOUR_HEIGHT; + return ( + + + {formatMinutes(minStart)} – {formatMinutes(minEnd)} + + + ); + })()} + + {/* Timed event blocks */} + {layouts.map((layout) => ( + + ))} + + ); + })} + + + + + + {/* Edit modal */} + {selectedEvent && showEditModal && ( + { + setShowEditModal(false); + setLockedTooltipEventId(null); + }} + event={selectedEvent} + eventTypes={allEventTypes} + /> + )} + + {/* Single-event delete modal */} + {selectedEvent && showDeleteModal && ( + { + setShowDeleteModal(false); + setLockedTooltipEventId(null); + }} + formId="week-delete-event-form" + dataType={selectedEvent.title} + onFormSubmit={handleDeleteConfirm} + /> + )} + + {/* Series delete modal */} + {selectedEvent && showSeriesDeleteModal && ( + { + setShowSeriesDeleteModal(false); + setLockedTooltipEventId(null); + }} + onConfirm={handleSeriesDeleteConfirm} + eventTitle={selectedEvent.title} + totalSlots={selectedEvent.totalScheduledSlots} + /> + )} + + ); +}; + +export default CalendarWeekView; diff --git a/src/frontend/src/pages/CalendarPage/Components/CreateEventModal.tsx b/src/frontend/src/pages/CalendarPage/Components/CreateEventModal.tsx index 022e570544..039271ab75 100644 --- a/src/frontend/src/pages/CalendarPage/Components/CreateEventModal.tsx +++ b/src/frontend/src/pages/CalendarPage/Components/CreateEventModal.tsx @@ -10,9 +10,18 @@ interface CreateEventModalProps { onClose: () => void; eventTypes: EventType[]; defaultDate?: Date; + defaultStartTime?: Date; + defaultEndTime?: Date; } -const CreateEventModal: React.FC = ({ open, onClose, eventTypes, defaultDate }) => { +const CreateEventModal: React.FC = ({ + open, + onClose, + eventTypes, + defaultDate, + defaultStartTime, + defaultEndTime +}) => { const toast = useToast(); const { mutateAsync: createEvent } = useCreateEvent(); const { mutateAsync: uploadDocuments } = useUploadManyDocuments(); @@ -103,6 +112,8 @@ const CreateEventModal: React.FC = ({ open, onClose, even onSubmit={handleSubmit} eventTypes={eventTypes} defaultDate={defaultDate} + defaultStartTime={defaultStartTime} + defaultEndTime={defaultEndTime} /> ); }; diff --git a/src/frontend/src/pages/CalendarPage/Components/EventModal.tsx b/src/frontend/src/pages/CalendarPage/Components/EventModal.tsx index dc1b21dde7..9d58eb12aa 100644 --- a/src/frontend/src/pages/CalendarPage/Components/EventModal.tsx +++ b/src/frontend/src/pages/CalendarPage/Components/EventModal.tsx @@ -152,6 +152,8 @@ export interface BaseEventModalProps { initialValues?: Partial; eventTypes: EventType[]; defaultDate?: Date; + defaultStartTime?: Date; // Pre-fill start time without triggering edit mode (e.g. drag-to-create) + defaultEndTime?: Date; // Pre-fill end time without triggering edit mode eventId?: string; // Required for edit mode to fetch preview of affected schedule slots } @@ -211,6 +213,8 @@ const EventModal: React.FC = ({ initialValues, eventTypes, defaultDate = new Date(), + defaultStartTime, + defaultEndTime, eventId }) => { const toast = useToast(); @@ -272,14 +276,14 @@ const EventModal: React.FC = ({ questionDocumentLink: initialValues?.questionDocumentLink, description: initialValues?.description, scheduleDate: initialValues?.scheduleDate ?? defaultDate, - startTime: initialValues?.startTime ?? defaultTimes.startTime, - endTime: initialValues?.endTime ?? defaultTimes.endTime, + startTime: initialValues?.startTime ?? defaultStartTime ?? defaultTimes.startTime, + endTime: initialValues?.endTime ?? defaultEndTime ?? defaultTimes.endTime, allDay: initialValues?.allDay ?? false, recurrenceNumber: 0, days: [], selectedScheduleSlotId: initialValues?.selectedScheduleSlotId }; - }, [initialValues, defaultDate]); + }, [initialValues, defaultDate, defaultStartTime, defaultEndTime]); const allowedEventTypes = useMemo(() => { return eventTypes.filter((et) => { @@ -882,7 +886,7 @@ const EventModal: React.FC = ({ error: !!errors.startTime, helperText: errors.startTime?.message, onClick: () => setStartTimePickerOpen(true), - sx: { width: 100 } + sx: { width: 120 } }, layout: { sx: { @@ -930,7 +934,7 @@ const EventModal: React.FC = ({ error: !!errors.endTime, helperText: errors.endTime?.message, onClick: () => setEndTimePickerOpen(true), - sx: { width: 100 } + sx: { width: 120 } }, layout: { sx: { diff --git a/src/frontend/src/pages/CalendarPage/EventClickPopup.tsx b/src/frontend/src/pages/CalendarPage/EventClickPopup.tsx index b261186b7b..cf0d385095 100644 --- a/src/frontend/src/pages/CalendarPage/EventClickPopup.tsx +++ b/src/frontend/src/pages/CalendarPage/EventClickPopup.tsx @@ -158,55 +158,57 @@ export const EventClickContent: React.FC = ({ {pendingReason} )} - - {!disable && canEditOrDelete && ( - - { - stopClick(e); - onEdit(event); - }} - sx={{ - color: theme.palette.grey[500], - '&:hover': { - color: theme.palette.common.white, - bgcolor: 'transparent' - } - }} - > - - - { - stopClick(e); - onDelete(event); - }} + + + + {getTeamTypeIcon(event.teamType?.name ?? '', true)} + + + - - + {name} + - )} - - {getTeamTypeIcon(event.teamType?.name ?? '', true)} - - {name} - + + {!disable && canEditOrDelete && ( + + { + stopClick(e); + onEdit(event); + }} + sx={{ + color: theme.palette.grey[500], + '&:hover': { color: theme.palette.common.white, bgcolor: 'transparent' } + }} + > + + + + { + stopClick(e); + onDelete(event); + }} + sx={{ + color: theme.palette.grey[500], + '&:hover': { color: '#ef5350', bgcolor: 'transparent' } + }} + > + + + + )} @@ -426,6 +428,7 @@ export const EventClickContent: React.FC = ({ )} + {addApprovalButtons && canApprove && ( = ({ > Approve + { diff --git a/src/frontend/src/pages/CalendarPage/EventPartialInfoView.tsx b/src/frontend/src/pages/CalendarPage/EventPartialInfoView.tsx index 1e59886580..9784a40162 100644 --- a/src/frontend/src/pages/CalendarPage/EventPartialInfoView.tsx +++ b/src/frontend/src/pages/CalendarPage/EventPartialInfoView.tsx @@ -48,13 +48,28 @@ const EventPartialInfoView: React.FC = ({ event, eventTypes, cal }} > - + {getTeamTypeIcon(event.teamType?.name ?? '', false)} - + {name} - + + {event.allDay ? ( @@ -67,14 +82,28 @@ const EventPartialInfoView: React.FC = ({ event, eventTypes, cal )} + - + - + {event.location ?? 'N/A'} - + + {event.requiredMembers[0] diff --git a/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/DiffSection.tsx b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/DiffSection.tsx index 3e3b0d1746..be3a249fd4 100644 --- a/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/DiffSection.tsx +++ b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/DiffSection.tsx @@ -1,11 +1,13 @@ import { Box } from '@mui/system'; import InfoBlock from '../../../components/InfoBlock'; -import { StandardChangeRequest } from 'shared'; +import { isProjectWbs, StandardChangeRequest } from 'shared'; import ProjectDiffSection from './ProjectDiffSection'; import WorkPackageDiffSection from './WorkPackageDiffSection'; import LoadingIndicator from '../../../components/LoadingIndicator'; import DiffSectionEdit from './DiffSectionEdit'; import { getChangesForWorkPackage } from '../../../utils/diff-page.utils'; +import NewProjectDiffSection from './NewProjectDiffSection'; + interface DiffSectionProps { changeRequest: StandardChangeRequest; } @@ -18,7 +20,11 @@ const DiffSection: React.FC = ({ changeRequest }) => { {wbsNum ? ( projectProposedChanges ? ( - + isProjectWbs(wbsNum) ? ( + + ) : ( + + ) ) : workPackageProposedChanges ? ( wbsNum.workPackageNumber === 0 ? ( diff --git a/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/NewProjectDiffSection.tsx b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/NewProjectDiffSection.tsx new file mode 100644 index 0000000000..0ddba686d3 --- /dev/null +++ b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/NewProjectDiffSection.tsx @@ -0,0 +1,16 @@ +import { ProjectProposedChanges } from 'shared'; +import DiffSectionEdit from './DiffSectionEdit'; +import { ComparableCollection, getChangesForProject } from '../../../utils/diff-page.utils'; +import { useEffect, useState } from 'react'; + +const NewProjectDiffSection = ({ projectProposedChanges }: { projectProposedChanges: ProjectProposedChanges }) => { + const [collections, setCollections] = useState([]); + + useEffect(() => { + setCollections(getChangesForProject(projectProposedChanges, undefined)); + }, [projectProposedChanges, setCollections]); + + return ; +}; + +export default NewProjectDiffSection; diff --git a/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/ProjectDiffSection.tsx b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/ProjectDiffSection.tsx index 1858e27eb7..2b7b6fea3a 100644 --- a/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/ProjectDiffSection.tsx +++ b/src/frontend/src/pages/ChangeRequestDetailPage/DiffSection/ProjectDiffSection.tsx @@ -18,7 +18,7 @@ const ProjectDiffSection = ({ useEffect(() => { if (originalProject) { - setCollections(getChangesForProject(originalProject, projectProposedChanges)); + setCollections(getChangesForProject(projectProposedChanges, originalProject)); } }, [originalProject, projectProposedChanges, setCollections]); diff --git a/src/frontend/src/pages/FinancePage/FinanceComponents/PieChart.tsx b/src/frontend/src/pages/FinancePage/FinanceComponents/PieChart.tsx index f80e336eaa..14396e1a0b 100644 --- a/src/frontend/src/pages/FinancePage/FinanceComponents/PieChart.tsx +++ b/src/frontend/src/pages/FinancePage/FinanceComponents/PieChart.tsx @@ -8,26 +8,27 @@ import { Button, List, ListItem, Typography } from '@mui/material'; interface FinancePieChartProps { totalBalance: number; - pendingLeadership: number; - pendingFinance: number; - submittedToSABO: number; + pendingApproval: number; + approved: number; + addedToSABO: number; reimbursed: number; available: number; } const FinancePieChart: React.FC = ({ totalBalance, - pendingLeadership, - pendingFinance, - submittedToSABO, + pendingApproval, + approved, + addedToSABO, reimbursed, available }) => { const [isLegendOpen, setIsLegendOpen] = useState(true); + const [sectionStates, setSectionStates] = useState([ - { title: 'Pending Leadership', color: '#562016', expanded: false }, - { title: 'Pending Finance', color: '#8e3c2d', expanded: false }, - { title: 'Submitted to SABO', color: '#dd514c', expanded: false }, + { title: 'Pending Approval', color: '#562016', expanded: false }, + { title: 'Approved', color: '#8e3c2d', expanded: false }, + { title: 'Added to SABO', color: '#dd514c', expanded: false }, { title: 'Reimbursed', color: '#797a7a', expanded: false }, { title: 'Available', color: '#afafaf', expanded: false } ]); @@ -35,9 +36,9 @@ const FinancePieChart: React.FC = ({ const MIN_PERCENTAGE = 0.05; const data = [ - { name: 'Pending Leadership', value: pendingLeadership }, - { name: 'Pending Finance', value: pendingFinance }, - { name: 'Submitted to SABO', value: submittedToSABO }, + { name: 'Pending Approval', value: pendingApproval }, + { name: 'Approved', value: approved }, + { name: 'Added to SABO', value: addedToSABO }, { name: 'Reimbursed', value: reimbursed }, { name: 'Available', value: available } ]; @@ -73,9 +74,9 @@ const FinancePieChart: React.FC = ({ } const sectionColorMap = new Map([ - ['Pending Leadership', '#562016'], - ['Pending Finance', '#8e3c2d'], - ['Submitted to SABO', '#dd514c'], + ['Pending Approval', '#562016'], + ['Approved', '#8e3c2d'], + ['Added to SABO', '#dd514c'], ['Reimbursed', '#797a7a'], ['Available', '#afafaf'] ]); @@ -171,7 +172,7 @@ const FinancePieChart: React.FC = ({ }} > {data[index].value < 0 - ? `($${Math.abs(data[index].value).toLocaleString()})` + ? `-$${Math.abs(data[index].value).toLocaleString()}` : `$${data[index].value.toLocaleString()}`} )} diff --git a/src/frontend/src/pages/FinancePage/FinanceComponents/ReimbursementRequestInfo.tsx b/src/frontend/src/pages/FinancePage/FinanceComponents/ReimbursementRequestInfo.tsx index c7b878d33a..2aed084fcb 100644 --- a/src/frontend/src/pages/FinancePage/FinanceComponents/ReimbursementRequestInfo.tsx +++ b/src/frontend/src/pages/FinancePage/FinanceComponents/ReimbursementRequestInfo.tsx @@ -1,6 +1,6 @@ import { Box } from '@mui/material'; -import { useLocation, useHistory } from 'react-router-dom'; -import { useState } from 'react'; +import { useLocation, useHistory, useParams } from 'react-router-dom'; +import { useState, useEffect } from 'react'; import { isGuest, ReimbursementRequest } from 'shared'; import { ReimbursementProduct, ReimbursementStatusType } from 'shared'; import { @@ -48,7 +48,12 @@ const ReimbursementRequestInfo = ({ const user = useCurrentUser(); const history = useHistory(); const { pathname } = useLocation(); - const [showSidePage, setShowSidePage] = useState(false); + const { id } = useParams<{ id?: string }>(); + const [showSidePage, setShowSidePage] = useState(!!id); + + useEffect(() => { + if (id) setShowSidePage(true); + }, [id]); const displayedReimbursementRequests = canViewAllReimbursementRequests && currentTab === 1 && allReimbursementRequests diff --git a/src/frontend/src/pages/FinancePage/FinanceComponents/SpendingBar.tsx b/src/frontend/src/pages/FinancePage/FinanceComponents/SpendingBar.tsx index 26ddfa97e7..3717bba242 100644 --- a/src/frontend/src/pages/FinancePage/FinanceComponents/SpendingBar.tsx +++ b/src/frontend/src/pages/FinancePage/FinanceComponents/SpendingBar.tsx @@ -21,10 +21,10 @@ const isAllUppercase = (label: string): boolean => { }; const getTotalMoneySpent = (data: ReimbursementRequestData) => - data.available + data.pendingFinance + data.pendingLeadership + data.reimbursed + data.submittedToSabo; + data.available + data.approved + data.pendingApproval + data.reimbursed + data.addedToSabo; const getTotalMoneySpentNotAvailable = (data: ReimbursementRequestData) => - data.pendingFinance + data.pendingLeadership + data.reimbursed + data.submittedToSabo; + data.approved + data.pendingApproval + data.reimbursed + data.addedToSabo; const transformReimbursementDataToBarData = ( title: string, @@ -96,9 +96,9 @@ const SpendingBar = ({ data, title, edit }: SpendingBarProps) => { datasets: data.flatMap((val, index) => { if (index === hoveredIndex) { return [ - getBarData('Leadership', val.spendingInfo.pendingLeadership + average, '#ef2020', data.length + 4), - getBarData('Finance', val.spendingInfo.pendingFinance + average, '#ef4545', data.length + 4), - getBarData('SABO', val.spendingInfo.submittedToSabo + average, '#efA0A0', data.length + 4), + getBarData('Pending Approval', val.spendingInfo.pendingApproval + average, '#ef2020', data.length + 4), + getBarData('Approved', val.spendingInfo.approved + average, '#ef4545', data.length + 4), + getBarData('Added to SABO', val.spendingInfo.addedToSabo + average, '#efA0A0', data.length + 4), getBarData('Reimbursed', val.spendingInfo.reimbursed + average, grey[800], data.length + 4), getBarData('Available', val.spendingInfo.available + average, grey[500], data.length + 4) ]; diff --git a/src/frontend/src/pages/FinancePage/FinanceDashboard/AdminBalance.tsx b/src/frontend/src/pages/FinancePage/FinanceDashboard/AdminBalance.tsx index 279e8aa37b..fe186cacd6 100644 --- a/src/frontend/src/pages/FinancePage/FinanceDashboard/AdminBalance.tsx +++ b/src/frontend/src/pages/FinancePage/FinanceDashboard/AdminBalance.tsx @@ -59,9 +59,9 @@ const AdminBalance = ({ data }: { data: ReimbursementRequestData[] }) => { {selectedTab === 'total' && ( @@ -70,9 +70,9 @@ const AdminBalance = ({ data }: { data: ReimbursementRequestData[] }) => { @@ -82,9 +82,9 @@ const AdminBalance = ({ data }: { data: ReimbursementRequestData[] }) => { {selectedTab === 'cash' && ( diff --git a/src/frontend/src/pages/FinancePage/FinanceDashboard/GeneralBalance.tsx b/src/frontend/src/pages/FinancePage/FinanceDashboard/GeneralBalance.tsx index 1a9307681d..fb6d5d1bc2 100644 --- a/src/frontend/src/pages/FinancePage/FinanceDashboard/GeneralBalance.tsx +++ b/src/frontend/src/pages/FinancePage/FinanceDashboard/GeneralBalance.tsx @@ -20,9 +20,9 @@ const GeneralBalance = ({ data }: { data: ReimbursementRequestData }) => { diff --git a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/BlockedTaskBarView.tsx b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/BlockedTaskBarView.tsx deleted file mode 100644 index b2401a8ee4..0000000000 --- a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/BlockedTaskBarView.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { - GanttTask, - HighlightTaskComparator, - OnMouseOverOptions, - RequestEventChange -} from '../../../../../utils/gantt.utils'; -import GanttTaskBarDisplay from './GanttTaskBarDisplay'; - -interface BlockedGanttTaskViewProps { - task: GanttTask; - days: Date[]; - getStartCol: (start: Date) => number; - getEndCol: (end: Date) => number; - handleOnMouseOver: (e: React.MouseEvent, task: OnMouseOverOptions) => void; - handleOnMouseLeave: () => void; - onShowChildrenToggle: () => void; - highlightedChange?: RequestEventChange; - highlightTaskComparator: HighlightTaskComparator; - highlightSubtaskComparator: HighlightTaskComparator; -} - -const BlockedGanttTaskView = ({ - task, - days, - getStartCol, - getEndCol, - handleOnMouseOver, - handleOnMouseLeave, - onShowChildrenToggle, - highlightedChange, - highlightSubtaskComparator, - highlightTaskComparator -}: BlockedGanttTaskViewProps) => { - return ( - <> - - {task.blocking.map((child) => { - return ( - - ); - })} - - ); -}; - -export default BlockedGanttTaskView; diff --git a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBar.tsx b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBar.tsx index 4b4533f2d1..0999d23962 100644 --- a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBar.tsx +++ b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBar.tsx @@ -5,9 +5,6 @@ import GanttTaskBarEdit from './GanttTaskBarEdit'; import GanttTaskBarView from './GanttTaskBarView'; -import { ArcherContainer } from 'react-archer'; -import { useRef } from 'react'; -import { ArcherContainerHandle } from 'react-archer/lib/ArcherContainer/ArcherContainer.types'; import { GanttChange, GanttTask, @@ -46,14 +43,11 @@ const GanttTaskBar = ({ highlightSubtaskComparator, highlightTaskComparator }: GanttTaskBarProps) => { - const archerRef = useRef(null); - const getStartCol = (start: Date) => { const startCol = days.findIndex((day) => dateToString(day) === dateToString(getMonday(start))) + 1; return startCol; }; - // if the end date doesn't exist within the timeframe, have it span to the end const getEndCol = (end: Date) => { const endCol = days.findIndex((day) => dateToString(day) === dateToString(getMonday(end))) === -1 @@ -62,45 +56,34 @@ const GanttTaskBar = ({ return endCol; }; - const handleChange = (change: GanttChange) => { - createChange(change); - setTimeout(() => { - if (archerRef.current) { - archerRef.current.refreshScreen(); - } - }, 100); // wait for the change to be added to the state and the DOM to update - }; - return ( - -
- {isEditMode ? ( - - ) : ( - - )} -
-
+
+ {isEditMode ? ( + + ) : ( + + )} +
); }; diff --git a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBarDisplay.tsx b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBarDisplay.tsx index 5e6706e9f1..c9ae3b426c 100644 --- a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBarDisplay.tsx +++ b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartComponents/GanttTaskBar/GanttTaskBarDisplay.tsx @@ -148,7 +148,7 @@ const GanttTaskBarDisplay = ({ }; return ( -
+
{ @@ -54,7 +53,7 @@ const GanttTaskBarView = ({ highlightTaskComparator={highlightTaskComparator} /> - + {task.children.map((child) => { return ( ({ ); })} - {task.blocking.map((blocking) => { - return ( - - ); - })} ); }; diff --git a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartSection.tsx b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartSection.tsx index a42ea71867..b415d3cf9c 100644 --- a/src/frontend/src/pages/GanttPage/GanttChart/GanttChartSection.tsx +++ b/src/frontend/src/pages/GanttPage/GanttChart/GanttChartSection.tsx @@ -15,6 +15,7 @@ import { Box, Typography } from '@mui/material'; import { useState } from 'react'; import GanttTaskBar from './GanttChartComponents/GanttTaskBar/GanttTaskBar'; import GanttToolTip from './GanttChartComponents/GanttToolTip'; +import { ArcherContainer } from 'react-archer'; interface GanttChartSectionProps { start: Date; @@ -64,42 +65,43 @@ const GanttChartSection = ({ }; return tasks.length > 0 ? ( - - - {tasks.map((task) => { - return ( - - onShowChildrenToggle(task)} - onAddTaskPressed={onAddTaskPressed} - showChildren={shouldShowChildren(task)} - highlightedChange={highlightedChange} - highlightSubtaskComparator={highlightSubtaskComparator} - highlightTaskComparator={highlightTaskComparator} - /> - - ); - })} + + + + {tasks.map((task) => { + return ( + + onShowChildrenToggle(task)} + onAddTaskPressed={onAddTaskPressed} + showChildren={shouldShowChildren(task)} + highlightedChange={highlightedChange} + highlightSubtaskComparator={highlightSubtaskComparator} + highlightTaskComparator={highlightTaskComparator} + /> + + ); + })} + + {currentTooltipOptions && ( + + )} - {currentTooltipOptions && ( - - )} - + ) : ( No Projects to Display ); diff --git a/src/frontend/src/pages/GanttPage/ProjectGanttChart/AddGanttProjectModal.tsx b/src/frontend/src/pages/GanttPage/ProjectGanttChart/AddGanttProjectModal.tsx index 5ee5118640..0a6237e727 100644 --- a/src/frontend/src/pages/GanttPage/ProjectGanttChart/AddGanttProjectModal.tsx +++ b/src/frontend/src/pages/GanttPage/ProjectGanttChart/AddGanttProjectModal.tsx @@ -1,6 +1,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; -import { FormControl, FormHelperText, FormLabel } from '@mui/material'; -import { useForm } from 'react-hook-form'; +import { FormControl, FormHelperText, FormLabel, MenuItem, TextField } from '@mui/material'; +import { Controller, useForm } from 'react-hook-form'; +import { Car } from 'shared'; import * as yup from 'yup'; import NERFormModal from '../../../components/NERFormModal'; import ReactHookTextField from '../../../components/ReactHookTextField'; @@ -14,9 +15,10 @@ interface AddGanttProjectModalProps { showModal: boolean; handleClose: () => void; addProject: (project: { name: string; carNumber: number }) => void; + cars: Car[]; } -const AddGanttProjectModal: React.FC = ({ showModal, handleClose, addProject }) => { +const AddGanttProjectModal: React.FC = ({ showModal, handleClose, addProject, cars }) => { const onSubmit = async (data: { name: string; carNumber: number }) => { addProject(data); handleClose(); @@ -40,20 +42,33 @@ const AddGanttProjectModal: React.FC = ({ showModal, open={showModal} onHide={handleClose} title="New Project" - reset={() => reset({ name: '' })} + reset={() => reset({ name: '', carNumber: 0 })} handleUseFormSubmit={handleSubmit} onFormSubmit={onSubmit} formId="new-project-form" showCloseButton + paperProps={{ width: '350px' }} > - + Project Name {errors.name?.message} - - Car Number - + + Car + ( + + {cars?.toReversed().map((car) => ( + + {car.name} + + ))} + + )} + /> {errors.carNumber?.message} diff --git a/src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChartPage.tsx b/src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChartPage.tsx index 4d55984d9e..e38991c484 100644 --- a/src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChartPage.tsx +++ b/src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChartPage.tsx @@ -465,6 +465,7 @@ const ProjectGanttChartPage: FC = () => { toast.error('No Team Selected'); } }} + cars={cars} /> ); }; diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectDetails.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectDetails.tsx index 5cef1c4416..ad4d89815f 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectDetails.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectDetails.tsx @@ -48,13 +48,13 @@ const ProjectDetails: React.FC = ({ project }) => { } const emptyRRData = - rrData.pendingLeadership === 0 && - rrData.pendingFinance === 0 && - rrData.submittedToSabo === 0 && + rrData.pendingApproval === 0 && + rrData.approved === 0 && + rrData.addedToSabo === 0 && rrData.reimbursed === 0 && rrData.available === 0; - const amountUsed = rrData.pendingFinance + rrData.pendingLeadership + rrData.submittedToSabo + rrData.reimbursed; + const amountUsed = rrData.approved + rrData.pendingApproval + rrData.addedToSabo + rrData.reimbursed; const overBudget = project.budget < amountUsed; @@ -130,9 +130,9 @@ const ProjectDetails: React.FC = ({ project }) => { diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectViewContainer.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectViewContainer.tsx index 82ca5e59d7..1a13260a18 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectViewContainer.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/ProjectViewContainer.tsx @@ -34,6 +34,7 @@ import { useGetMaterialsForWbsElement } from '../../../hooks/bom.hooks'; import ChangeRequestTab from '../../../components/ChangeRequestTab'; import PartsReviewPage from './PartReview/PartsReviewPage'; import ActionsMenu from '../../../components/ActionsMenu'; +import ProjectSpendingHistory from '../../ProjectPage/ProjectSpendingHistory'; import { useMyTeamAsHead } from '../../../hooks/teams.hooks'; interface ProjectViewContainerProps { @@ -193,7 +194,8 @@ const ProjectViewContainer: React.FC = ({ project, en { tabUrlValue: 'changes', tabName: 'Changes' }, { tabUrlValue: 'gantt', tabName: 'Gantt' }, { tabUrlValue: 'change-requests', tabName: 'Change Requests' }, - { tabUrlValue: 'parts-review', tabName: 'Parts Review' } + { tabUrlValue: 'parts-review', tabName: 'Parts Review' }, + { tabUrlValue: 'spending', tabName: 'Budget' } ]} baseUrl={`${routes.PROJECTS}/${wbsNum}`} defaultTab="overview" @@ -216,8 +218,10 @@ const ProjectViewContainer: React.FC = ({ project, en ) : tab === 6 ? ( - ) : ( + ) : tab === 7 ? ( + ) : ( + )} {deleteModalShow && ( diff --git a/src/frontend/src/pages/ProjectPage/ProjectSpendingHistory.tsx b/src/frontend/src/pages/ProjectPage/ProjectSpendingHistory.tsx new file mode 100644 index 0000000000..fade088a50 --- /dev/null +++ b/src/frontend/src/pages/ProjectPage/ProjectSpendingHistory.tsx @@ -0,0 +1,247 @@ +import React, { useMemo } from 'react'; +import { Box, Typography, Link, LinearProgress } from '@mui/material'; +import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid'; +import { useAllReimbursementRequests } from '../../hooks/finance.hooks'; +import { useSingleProject } from '../../hooks/projects.hooks'; +import { WbsNumber, ReimbursementRequest, WBSElementData, equalsWbsNumber, ReimbursementStatusType } from 'shared'; +import LoadingIndicator from '../../components/LoadingIndicator'; +import { createReimbursementRequestRowData, cleanReimbursementRequestStatus } from '../../utils/reimbursement-request.utils'; +import NERDataGrid, { MapRowResult } from '../../components/NERDataGrid'; +import { routes } from '../../utils/routes'; +import { fullNamePipe, centsToDollar, datePipe } from '../../utils/pipes'; + +interface ProjectSpendingHistoryProps { + wbsNum: WbsNumber; +} + +const getStatusColor = (status: ReimbursementStatusType): string => { + switch (status) { + case 'REIMBURSED': + return '#549d49'; + case 'DENIED': + return '#dd514c'; + case 'PENDING_FINANCE': + case 'SABO_SUBMITTED': + case 'PENDING_SABO_SUBMISSION': + case 'PENDING_LEADERSHIP_APPROVAL': + case 'LEADERSHIP_APPROVED': + case 'ADVISOR_APPROVED': + return '#997b3e'; + default: + return '#797a7a'; + } +}; + +const columns: GridColDef[] = [ + { + field: 'identifier', + headerName: 'RR #', + flex: 0.4, + minWidth: 80, + renderCell: (params: GridRenderCellParams) => ( + e.stopPropagation()} + > + #{params.value} + + ) + }, + { + field: 'submitter', + headerName: 'Submitter', + flex: 1, + minWidth: 150, + valueGetter: (params: any) => fullNamePipe(params.row.submitter) + }, + { + field: 'products', + headerName: 'Products', + flex: 2, + minWidth: 250, + valueGetter: (params: any) => params.row.reimbursementProducts?.map((p: any) => p.name).join(', ') || 'No products' + }, + { + field: 'dateSubmitted', + headerName: 'Date Submitted', + flex: 0.7, + minWidth: 130, + valueGetter: (params: any) => datePipe(params.row.dateSubmitted) + }, + { + field: 'status', + headerName: 'Status', + flex: 1, + minWidth: 220, + renderCell: (params: GridRenderCellParams) => ( + + {cleanReimbursementRequestStatus(params.value as ReimbursementStatusType)} + + ) + }, + { + field: 'amount', + headerName: 'Total Amount', + flex: 0.5, + minWidth: 110, + valueGetter: (params: any) => `$${centsToDollar(params.row.amount as number)}` + } +]; + +const ProjectSpendingHistory: React.FC = ({ wbsNum }) => { + const { data: allReimbursementRequests, isLoading: rrLoading, isError: rrError } = useAllReimbursementRequests(); + const { data: project, isLoading: projectLoading } = useSingleProject(wbsNum); + + const reimbursementRequests = useMemo(() => { + if (!allReimbursementRequests || !project) return []; + return allReimbursementRequests.filter((rr) => + rr.reimbursementProducts.some((product) => { + const reason = product.reimbursementProductReason; + if ((reason as WBSElementData).wbsNum) { + return equalsWbsNumber((reason as WBSElementData).wbsNum, { ...wbsNum, workPackageNumber: 0 }); + } + return false; + }) + ); + }, [allReimbursementRequests, project, wbsNum]); + + const budgetInfo = useMemo(() => { + if (!project) return null; + const totalBudget = project.budget; // already in dollars + const totalSpent = reimbursementRequests.reduce((sum, rr) => sum + (rr.totalCost || 0), 0) / 100; // cents → dollars + const budgetRemaining = totalBudget - totalSpent; + const budgetUsedPercentage = totalBudget > 0 ? (totalSpent / totalBudget) * 100 : 0; + return { + totalBudget, + totalSpent, + budgetRemaining, + budgetUsedPercentage + }; + }, [project, reimbursementRequests]); + + const mapRow = (rr: ReimbursementRequest): MapRowResult => { + const row = createReimbursementRequestRowData(rr); + return { ...rr, ...row, id: row.id, raw: rr }; + }; + + const isLoading = rrLoading || projectLoading; + + if (isLoading) return ; + if (rrError) return Failed to load spending history.; + if (!reimbursementRequests.length) return No spending history for this project.; + + return ( + + + Spending History + + + {budgetInfo && ( + + + Budget Overview + + + + Spent: ${budgetInfo.totalSpent.toFixed(2)} + + + Budget: ${budgetInfo.totalBudget.toFixed(2)} + + + + 90 + ? '#f44336' + : budgetInfo.budgetUsedPercentage > 75 + ? '#ff9800' + : '#4caf50' + } + }} + /> + + + {budgetInfo.budgetUsedPercentage.toFixed(1)}% used + + + + + = 0 ? '#4caf50' : '#f44336', + fontWeight: 'bold' + }} + > + ${Math.abs(budgetInfo.budgetRemaining).toFixed(2)}{' '} + {budgetInfo.budgetRemaining >= 0 ? 'remaining' : 'over budget'} + + + + )} + + { + const q = term.toLowerCase(); + const r = row as any; + return ( + String(r.identifier).includes(q) || + fullNamePipe(r.submitter).toLowerCase().includes(q) || + (r.reimbursementProducts?.map((p: any) => p.name).join(', ') || '').toLowerCase().includes(q) || + String(r.status).toLowerCase().includes(q) + ); + }} + /> + + ); +}; + +export default ProjectSpendingHistory; diff --git a/src/frontend/src/pages/TeamsPage/TeamSpecificPage.tsx b/src/frontend/src/pages/TeamsPage/TeamSpecificPage.tsx index c59585e967..dd1edefe07 100644 --- a/src/frontend/src/pages/TeamsPage/TeamSpecificPage.tsx +++ b/src/frontend/src/pages/TeamsPage/TeamSpecificPage.tsx @@ -29,7 +29,7 @@ interface ParamTypes { } const getTotalMoneySpent = (data: ReimbursementRequestData) => - data.pendingFinance + data.pendingLeadership + data.reimbursed + data.submittedToSabo; + data.approved + data.pendingApproval + data.reimbursed + data.addedToSabo; const TeamSpecificPage: React.FC = () => { const toast = useToast(); diff --git a/src/frontend/src/tests/test-support/test-data/finance.stubs.ts b/src/frontend/src/tests/test-support/test-data/finance.stubs.ts index 67ca0600a1..81c2ddc827 100644 --- a/src/frontend/src/tests/test-support/test-data/finance.stubs.ts +++ b/src/frontend/src/tests/test-support/test-data/finance.stubs.ts @@ -2,9 +2,9 @@ import { ReimbursementRequestData } from 'shared'; export const exampleRRData: ReimbursementRequestData = { totalBudget: 1000, - pendingLeadership: 200, - pendingFinance: 100, - submittedToSabo: 300, + pendingApproval: 200, + approved: 100, + addedToSabo: 300, reimbursed: 200, available: 200 }; diff --git a/src/frontend/src/utils/calendar.utils.ts b/src/frontend/src/utils/calendar.utils.ts index c3b92c4568..474efc459d 100644 --- a/src/frontend/src/utils/calendar.utils.ts +++ b/src/frontend/src/utils/calendar.utils.ts @@ -4,12 +4,19 @@ import { EventFormValues } from '../pages/CalendarPage/Components/EventModal'; /** * Gets the reason why an event is pending for display purposes. */ +export const getSundayOfWeek = (date: Date): Date => { + const d = new Date(date); + d.setDate(d.getDate() - d.getDay()); + d.setHours(0, 0, 0, 0); + return d; +}; + export const getPendingReason = (event: EventInstance): string | null => { if (event.approved === ConflictStatus.PENDING) { return 'This event has a scheduling conflict and requires approval.'; } else if (event.approved === ConflictStatus.DENIED) { return 'This event was denied due to a scheduling conflict.'; - } else if (event.status === EventStatus.UNCONFIRMED) { + } else if (event.status !== EventStatus.SCHEDULED) { return 'This event is unconfirmed and waiting to be scheduled.'; } return null; @@ -184,8 +191,8 @@ export const eventsToNextEventInstance = (events: Event[]): EventInstance[] => { ...event, scheduledTimes: [ event.scheduledTimes.reduce((acc, current) => { - if (current.startTime < acc.startTime) return acc; - return current; + if ((current.startTime < acc.startTime && current.startTime > now) || acc.startTime < now) return current; + return acc; }) ] })); diff --git a/src/frontend/src/utils/diff-page.utils.ts b/src/frontend/src/utils/diff-page.utils.ts index 08840f6e0a..da13d9fe03 100644 --- a/src/frontend/src/utils/diff-page.utils.ts +++ b/src/frontend/src/utils/diff-page.utils.ts @@ -199,16 +199,16 @@ export const getWbsChanges = ( }; export const getChangesForProject = ( - originalProject: Project, - proposedChanges: ProjectProposedChanges + proposedChanges: ProjectProposedChanges, + originalProject?: Project ): ComparableCollection[] => { const projectLines: ComparableLine[] = [...getWbsChanges(originalProject, proposedChanges)]; projectLines.push( genChange( 'Summary', - originalProject.summary !== proposedChanges.summary, - originalProject.summary, + originalProject?.summary !== proposedChanges.summary, + originalProject ? originalProject.summary : '', proposedChanges.summary ) ); @@ -216,8 +216,8 @@ export const getChangesForProject = ( projectLines.push( genChange( 'Budget', - originalProject.budget !== proposedChanges.budget, - `$${originalProject.budget}`, + originalProject?.budget !== proposedChanges.budget, + originalProject ? `$${originalProject.budget}` : '', `$${proposedChanges.budget}` ) ); @@ -226,9 +226,11 @@ export const getChangesForProject = ( genListChange( 'Teams', '', - originalProject.teams - .map((team) => ({ ...team, value: team.teamName })) - .sort((a, b) => a.teamName.localeCompare(b.teamName)), + originalProject + ? originalProject.teams + .map((team) => ({ ...team, value: team.teamName })) + .sort((a, b) => a.teamName.localeCompare(b.teamName)) + : [], proposedChanges.teams .map((team) => ({ ...team, value: team.teamName })) .sort((a, b) => a.teamName.localeCompare(b.teamName)), @@ -238,7 +240,7 @@ export const getChangesForProject = ( const workPackageCollections: ComparableCollection[] = []; - originalProject.workPackages.forEach((workPackage) => { + originalProject?.workPackages.forEach((workPackage) => { const newWorkPackage = proposedChanges.workPackageProposedChanges.find((wp) => wp.name === workPackage.name); // TODO ideally do this based on something unique, maybe add a reference to original wbsElementid or something this also just doesnt work if the name has changed so... I dont see another way to identify them though if (newWorkPackage) { const workPackageLines = getChangesForWorkPackage(workPackage, newWorkPackage); @@ -253,7 +255,7 @@ export const getChangesForProject = ( workPackageCollections.push(getChangesForWorkPackage(undefined, wp)); }); - return [{ label: originalProject.name, lines: projectLines }, ...workPackageCollections]; + return [{ label: originalProject ? originalProject.name : '', lines: projectLines }, ...workPackageCollections]; }; export const getChangesForWorkPackage = ( diff --git a/src/frontend/src/utils/gantt.utils.tsx b/src/frontend/src/utils/gantt.utils.tsx index 7b3d5465a1..9241d0cabc 100644 --- a/src/frontend/src/utils/gantt.utils.tsx +++ b/src/frontend/src/utils/gantt.utils.tsx @@ -411,7 +411,7 @@ const getBlockingGanttTasks = ( export const transformTaskToGanttTask = (task: T, end: Date): GanttTask => { return { - id: uuidv4(), + id: task.taskId, element: task, name: task.title, @@ -441,7 +441,7 @@ export const transformWorkPackageToGanttTask = ( allWorkPackages: T[] ): GanttTask => { return { - id: uuidv4(), + id: workPackage.id, element: workPackage, name: workPackage.name, @@ -477,7 +477,7 @@ export const transformProjectToGanttTask = ( const taskList = hideTasks ? [] : project.tasks; return { - id: uuidv4(), + id: project.id, element: project, name: project.name, @@ -485,9 +485,7 @@ export const transformProjectToGanttTask = ( end: endDate, blocking: [], children: [ - ...project.workPackages - .filter((workPackage) => workPackage.blockedBy.length === 0) - .map((workPackage) => transformWorkPackageToGanttTask(workPackage, project.workPackages)), + ...project.workPackages.map((workPackage) => transformWorkPackageToGanttTask(workPackage, project.workPackages)), ...taskList.map((task) => transformTaskToGanttTask(task, endDate)) ], overlays: [ diff --git a/src/shared/src/types/finance-types.ts b/src/shared/src/types/finance-types.ts index dcf913caec..bc7168f2c2 100644 --- a/src/shared/src/types/finance-types.ts +++ b/src/shared/src/types/finance-types.ts @@ -40,9 +40,9 @@ export interface SpendingBarData { export interface ReimbursementRequestData { totalBudget: number; - pendingFinance: number; - pendingLeadership: number; - submittedToSabo: number; + approved: number; + pendingApproval: number; + addedToSabo: number; reimbursed: number; available: number; } diff --git a/yarn.lock b/yarn.lock index 813be6d6e3..0d830a9da3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,198 @@ __metadata: languageName: node linkType: hard +"@algolia/abtesting@npm:1.14.2": + version: 1.14.2 + resolution: "@algolia/abtesting@npm:1.14.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 70c56081c26684e8b12cacb292cd2ce8cdc5763dab26bd43449ee11e0788b035786ac87e42684df98adfc783ddd178c0fbcaaf2546b7e162904b0337e7f95bae + languageName: node + linkType: hard + +"@algolia/autocomplete-core@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-core@npm:1.19.2" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": 1.19.2 + "@algolia/autocomplete-shared": 1.19.2 + checksum: a23def50bd74da864dedc1286b954216a8637cff6b836bbc199b4324072ba6db84ec51b562f7983d75144d9be0b17b8cf65ceb8ba1b1255e88eb89244ce5a9bf + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2" + dependencies: + "@algolia/autocomplete-shared": 1.19.2 + peerDependencies: + search-insights: ">= 1 < 3" + checksum: a6e4d14ba86edb12b3006355058b1b674abd3211b5ac9a469f859c900737d8a3257cbad7b399eba087f3153b12dced97ed281c8c0c6f70873528240bfaaae9b5 + languageName: node + linkType: hard + +"@algolia/autocomplete-shared@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-shared@npm:1.19.2" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 34803e0de6b6e08352f46daa9b3e566204dd438f3a84d6dee5c808676d4281504b6cf320a25eaf5e7bd8ab9f7cf47fbd771412872e02349c65bbdaef4580a11a + languageName: node + linkType: hard + +"@algolia/client-abtesting@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-abtesting@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 8050495b02afe5e0ee4471a237e5fa0ca0751d79a5523fe36fed4ab81db7e497ac1e3124ae004a3f18bde5acae1f3277221ebddf2d0a6e3a73ea75f4c6ed93d9 + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-analytics@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 628012079562169eaecb27e93508e93ed103b809f42a1ee6206c2098b6c1639350f72194ddd76b059af2802d39dd166f4ae61188d2646d0bbd22194d39d80302 + languageName: node + linkType: hard + +"@algolia/client-common@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-common@npm:5.48.2" + checksum: 8dd80e5fdbcc23b9619948d5fed6a36091a61d106a3340edc8c0dbf2e20e20b5fdd2874322557f876a01cce788a2093e2515ea868892eb8a9bb84a4e5c81e677 + languageName: node + linkType: hard + +"@algolia/client-insights@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-insights@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 2635e4444ba37409726b7c74ea36f19ea54a13b8f1274d9dce857a060b71b8a2a29210724244d1fd4438a156577e96e1c9bff7fa4bd34a9119ac3390a06ac2e7 + languageName: node + linkType: hard + +"@algolia/client-personalization@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-personalization@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 69cec8e93f2c9350b411ed3de861eccd1055e30f50e4b810cd072de319bd9ddcfa02d41737dd3689267f649cb60eb7b443f3dda1c957044c6b02d735fabd7fa3 + languageName: node + linkType: hard + +"@algolia/client-query-suggestions@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-query-suggestions@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 15abc1a8b94fb2df56f75e0fcf2c504d51a060711f00e5bd7d364529c63956278d83363107068a0bfcb4a7fcb4227d631b2314700bc7e84c04ee76af68e93add + languageName: node + linkType: hard + +"@algolia/client-search@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-search@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 8072d6c0b3176c02f09abfd521f2932d7f826f1b24a835bb29bf0d5486668ca0a5d5f7cb66233f611ab682199035a1a84df7d81cf4ffb75d55b74b05fa7a74ea + languageName: node + linkType: hard + +"@algolia/events@npm:^4.0.1": + version: 4.0.1 + resolution: "@algolia/events@npm:4.0.1" + checksum: 4f63943f4554cfcfed91d8b8c009a49dca192b81056d8c75e532796f64828cd69899852013e81ff3fff07030df8782b9b95c19a3da0845786bdfe22af42442c2 + languageName: node + linkType: hard + +"@algolia/ingestion@npm:1.48.2": + version: 1.48.2 + resolution: "@algolia/ingestion@npm:1.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 84dc3ac1dc01c93a2c410a0d4ede7fed15d095e843da983068440ab47e42a33da40c5982970cb37d6a324993a691a7421ea7fd784c44b40e30dc2513b48adf13 + languageName: node + linkType: hard + +"@algolia/monitoring@npm:1.48.2": + version: 1.48.2 + resolution: "@algolia/monitoring@npm:1.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 4a9692a24ea3ed4517998f942d0c83045bc897158efce3a992ecbb4c00edd134c95116dd089285339b532dd3b6f2dabe4feaf240fbc3221fb7b1eabfd5df0cc8 + languageName: node + linkType: hard + +"@algolia/recommend@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/recommend@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: f1fa8d251ac847fc3ab9b20c536b7ed357e30a6268c5934fa4ed8facfc0f6b210908f8236773a95bbaf98258fc98b732d15686dd1d908ca6912ab4266c7e7341 + languageName: node + linkType: hard + +"@algolia/requester-browser-xhr@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-browser-xhr@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + checksum: da9d0986257c9aed91d0a3124e21f6f78024f753e49cc202192ac870029ba41c638660ed6e467bde44d3cc07e93ff0374088b5e7e02031dd8289e5cd12c7c637 + languageName: node + linkType: hard + +"@algolia/requester-fetch@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-fetch@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + checksum: 779da5a1a00267ae865868634f15bc2b9f3c97e9c96a3b3c900bc99cecc914b926c9300fc373f9ff0787ca83a7a0dfc51a61cbc8b7f63cfdc52d610ecf8b8172 + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-node-http@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + checksum: 7f7b0f762dabc1acc6017171c14859915038ab7c8260a0d1c128212fc0c1f2c1e8d56401c751bb4f3f9b343132dbc451abad2a9b322d3216b10c4887fb5c5526 + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -552,6 +744,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": ^7.28.5 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 39f5b303757e4d63bbff8133e251094cd4f952b46e3fa9febc7368d907583911d6a1eded6090876dc1feeff5cf6e134fb19b706f8d58d26c5402cd50e5e1aeb2 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.6": version: 7.28.6 resolution: "@babel/compat-data@npm:7.28.6" @@ -559,6 +762,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/compat-data@npm:7.29.0" + checksum: ad19db279dfd06cbe91b505d03be00d603c6d3fcc141cfc14f4ace5c558193e9b6aae4788cb01fd209c4c850e52d73c8f3c247680e3c0d84fa17ab8b3d50c808 + languageName: node + linkType: hard + "@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.20.5, @babel/core@npm:^7.28.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": version: 7.28.6 resolution: "@babel/core@npm:7.28.6" @@ -582,6 +792,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helpers": ^7.28.6 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/remapping": ^2.3.5 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 85e1df6e213382c46dee27bcd07ed9202fa108a85bb74eb37be656308fd949349171ad2aa17cc84cf0720c908dc9ea6309d25e64d2a7fcdaa63721ce0c67c10b + languageName: node + linkType: hard + "@babel/eslint-parser@npm:^7.16.3": version: 7.28.6 resolution: "@babel/eslint-parser@npm:7.28.6" @@ -596,6 +829,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" + dependencies: + "@babel/parser": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 + jsesc: ^3.0.2 + checksum: d8e6863b2d04f684e65ad72731049ac7d754d3a3d1a67cdfc20807b109ba3180ed90d7ccef58ce5d38ded2eaeb71983a76c711eecb9b6266118262378f6c7226 + languageName: node + linkType: hard + "@babel/generator@npm:^7.28.6, @babel/generator@npm:^7.7.2": version: 7.28.6 resolution: "@babel/generator@npm:7.28.6" @@ -676,6 +922,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.6.6": + version: 0.6.6 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.6" + dependencies: + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + debug: ^4.4.3 + lodash.debounce: ^4.0.8 + resolve: ^1.22.11 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 582efe522e7ef75228f7eeea63fd659567ce865365e3d4b9d94451825114a7f1c8b61791bbbf134aa1b2aa6ee37620b145e74879dace7568107057180153e72e + languageName: node + linkType: hard + "@babel/helper-globals@npm:^7.28.0": version: 7.28.0 resolution: "@babel/helper-globals@npm:7.28.0" @@ -833,6 +1094,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" + dependencies: + "@babel/types": ^7.29.0 + bin: + parser: ./bin/babel-parser.js + checksum: b4a1bd3cf46712e439286db9a4105dfa741b5a7720fa1f38f33719cf4f1da9df9fc5b6686128890bd6a62debba287d8d472af153dd629fd4a0a44fe55413cd68 + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": version: 7.28.5 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" @@ -1044,6 +1316,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd + languageName: node + linkType: hard + "@babel/plugin-syntax-flow@npm:^7.27.1": version: 7.28.6 resolution: "@babel/plugin-syntax-flow@npm:7.28.6" @@ -1245,6 +1528,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-remap-async-to-generator": ^7.27.1 + "@babel/traverse": ^7.29.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bd549b54283034dd3e2f6c4b41b99a0caba0ddc8e9418490a611136ddb01e62235f14b233fcc172902fd1d18eec6e029245d22212566ea5cb5e24c7450d6005d + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" @@ -1379,6 +1675,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7fa7b773259a578c9e01c80946f75ecc074520064aa7a87a65db06c7df70766e2fa6be78cda55fa9418a14e30b2b9d595484a46db48074d495d9f877a4276065 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" @@ -1543,6 +1851,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" + dependencies: + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.29.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 36fd7bcd694549effdbdf733c32f0c9dbadea052316ff5e0830b07482a60c8ff1ee79850efff05e8046c4b99c241832f2c5267e0ae7c721c531c8ef12930c4b9 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" @@ -1567,6 +1889,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ed8c27699ca82a6c01cbfd39f3de16b90cfea4f8146a358057f76df290d308a66a8bd2e6734e6a87f68c18576e15d2d70548a84cd474d26fdf256c3f5ae44d8c + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-new-target@npm:7.27.1" @@ -1708,7 +2042,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.12.1": +"@babel/plugin-transform-react-constant-elements@npm:^7.12.1, @babel/plugin-transform-react-constant-elements@npm:^7.21.3": version: 7.27.1 resolution: "@babel/plugin-transform-react-constant-elements@npm:7.27.1" dependencies: @@ -1801,6 +2135,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f48bc814f11239f2bfe010a6e29d5ac2443e7b1d8004e7c022effa111b743491127acf8644cfef475edb86b91f123829585867bc13762652aabd9b85ed6ce61e + languageName: node + linkType: hard + "@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" @@ -1840,6 +2185,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-runtime@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/plugin-transform-runtime@npm:7.29.0" + dependencies: + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + babel-plugin-polyfill-corejs2: ^0.4.14 + babel-plugin-polyfill-corejs3: ^0.13.0 + babel-plugin-polyfill-regenerator: ^0.6.5 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1d3a5951396469372d954538fb188479b86afa8e02ca541da8f123250aaed8df65573b68f67087f4b15a5ccff9abc3a3fdb1d9a07fbb85bfcb807168d7364a37 + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" @@ -2038,6 +2399,86 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/preset-env@npm:7.29.0" + dependencies: + "@babel/compat-data": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.28.5 + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.27.1 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.27.1 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.27.1 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.28.6 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 + "@babel/plugin-syntax-import-assertions": ^7.28.6 + "@babel/plugin-syntax-import-attributes": ^7.28.6 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.27.1 + "@babel/plugin-transform-async-generator-functions": ^7.29.0 + "@babel/plugin-transform-async-to-generator": ^7.28.6 + "@babel/plugin-transform-block-scoped-functions": ^7.27.1 + "@babel/plugin-transform-block-scoping": ^7.28.6 + "@babel/plugin-transform-class-properties": ^7.28.6 + "@babel/plugin-transform-class-static-block": ^7.28.6 + "@babel/plugin-transform-classes": ^7.28.6 + "@babel/plugin-transform-computed-properties": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + "@babel/plugin-transform-dotall-regex": ^7.28.6 + "@babel/plugin-transform-duplicate-keys": ^7.27.1 + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-dynamic-import": ^7.27.1 + "@babel/plugin-transform-explicit-resource-management": ^7.28.6 + "@babel/plugin-transform-exponentiation-operator": ^7.28.6 + "@babel/plugin-transform-export-namespace-from": ^7.27.1 + "@babel/plugin-transform-for-of": ^7.27.1 + "@babel/plugin-transform-function-name": ^7.27.1 + "@babel/plugin-transform-json-strings": ^7.28.6 + "@babel/plugin-transform-literals": ^7.27.1 + "@babel/plugin-transform-logical-assignment-operators": ^7.28.6 + "@babel/plugin-transform-member-expression-literals": ^7.27.1 + "@babel/plugin-transform-modules-amd": ^7.27.1 + "@babel/plugin-transform-modules-commonjs": ^7.28.6 + "@babel/plugin-transform-modules-systemjs": ^7.29.0 + "@babel/plugin-transform-modules-umd": ^7.27.1 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-new-target": ^7.27.1 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.28.6 + "@babel/plugin-transform-numeric-separator": ^7.28.6 + "@babel/plugin-transform-object-rest-spread": ^7.28.6 + "@babel/plugin-transform-object-super": ^7.27.1 + "@babel/plugin-transform-optional-catch-binding": ^7.28.6 + "@babel/plugin-transform-optional-chaining": ^7.28.6 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/plugin-transform-private-methods": ^7.28.6 + "@babel/plugin-transform-private-property-in-object": ^7.28.6 + "@babel/plugin-transform-property-literals": ^7.27.1 + "@babel/plugin-transform-regenerator": ^7.29.0 + "@babel/plugin-transform-regexp-modifiers": ^7.28.6 + "@babel/plugin-transform-reserved-words": ^7.27.1 + "@babel/plugin-transform-shorthand-properties": ^7.27.1 + "@babel/plugin-transform-spread": ^7.28.6 + "@babel/plugin-transform-sticky-regex": ^7.27.1 + "@babel/plugin-transform-template-literals": ^7.27.1 + "@babel/plugin-transform-typeof-symbol": ^7.27.1 + "@babel/plugin-transform-unicode-escapes": ^7.27.1 + "@babel/plugin-transform-unicode-property-regex": ^7.28.6 + "@babel/plugin-transform-unicode-regex": ^7.27.1 + "@babel/plugin-transform-unicode-sets-regex": ^7.28.6 + "@babel/preset-modules": 0.1.6-no-external-plugins + babel-plugin-polyfill-corejs2: ^0.4.15 + babel-plugin-polyfill-corejs3: ^0.14.0 + babel-plugin-polyfill-regenerator: ^0.6.6 + core-js-compat: ^3.48.0 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 740eb61714f3671adde2ae4066c708837587b0f30ddee7fbf6c85ea5a3823f5dd08413b1ee5fcb1abf26ec6d7e31060bae065d7032d3a2f62a43c80232bb54e9 + languageName: node + linkType: hard + "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -2051,7 +2492,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.16.0, @babel/preset-react@npm:^7.18.6": +"@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.16.0, @babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.25.9": version: 7.28.5 resolution: "@babel/preset-react@npm:7.28.5" dependencies: @@ -2067,7 +2508,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.16.0, @babel/preset-typescript@npm:^7.18.6": +"@babel/preset-typescript@npm:^7.16.0, @babel/preset-typescript@npm:^7.18.6, @babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9": version: 7.28.5 resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: @@ -2082,7 +2523,16 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.25.7, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.28.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.7": +"@babel/runtime-corejs3@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/runtime-corejs3@npm:7.29.0" + dependencies: + core-js-pure: ^3.48.0 + checksum: b892c0ffbc3e06a5b67da2002452768f184f60e24817f8472b2e1cc1e8499f3a47e6e4c20fe5568dad25419fead4954a30a015c6c80e9b1e88120d1a10b7f684 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.25.7, @babel/runtime@npm:^7.25.9, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.28.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.7": version: 7.28.6 resolution: "@babel/runtime@npm:7.28.6" checksum: 42d8a868c2fc2e9a77927945a6daa7ec03c7ea49e611e0d15442933cdabb12f20e3a6849c729259076c10a4247adec229331d1f94c2d0073ea0979d7853e29fd @@ -2100,6 +2550,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + debug: ^4.3.1 + checksum: fbb5085aa525b5d4ecd9fe2f5885d88413fff6ad9c0fac244c37f96069b6d3af9ce825750cd16af1d97d26fa3d354b38dbbdb5f31430e0d99ed89660ab65430e + languageName: node + linkType: hard + "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.7.2": version: 7.28.6 resolution: "@babel/traverse@npm:7.28.6" @@ -2125,6 +2590,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" + dependencies: + "@babel/helper-string-parser": ^7.27.1 + "@babel/helper-validator-identifier": ^7.28.5 + checksum: 83f190438e94c22b2574aaeef7501830311ef266eaabfb06523409f64e2fe855e522951607085d71cad286719adef14e1ba37b671f334a7cd25b0f8506a01e0b + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2132,6 +2607,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -2141,6 +2623,72 @@ __metadata: languageName: node linkType: hard +"@csstools/cascade-layer-name-parser@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.5" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: fb26ae1db6f7a71ee0c3fdaea89f5325f88d7a0b2505fcf4b75e94f2c816ef1edb2961eecbc397df06f67d696ccc6bc99588ea9ee07dd7632bf10febf6b67ed9 + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 2b1cef009309c30c6e6e904d259e809761a8482fe262b000dacc159d94bcd982d59d85baea449de0fd57afc98b7fc19561ffe756d2b679d56a39c48c2b9c556a + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: b833d1a031dfb3e3268655aa384121b864fce9bad05f111a3cf2a343eed69ba5d723f3f7cd0793fd7b7a28de2f8141f94568828f48de41d86cefa452eee06390 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" + dependencies: + "@csstools/color-helpers": ^5.1.0 + "@csstools/css-calc": ^2.1.4 + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 615d825fc7b231e9ba048b4688f15f721423caf2a7be282d910445de30b558efb0f0294557e5a1a7401eefdfcc6c01c89b842fa7835d6872a3e06967dbaabc49 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.4 + checksum: 80647139574431071e4664ad3c3e141deef4368f0ca536a63b3872487db68cf0d908fb76000f967deb1866963a90e6357fc6b9b00fdfa032f3321cebfcc66cd7 + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: adc6681d3a0d7a75dc8e5ee0488c99ad4509e4810ae45dd6549a2e64a996e8d75512e70bb244778dc0c6ee85723e20eaeea8c083bf65b51eb19034e182554243 + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/media-query-list-parser@npm:4.0.3" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: dd7dc015a94e0832e5289794f6ab730d1c3fdc85fbd92433eb608dceb91e4977d345c08fe90c487359ce3ba39185fe15789d09c321c799f5c18c6aec7bd8da09 + languageName: node + linkType: hard + "@csstools/normalize.css@npm:*": version: 12.1.1 resolution: "@csstools/normalize.css@npm:12.1.1" @@ -2148,6 +2696,21 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-alpha-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-alpha-function@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 40dfd418eb36fe87500769e2ee31717fc549eced3152966a4a5b4121e657a9846d14ef9bffee4faa3298a362d85af2684c3a4fea31bbca785205e7bfecbb94dc + languageName: node + linkType: hard + "@csstools/postcss-cascade-layers@npm:^1.1.1": version: 1.1.1 resolution: "@csstools/postcss-cascade-layers@npm:1.1.1" @@ -2160,6 +2723,33 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-cascade-layers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.2" + dependencies: + "@csstools/selector-specificity": ^5.0.0 + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 597f93addd18bf0cf56b744681da6028edfba66192198f492fb37f13f87bdddce8c2da7b2dd1fa67a4ec9dfd076b55ff6d3635523df1a937767c6a12abb28b7a + languageName: node + linkType: hard + +"@csstools/postcss-color-function-display-p3-linear@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-color-function-display-p3-linear@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 10b1b098d66314d287cca728c601c6905017769a31dd27488da49922937476a22eb280232e4b1df352b4f76158994dc18607cfc7b565d83346746795cb3f7844 + languageName: node + linkType: hard + "@csstools/postcss-color-function@npm:^1.1.1": version: 1.1.1 resolution: "@csstools/postcss-color-function@npm:1.1.1" @@ -2172,6 +2762,93 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-color-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-color-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: b13563a097966f9f670544e7f76abe8d170a59d09c5e7bd26533daf5b6bffcc74a82e694d5d970326299b5fa70c52972d9aeabe5dbd2fd90a3322668d4aa3e74 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: f4ac11b913860e919fc325e817ba1dd7fa2740d6a86eb2abe92013ac8173fa4efb697f6ccffa3178526fa9ed6274ce654bf278adc86effa62dd1f5adf16e2f7c + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.2": + version: 1.0.2 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.2" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: a38642b7020589ffc684f0f4c76a2e59a8d6dc75f55036a06c9e8a109c55245234c9fb50eae6f2b97b0046591767af922d0a089a8a0c742372cf4935411f5e5c + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^2.0.8": + version: 2.0.8 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.8" + dependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: a69e1daf2fddd4cfb46806a7e5888b9138d498e173b15040d27d963a3d66aaaed9097a780291229e5dafaf8292443b4adcb329d4f1a4fb7d3f04ef2edd798c12 + languageName: node + linkType: hard + +"@csstools/postcss-contrast-color-function@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-contrast-color-function@npm:2.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: ac8fed35786d6e4c077d34b023a72278e29a5cef90ee834df273ce0197fcee9848b3d40046bfff37959f42c7cfb4f14ffac1b58a86d87a80c1759a9300db7c49 + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.9" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: 80d5847d747fc67c32ee3ba49f9c9290654fb086c58b2f13256b14124b7349dac68ba8e107f631248cef2448ca57ef18adbbbc816dd63a54ba91826345373f39 + languageName: node + linkType: hard + "@csstools/postcss-font-format-keywords@npm:^1.0.1": version: 1.0.1 resolution: "@csstools/postcss-font-format-keywords@npm:1.0.1" @@ -2183,6 +2860,46 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-font-format-keywords@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" + dependencies: + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 63091d4748cfc5a51e3c288cd620f058a4e776ba15da6180edaee94aaad9c4e92076f575d064dabc00b28966b33dd1e59f84a6ca6a66aed59556ef92a0dfed45 + languageName: node + linkType: hard + +"@csstools/postcss-gamut-mapping@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.11" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: be4cb5a14eef78acbd9dfca7cdad0ab4e8e4a11c9e8bbb27e427bfd276fd5d3aa37bc1bf36deb040d404398989a3123bd70fc51be970c4d944cf6a18d231c1b8 + languageName: node + linkType: hard + +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.12": + version: 5.0.12 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 30c7f45fc8e99a46eaf739380fdc632adb4d53702c5eaa654591bcd9ef0b40f443093933c5f92c6eaa73eaee8bd70f1e7e82c62b9623207481a4bae1075ea797 + languageName: node + linkType: hard + "@csstools/postcss-hwb-function@npm:^1.0.2": version: 1.0.2 resolution: "@csstools/postcss-hwb-function@npm:1.0.2" @@ -2194,6 +2911,21 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-hwb-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-hwb-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 8e37a45cffa9458466fa9a05a0926ea1579e6b21501c59bb464282481f41a2694f45343e85d37da744a36a99a4ceb3e263aeca46ea5fcfb8a12a5558cc11efaa + languageName: node + linkType: hard + "@csstools/postcss-ic-unit@npm:^1.0.1": version: 1.0.1 resolution: "@csstools/postcss-ic-unit@npm:1.0.1" @@ -2206,6 +2938,28 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-ic-unit@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-ic-unit@npm:4.0.4" + dependencies: + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 3bbdbba983686b9e12a5bbf36bb2ba823a6426efb9369ca415e342c37136e041929fcafacb6fa113a06a117c22785098707c91dbf306446e66618c7881553324 + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-initial@npm:2.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 914e9f56faf4e69757b0c905c4808dd39b1de30d151db5817da04510b89cb19b570a405ac2ca070941a42d5ce3f48682329de5ac21ac76416a0a98fee2de2d0d + languageName: node + linkType: hard + "@csstools/postcss-is-pseudo-class@npm:^2.0.7": version: 2.0.7 resolution: "@csstools/postcss-is-pseudo-class@npm:2.0.7" @@ -2218,6 +2972,109 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-is-pseudo-class@npm:^5.0.3": + version: 5.0.3 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.3" + dependencies: + "@csstools/selector-specificity": ^5.0.0 + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 60474c5d651bd4dd940c2727d71b235390fb631fc347d0b29f92f7d29cf812e6c796284eeb9206441bfcd00b778068a2fadc465262a4752310b2f9abbc432973 + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.11" + dependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 52fa6464e31d4815557ef9bcff0a94a89549bcf1ccb4ffcc51478a5fa01815311fb2b52b96e3f671c64da8493fb50d3fc235cbfcec797f685dcccb4133dc09c4 + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 793d9a89c28d4809a83b6111d321f60947a59f119d61046e5c4023ce2caedbb221298e69b6df38995e51b763545807db7b03da47e47461622f32928fec92b65f + languageName: node + linkType: hard + +"@csstools/postcss-logical-overflow@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: bf73ea1d7754f59773af5a7b434e9eaa2ce05c8fe7aa26a726dce8f2a42abb0f5686fbf9672d25912250226174c35f2c5737ca072d21f8b68420500b7449fe58 + languageName: node + linkType: hard + +"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: bf043fdad02b9578fc2dcddb409b014a15dee65a9813ceb583237dff1caf807e18101f68bde2b0d8b685139d823114ab8deed6da3027878d11a945755824d3b1 + languageName: node + linkType: hard + +"@csstools/postcss-logical-resize@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-resize@npm:3.0.0" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 3be1133a9ac27e0a0d73b19d573adc00ad78a697522eaf6c9de90260882ba8ff0904c7ab3e68379ee7724e28661c4b497cb665e258214bc8355f4a0d91021c46 + languageName: node + linkType: hard + +"@csstools/postcss-logical-viewport-units@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.4" + dependencies: + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: ddb8d9b473c55cce1c1261652d657d33d9306d80112eac578d53b05dd48a5607ea2064fcf6bc298ccc1e63143e11517d35230bad6063dae14d445530c45a81ec + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-media-minmax@npm:2.0.9" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/media-query-list-parser": ^4.0.3 + peerDependencies: + postcss: ^8.4 + checksum: 24da18a5a41daef2ea4cf7d85f459b5b425085501324a3f0546309ba13f682ab57d9aabc4e639a724cd1d91a0ead046b9ab8164adad31d89c9e39ca918f5494b + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.5" + dependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/media-query-list-parser": ^4.0.3 + peerDependencies: + postcss: ^8.4 + checksum: 5a316f59c3d422eef942d01c4007d14fad8f85ce85efce080a90d8d3eb3257dc6fcce612c5ee57cf4665993a03bc5ccb538dac8e25041242ecf74f5c348a3c5a + languageName: node + linkType: hard + "@csstools/postcss-nested-calc@npm:^1.0.0": version: 1.0.0 resolution: "@csstools/postcss-nested-calc@npm:1.0.0" @@ -2229,6 +3086,18 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-nested-calc@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-nested-calc@npm:4.0.0" + dependencies: + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: f334861687d7e3a4b9c26940e767a06f07e0095cab405a5b086fca407d6f743c57b552d4504ba7d5b1700a97da3507a41bf3bc2d126a26028b79f96ea38b6af5 + languageName: node + linkType: hard + "@csstools/postcss-normalize-display-values@npm:^1.0.1": version: 1.0.1 resolution: "@csstools/postcss-normalize-display-values@npm:1.0.1" @@ -2240,6 +3109,17 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-normalize-display-values@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.1" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 46138f696ddadc0777dc66e97ff3a5f5a4dfa4f25ac396590b22df66dcc46d335c19af4fb4468e35472e1379ff180c858839c3ad51e7763ba3f9d898b00fb8a1 + languageName: node + linkType: hard + "@csstools/postcss-oklab-function@npm:^1.1.1": version: 1.1.1 resolution: "@csstools/postcss-oklab-function@npm:1.1.1" @@ -2252,6 +3132,30 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-oklab-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-oklab-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 28b07370bc66ef05b0311e25832bad43dd4835f4e97025162ab42b9172f8e38c5dddfcc599058c8304c654b161d6366935d5be2bae4c77e7251bedba664b8ea9 + languageName: node + linkType: hard + +"@csstools/postcss-position-area-property@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-position-area-property@npm:1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 50f1274b8f88d89d90494f7511c2d34736ccc6f48ce650efe85772fb1a355c98bc41b749ba6c7129de24a26536c77166a850a912b650c9c6781665ed9e85321e + languageName: node + linkType: hard + "@csstools/postcss-progressive-custom-properties@npm:^1.1.0, @csstools/postcss-progressive-custom-properties@npm:^1.3.0": version: 1.3.0 resolution: "@csstools/postcss-progressive-custom-properties@npm:1.3.0" @@ -2263,9 +3167,84 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-stepped-value-functions@npm:1.0.1" +"@csstools/postcss-progressive-custom-properties@npm:^4.2.1": + version: 4.2.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.2.1" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: c63b6b3621856c113189276c5f6bd3d77c16d9a9e64609fcdf38f46700492a79b91a25933cb60991ee525ae492fb6d2073a07a18a5391148e3eedc18b8c97013 + languageName: node + linkType: hard + +"@csstools/postcss-property-rule-prelude-list@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-property-rule-prelude-list@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: f915cef138a8a96d256a47c6c317456d3d31d516777bc3d556ad8276a2d919405cc24781c91e4c629f2bf009e79be84f38cf62ac73fe94edd7bf61d4b2c7cf93 + languageName: node + linkType: hard + +"@csstools/postcss-random-function@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-random-function@npm:2.0.1" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: d421a790b11675edf493f3e48259636beca164c494ed2883042118b35674d26f04e1a46f9e89203a179e20acc2a1f5912078ec81b330a2c1a1abef7e7387e587 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 7c6b5671268c1e30e8f113305c362d567010a0164e2b573a4d878289d5e79ab390d95975375a4c1ab577a1075d244bf242a411c4ca7ecc395546664d59becc0b + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 043667ad54b3a26e619d6c16129c1f4d8f8c7cd1c52443475aa7782dbc411390c23bd2fe41ea9c6a3f280594abbcdd9d4117a3d7c27cd2a77e31e6fd11e29fc0 + languageName: node + linkType: hard + +"@csstools/postcss-sign-functions@npm:^1.1.4": + version: 1.1.4 + resolution: "@csstools/postcss-sign-functions@npm:1.1.4" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: 0afcb008142a0a41df51267d79cf950f4f314394dca7c041e3a0be87df56517ac5400861630a979b5bef49f01c296025106622110384039e3c8f82802d6adcde + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-stepped-value-functions@npm:1.0.1" dependencies: postcss-value-parser: ^4.2.0 peerDependencies: @@ -2274,6 +3253,42 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-stepped-value-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: 6465a883be42d4cc4a4e83be2626a1351de4bfe84a63641c53e7c39d3c0e109152489ca2d8235625cdf6726341c676b9fbbca18fe80bb5eae8d488a0e42fc5e4 + languageName: node + linkType: hard + +"@csstools/postcss-syntax-descriptor-syntax-production@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-syntax-descriptor-syntax-production@npm:1.0.1" + dependencies: + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: d0216cf3cd0b86203c5927cb211500543dec498d6d91b393caaa1df82af7dd7570a477a9a829ab15341ef812e341a7b34193f204a18c10e571b6da8df14c2127 + languageName: node + linkType: hard + +"@csstools/postcss-system-ui-font-family@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-system-ui-font-family@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: 6e2eed873ce887e3e3cec8d36d48fb71ef68b9995275ba008b3d5538ce63704eb4c9d4b1bd8e4a9e6d605116d7658a64557abbca7858069c7e81ea386433b8f9 + languageName: node + linkType: hard + "@csstools/postcss-text-decoration-shorthand@npm:^1.0.0": version: 1.0.0 resolution: "@csstools/postcss-text-decoration-shorthand@npm:1.0.0" @@ -2285,6 +3300,18 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.3" + dependencies: + "@csstools/color-helpers": ^5.1.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: afc350e389bae7fdceecb3876b9be00bdbd56e5f43054f9f5de2d42b3c55a163e5ba737212030479389c9c1fca5d066f5b051da1fdf72e13191a035d2cc6f4e0 + languageName: node + linkType: hard + "@csstools/postcss-trigonometric-functions@npm:^1.0.2": version: 1.0.2 resolution: "@csstools/postcss-trigonometric-functions@npm:1.0.2" @@ -2296,6 +3323,19 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-trigonometric-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": ^2.1.4 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + peerDependencies: + postcss: ^8.4 + checksum: c746cd986df061a87de4f2d0129aa2d2e98a2948e5005fe6fe419a9e9ec7a0f7382461847cbd3f67f8f66169bdf23a1d7f53ca6b9922ddd235ec45f2867a8825 + languageName: node + linkType: hard + "@csstools/postcss-unset-value@npm:^1.0.2": version: 1.0.2 resolution: "@csstools/postcss-unset-value@npm:1.0.2" @@ -2305,6 +3345,24 @@ __metadata: languageName: node linkType: hard +"@csstools/postcss-unset-value@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-unset-value@npm:4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 3d194feea11f80ba82e19733d1531546abeba0af9fe6fc105acdf10452d699661da4e1bce45101f90bcb624a30570e469cee945c5a62b9ffe1445959a0b782d1 + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/selector-resolve-nested@npm:3.1.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: eaad6a6c99345cae2849a2c73daf53381fabd75851eefd830ee743e4d454d4e2930aa99c8b9e651fed92b9a8361f352c6c754abf82c576bba4953f1e59c927e9 + languageName: node + linkType: hard + "@csstools/selector-specificity@npm:^2.0.0, @csstools/selector-specificity@npm:^2.0.2": version: 2.2.0 resolution: "@csstools/selector-specificity@npm:2.2.0" @@ -2314,6 +3372,664 @@ __metadata: languageName: node linkType: hard +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 8df1a01a1fa52b66c7ba0286e1c77d1faff45009876f09ddcac542a1c4bca9f34ee92a10acf056b8e7b7ac93679c1635496c6cdfd7d88dbaff2b6afd1eb823ec + languageName: node + linkType: hard + +"@csstools/utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/utilities@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: c9c8d82063ec5156d56b056c9124fed95714f05d7c1a64043174b0559aa099989f17a826579f22045384defe152e32d6355b7a9660cfed96819f43fccf277941 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:0.5.7": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@docsearch/core@npm:4.6.0": + version: 4.6.0 + resolution: "@docsearch/core@npm:4.6.0" + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 1f33cac1c46d87b6d6f91ee8ad1621f8f75fa7a0f11b4a9e45b1f9003ecd2077feaf10fd5400b1dc83d0adf5b302acc27106cb68cd991f2d4f43525ab28783fd + languageName: node + linkType: hard + +"@docsearch/css@npm:4.6.0": + version: 4.6.0 + resolution: "@docsearch/css@npm:4.6.0" + checksum: d9874a4ca6e5288d0df6ea14379c2d76f3e2ffd6bbba708757bdd49dd756f5c491c65edc454fcd7cef843effeda67d3d1df55b6e97505e36a55a1c7c3695771f + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.9.0 || ^4.1.0": + version: 4.6.0 + resolution: "@docsearch/react@npm:4.6.0" + dependencies: + "@algolia/autocomplete-core": 1.19.2 + "@docsearch/core": 4.6.0 + "@docsearch/css": 4.6.0 + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + search-insights: ">= 1 < 3" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + checksum: 9292967307e7b0a3597b5ed635e27c1c71e885ce2c51556f85a8097da02e5bc53e435e2b4e2d736f60f45701e8c725c36c909064230a798adf3bc34f0f20c1f9 + languageName: node + linkType: hard + +"@docusaurus/babel@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/babel@npm:3.9.2" + dependencies: + "@babel/core": ^7.25.9 + "@babel/generator": ^7.25.9 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/plugin-transform-runtime": ^7.25.9 + "@babel/preset-env": ^7.25.9 + "@babel/preset-react": ^7.25.9 + "@babel/preset-typescript": ^7.25.9 + "@babel/runtime": ^7.25.9 + "@babel/runtime-corejs3": ^7.25.9 + "@babel/traverse": ^7.25.9 + "@docusaurus/logger": 3.9.2 + "@docusaurus/utils": 3.9.2 + babel-plugin-dynamic-import-node: ^2.3.3 + fs-extra: ^11.1.1 + tslib: ^2.6.0 + checksum: eb5297a761a9cab946f21b90dc6187531cf9ddeff8a563318b7510ff1460d341241bbae82980401c6e4caca70c1ce498c2269369fa22ffbf4329b5b90efa4e01 + languageName: node + linkType: hard + +"@docusaurus/bundler@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/bundler@npm:3.9.2" + dependencies: + "@babel/core": ^7.25.9 + "@docusaurus/babel": 3.9.2 + "@docusaurus/cssnano-preset": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + babel-loader: ^9.2.1 + clean-css: ^5.3.3 + copy-webpack-plugin: ^11.0.0 + css-loader: ^6.11.0 + css-minimizer-webpack-plugin: ^5.0.1 + cssnano: ^6.1.2 + file-loader: ^6.2.0 + html-minifier-terser: ^7.2.0 + mini-css-extract-plugin: ^2.9.2 + null-loader: ^4.0.1 + postcss: ^8.5.4 + postcss-loader: ^7.3.4 + postcss-preset-env: ^10.2.1 + terser-webpack-plugin: ^5.3.9 + tslib: ^2.6.0 + url-loader: ^4.1.1 + webpack: ^5.95.0 + webpackbar: ^6.0.1 + peerDependencies: + "@docusaurus/faster": "*" + peerDependenciesMeta: + "@docusaurus/faster": + optional: true + checksum: 4ee95ff8bd61962649554e0847c0fcd0ead1bbe43cbd8d4bbb3e258a668e8789bdf4aa268619b8c41ad9e8b0da68874d1422720128fb7d603d073eb88d37bea6 + languageName: node + linkType: hard + +"@docusaurus/core@npm:3.9.2, @docusaurus/core@npm:^3.1.0": + version: 3.9.2 + resolution: "@docusaurus/core@npm:3.9.2" + dependencies: + "@docusaurus/babel": 3.9.2 + "@docusaurus/bundler": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + boxen: ^6.2.1 + chalk: ^4.1.2 + chokidar: ^3.5.3 + cli-table3: ^0.6.3 + combine-promises: ^1.1.0 + commander: ^5.1.0 + core-js: ^3.31.1 + detect-port: ^1.5.1 + escape-html: ^1.0.3 + eta: ^2.2.0 + eval: ^0.1.8 + execa: 5.1.1 + fs-extra: ^11.1.1 + html-tags: ^3.3.1 + html-webpack-plugin: ^5.6.0 + leven: ^3.1.0 + lodash: ^4.17.21 + open: ^8.4.0 + p-map: ^4.0.0 + prompts: ^2.4.2 + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber: ^1.0.1 + react-router: ^5.3.4 + react-router-config: ^5.1.1 + react-router-dom: ^5.3.4 + semver: ^7.5.4 + serve-handler: ^6.1.6 + tinypool: ^1.0.2 + tslib: ^2.6.0 + update-notifier: ^6.0.2 + webpack: ^5.95.0 + webpack-bundle-analyzer: ^4.10.2 + webpack-dev-server: ^5.2.2 + webpack-merge: ^6.0.1 + peerDependencies: + "@mdx-js/react": ^3.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + bin: + docusaurus: bin/docusaurus.mjs + checksum: 270ef174c38f67d111273de7df9f82fdbdab974c2fdff2f316c39bf919e8ef32a82ac7471421aa046b0ee64e6e25fff875f60783735b474471155f48d0e9c0b6 + languageName: node + linkType: hard + +"@docusaurus/cssnano-preset@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/cssnano-preset@npm:3.9.2" + dependencies: + cssnano-preset-advanced: ^6.1.2 + postcss: ^8.5.4 + postcss-sort-media-queries: ^5.2.0 + tslib: ^2.6.0 + checksum: 21b9b787042ab00db945969c45fdd6fb489cd0811ad256e482b44db3d6846b4f9c54a5b360e76f7160736e2866602d690bbe29d3cb9b08577d7087b38720566f + languageName: node + linkType: hard + +"@docusaurus/logger@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/logger@npm:3.9.2" + dependencies: + chalk: ^4.1.2 + tslib: ^2.6.0 + checksum: be81769070eea5ac3ab437dcfa040e19bf4e220e727cbc5ffefce5ba788e1b26ff9d64a82e07b8b542bbe4d40e7ebdc4f5a0683a9e7c3f17e790760e89b8a06b + languageName: node + linkType: hard + +"@docusaurus/mdx-loader@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/mdx-loader@npm:3.9.2" + dependencies: + "@docusaurus/logger": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + "@mdx-js/mdx": ^3.0.0 + "@slorber/remark-comment": ^1.0.0 + escape-html: ^1.0.3 + estree-util-value-to-estree: ^3.0.1 + file-loader: ^6.2.0 + fs-extra: ^11.1.1 + image-size: ^2.0.2 + mdast-util-mdx: ^3.0.0 + mdast-util-to-string: ^4.0.0 + rehype-raw: ^7.0.0 + remark-directive: ^3.0.0 + remark-emoji: ^4.0.0 + remark-frontmatter: ^5.0.0 + remark-gfm: ^4.0.0 + stringify-object: ^3.3.0 + tslib: ^2.6.0 + unified: ^11.0.3 + unist-util-visit: ^5.0.0 + url-loader: ^4.1.1 + vfile: ^6.0.1 + webpack: ^5.88.1 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: d3d07ee153709645260f152fd07791ed584b74494728e3d0091183e4006e17f23ecfb47abcecb7ba83fdc56bff974c48e833b87a11b88ee3944977d2675acf56 + languageName: node + linkType: hard + +"@docusaurus/module-type-aliases@npm:3.9.2, @docusaurus/module-type-aliases@npm:^3.1.0": + version: 3.9.2 + resolution: "@docusaurus/module-type-aliases@npm:3.9.2" + dependencies: + "@docusaurus/types": 3.9.2 + "@types/history": ^4.7.11 + "@types/react": "*" + "@types/react-router-config": "*" + "@types/react-router-dom": "*" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 3d2c1f303e0b81aea8879f440b76603a111c930d219a06500fa70276f0c39bc4d7868e8b4022b6bb10524d74c437b263ebab96304f6af49bd0cdcabe84c4f29f + languageName: node + linkType: hard + +"@docusaurus/plugin-content-blog@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-blog@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/theme-common": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + cheerio: 1.0.0-rc.12 + feed: ^4.2.2 + fs-extra: ^11.1.1 + lodash: ^4.17.21 + schema-dts: ^1.1.2 + srcset: ^4.0.0 + tslib: ^2.6.0 + unist-util-visit: ^5.0.0 + utility-types: ^3.10.0 + webpack: ^5.88.1 + peerDependencies: + "@docusaurus/plugin-content-docs": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10eab3d9d09d1c45c6a0793a98757b3235d557a0e4c9e184c9a06e0ab7281fd6a691364650b257b385dd8ff38c95dc0707a70b672c9b36cb10e35012ff352328 + languageName: node + linkType: hard + +"@docusaurus/plugin-content-docs@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-docs@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/module-type-aliases": 3.9.2 + "@docusaurus/theme-common": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + "@types/react-router-config": ^5.0.7 + combine-promises: ^1.1.0 + fs-extra: ^11.1.1 + js-yaml: ^4.1.0 + lodash: ^4.17.21 + schema-dts: ^1.1.2 + tslib: ^2.6.0 + utility-types: ^3.10.0 + webpack: ^5.88.1 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: cc927d4e3711c71221cf68e97bc86c10b762a10f3589b252a865a8e409e1a37eda3092573aa1bd9f1ab9aa71a00c000a09079b1ac33aeff9adb6a90afb65fa59 + languageName: node + linkType: hard + +"@docusaurus/plugin-content-pages@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-pages@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + fs-extra: ^11.1.1 + tslib: ^2.6.0 + webpack: ^5.88.1 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: cf581f07f6260f5cec106b4641f399582b94b21ee66cb07096ebc5924caf9862eb9bfa2a57b20f05d920917cd6838d58dc3667c07ca3f9655a11fb168594b93e + languageName: node + linkType: hard + +"@docusaurus/plugin-css-cascade-layers@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + tslib: ^2.6.0 + checksum: 350aa4826eaa9b26d504784ffa14886594926066dcd1ff363b104a997873210c30c78b98e05de365def527f5ae275343b19e5d2ee49589a159bd68c81bf0f12b + languageName: node + linkType: hard + +"@docusaurus/plugin-debug@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-debug@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + fs-extra: ^11.1.1 + react-json-view-lite: ^2.3.0 + tslib: ^2.6.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 8974d17143f3b379c977441011f6c9daa8d38eb484c33726b9e9a63012553e66847a1a18e7e86ed52bc5321d2833ee8e934a1619afcdd669b255089ffd23a506 + languageName: node + linkType: hard + +"@docusaurus/plugin-google-analytics@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-analytics@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + tslib: ^2.6.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 026ffe26b4e47adf509f3de79a9a4b095e0374e4db0ce73041f9d28933df1e7697069bce7a0be1744eeca2b2d5ed057f023f4f2e98aff838b33cc2c2d1eed882 + languageName: node + linkType: hard + +"@docusaurus/plugin-google-gtag@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-gtag@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + "@types/gtag.js": ^0.0.12 + tslib: ^2.6.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: ee596c5a1d1a71d947c390274326b46a9aeb56c3d0c0c0b672629e890e783f6f6947505dc66ee0abe4d70fe61f743ff9df0a4b4cdc4fe3994eefbb1a4386769b + languageName: node + linkType: hard + +"@docusaurus/plugin-google-tag-manager@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + tslib: ^2.6.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 0c4ee07b5ee2cdf252b53aa52b54f42ae591441df5e289e2a1614bcabe1852f973ec65a1086c7682f7e5a5e65a50c0597ed9c393505c2902f1a52569798ef6c0 + languageName: node + linkType: hard + +"@docusaurus/plugin-sitemap@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-sitemap@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + fs-extra: ^11.1.1 + sitemap: ^7.1.1 + tslib: ^2.6.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 0f72e1868ce2fcd2f636a1a7949145f31a8d3ec68061dbb3d62689ea77f00a2a4a5f3d8578dac2f2178e3b96240a15c1d89bf74d2c43d6fb3a14b183cd97c174 + languageName: node + linkType: hard + +"@docusaurus/plugin-svgr@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-svgr@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + "@svgr/core": 8.1.0 + "@svgr/webpack": ^8.1.0 + tslib: ^2.6.0 + webpack: ^5.88.1 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 941dab80101e5d65a3c9a063d30b713297173bc117cea7638f58abe69d8c9051baaa5f912359427acfc04fb3b97f26f3f86e9ecbdd8d30dec386834bb3f6c9c8 + languageName: node + linkType: hard + +"@docusaurus/preset-classic@npm:^3.1.0": + version: 3.9.2 + resolution: "@docusaurus/preset-classic@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/plugin-content-blog": 3.9.2 + "@docusaurus/plugin-content-docs": 3.9.2 + "@docusaurus/plugin-content-pages": 3.9.2 + "@docusaurus/plugin-css-cascade-layers": 3.9.2 + "@docusaurus/plugin-debug": 3.9.2 + "@docusaurus/plugin-google-analytics": 3.9.2 + "@docusaurus/plugin-google-gtag": 3.9.2 + "@docusaurus/plugin-google-tag-manager": 3.9.2 + "@docusaurus/plugin-sitemap": 3.9.2 + "@docusaurus/plugin-svgr": 3.9.2 + "@docusaurus/theme-classic": 3.9.2 + "@docusaurus/theme-common": 3.9.2 + "@docusaurus/theme-search-algolia": 3.9.2 + "@docusaurus/types": 3.9.2 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: ae8328253111429e9ca219273d5ae8c39f26a98c2422b25a8d233e3a0f2737e453dd1dbcc29e4c9a601b936d0217b3e91dce218d12f9f33793ae3120ed629c1c + languageName: node + linkType: hard + +"@docusaurus/theme-classic@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-classic@npm:3.9.2" + dependencies: + "@docusaurus/core": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/module-type-aliases": 3.9.2 + "@docusaurus/plugin-content-blog": 3.9.2 + "@docusaurus/plugin-content-docs": 3.9.2 + "@docusaurus/plugin-content-pages": 3.9.2 + "@docusaurus/theme-common": 3.9.2 + "@docusaurus/theme-translations": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + "@mdx-js/react": ^3.0.0 + clsx: ^2.0.0 + infima: 0.2.0-alpha.45 + lodash: ^4.17.21 + nprogress: ^0.2.0 + postcss: ^8.5.4 + prism-react-renderer: ^2.3.0 + prismjs: ^1.29.0 + react-router-dom: ^5.3.4 + rtlcss: ^4.1.0 + tslib: ^2.6.0 + utility-types: ^3.10.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 19d0e89fa5d17bfde05642466137770baafe1528cad9540e55ba7969694fc456cdafdde175591a2e8d389cd1fb71eb13d2034b7bc6e4aa724d5531d224426413 + languageName: node + linkType: hard + +"@docusaurus/theme-common@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-common@npm:3.9.2" + dependencies: + "@docusaurus/mdx-loader": 3.9.2 + "@docusaurus/module-type-aliases": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + "@types/history": ^4.7.11 + "@types/react": "*" + "@types/react-router-config": "*" + clsx: ^2.0.0 + parse-numeric-range: ^1.3.0 + prism-react-renderer: ^2.3.0 + tslib: ^2.6.0 + utility-types: ^3.10.0 + peerDependencies: + "@docusaurus/plugin-content-docs": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 9d5e2ef0f895a3c8d5ebbe1aca620fcdde91166397084654a6288957ba69ff3b3bfeb0c4518ff64cd5fb2d7c245dd852cb22516507237ad8f6d13ed297ff8d71 + languageName: node + linkType: hard + +"@docusaurus/theme-search-algolia@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-search-algolia@npm:3.9.2" + dependencies: + "@docsearch/react": ^3.9.0 || ^4.1.0 + "@docusaurus/core": 3.9.2 + "@docusaurus/logger": 3.9.2 + "@docusaurus/plugin-content-docs": 3.9.2 + "@docusaurus/theme-common": 3.9.2 + "@docusaurus/theme-translations": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-validation": 3.9.2 + algoliasearch: ^5.37.0 + algoliasearch-helper: ^3.26.0 + clsx: ^2.0.0 + eta: ^2.2.0 + fs-extra: ^11.1.1 + lodash: ^4.17.21 + tslib: ^2.6.0 + utility-types: ^3.10.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 0dc6affcb778ba525c14f944e34fa6ff68ac753221f7a0f832d51f7e37d1ffbd7084f0d164ede57759e5160b6c071387ca4f517b12f91b6f0d3a13aa57e14393 + languageName: node + linkType: hard + +"@docusaurus/theme-translations@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-translations@npm:3.9.2" + dependencies: + fs-extra: ^11.1.1 + tslib: ^2.6.0 + checksum: 166e534cc2533a369ac29384ddfc728402739f55d6ea8e6c498e0707e7c02c3232a8f1a7f28f3f1fd1abd901f41b6731ee5d603c689a0c4f6eac30b94c07e667 + languageName: node + linkType: hard + +"@docusaurus/types@npm:3.9.2, @docusaurus/types@npm:^3.1.0": + version: 3.9.2 + resolution: "@docusaurus/types@npm:3.9.2" + dependencies: + "@mdx-js/mdx": ^3.0.0 + "@types/history": ^4.7.11 + "@types/mdast": ^4.0.2 + "@types/react": "*" + commander: ^5.1.0 + joi: ^17.9.2 + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + utility-types: ^3.10.0 + webpack: ^5.95.0 + webpack-merge: ^5.9.0 + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 6f856de4dc482e4d358fda9fe4e8913561bb1f3cdafc12995cb0773b945cacedcde262c5a36bafdde690acdfb2c2cb14fd58290f6fbe9720189ff10f37b18962 + languageName: node + linkType: hard + +"@docusaurus/utils-common@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-common@npm:3.9.2" + dependencies: + "@docusaurus/types": 3.9.2 + tslib: ^2.6.0 + checksum: 77e01da05ebbf202343b3131ffaba7132c764ccc0ab48dd4421535c75a59e2d4a1dcaf8471cde257b5394528ada52f79da6398f6f2eb9fde79904be736f19275 + languageName: node + linkType: hard + +"@docusaurus/utils-validation@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-validation@npm:3.9.2" + dependencies: + "@docusaurus/logger": 3.9.2 + "@docusaurus/utils": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + fs-extra: ^11.2.0 + joi: ^17.9.2 + js-yaml: ^4.1.0 + lodash: ^4.17.21 + tslib: ^2.6.0 + checksum: 17599a47be486c62c7867e57a37afaf89155c9852bfaff7159191983b111176b222ef50bfb60848e7465d2dfd65f90bc9fd6f7015838767fab3126afb677c2d9 + languageName: node + linkType: hard + +"@docusaurus/utils@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils@npm:3.9.2" + dependencies: + "@docusaurus/logger": 3.9.2 + "@docusaurus/types": 3.9.2 + "@docusaurus/utils-common": 3.9.2 + escape-string-regexp: ^4.0.0 + execa: 5.1.1 + file-loader: ^6.2.0 + fs-extra: ^11.1.1 + github-slugger: ^1.5.0 + globby: ^11.1.0 + gray-matter: ^4.0.3 + jiti: ^1.20.0 + js-yaml: ^4.1.0 + lodash: ^4.17.21 + micromatch: ^4.0.5 + p-queue: ^6.6.2 + prompts: ^2.4.2 + resolve-pathname: ^3.0.0 + tslib: ^2.6.0 + url-loader: ^4.1.1 + utility-types: ^3.10.0 + webpack: ^5.88.1 + checksum: c88de8ea7835da1ea4114ff1aa9e97546565d7f20dcad3b3e9ef3663f536468a8a4f36431037ca60e7ac019b069adea40d1ef839bdaaf0daea661bd2fa954045 + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.13.5": version: 11.13.5 resolution: "@emotion/babel-plugin@npm:11.13.5" @@ -3229,6 +4945,22 @@ __metadata: languageName: node linkType: hard +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + "@hello-pangea/dnd@npm:^17.0.0": version: 17.0.0 resolution: "@hello-pangea/dnd@npm:17.0.0" @@ -3742,7 +5474,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -3752,6 +5484,246 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/base64@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: e5c5b0dd3bd57fe31799ceacf516fd1ef9cb02def5d6fd54fd6afc06387b8220d399aaa65cf71dcb303ed45f32dff950d56e9af6d0dcaf6b676058e2594a62ec + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 00dbf9cbc6ecb3af0e58288a305cc4ee3dfca9efa24443d98061756e8f6de4d6d2d3764bdfde07f2b03e6ce56db27c8a59b490bd134bf3d8122b4c6b394c7010 + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:17.67.0, @jsonjoy.com/buffers@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/buffers@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 68b0f0268c79f79a2c8e4aefd02626471f0df7e77a96d186001bdfc2ed3a0855a111aaef943e688712cf677bb265b182b6ec5abe4dea26c32dc0322f988d5f8d + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" + peerDependencies: + tslib: 2 + checksum: 5de11264a7ffe62e5ee3e4f9328bb01cb18dd9d4b977ce1a98e134860c630ae801cf535b78f7a618c33955061d49f0b09699eb77b10e0e45b942f7bb48a19791 + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/codegen@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 11195d6247c21e429ccdfa9cfd4b15bfea6fdc059e5beb25ca9d129a79fcb9a636d6d10ad3845dbaa480a318323496be2fe3cfcd5a217e2b577012b93a78a46a + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:^1.0.0": + version: 1.0.0 + resolution: "@jsonjoy.com/codegen@npm:1.0.0" + peerDependencies: + tslib: 2 + checksum: 77383ed703dacc0ee35783589f3289e464d9fd047675f2f628b4d8a567c2b9c87f0121f4445203d51645b5777d24c3b50ed7e12525f4064a0614caae81b1dc2e + languageName: node + linkType: hard + +"@jsonjoy.com/fs-core@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-core@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": 4.56.10 + "@jsonjoy.com/fs-node-utils": 4.56.10 + thingies: ^2.5.0 + peerDependencies: + tslib: 2 + checksum: d6bf86ec80ad33753b832735e5817b262d9b4667c687eed659bcebdaf19d0c2239b9d6f08b8fb366c5b28083a00fffb9840a7d552e2567d818c0fa886d20e24b + languageName: node + linkType: hard + +"@jsonjoy.com/fs-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": 4.56.10 + "@jsonjoy.com/fs-node-builtins": 4.56.10 + "@jsonjoy.com/fs-node-utils": 4.56.10 + thingies: ^2.5.0 + peerDependencies: + tslib: 2 + checksum: f3eecd70f8151074b16b4c3e04efac685d4fe19b19c49bbe798f99f501cc9cd31c3a18a7cc3fd9060b42ea7ed5d37452eab6554c992ed560747a4e8b12984ffe + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-builtins@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-builtins@npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: b383f3f0c0c66a5ba22dd922ca21c3a08d37060c469f62e50f74b3f99f874a11e4b0099ba92da53c818cdb31b39068393466374858cdcbaea0fd17904d2c3dd6 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-to-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-fsa": 4.56.10 + "@jsonjoy.com/fs-node-builtins": 4.56.10 + "@jsonjoy.com/fs-node-utils": 4.56.10 + peerDependencies: + tslib: 2 + checksum: 1d798ddc5a2b36e1a173b73543a435bcf282ec195f0b78cc500b73ecd521dbaba250855a6883d2406d264b95582e8fca4b1e4094d190fc64252408c399c666e7 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-utils@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-utils@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": 4.56.10 + peerDependencies: + tslib: 2 + checksum: 9beb585652e7699c9a8526737e5a20418586beb3b07b57930cd34ea2eef0acc2179c9987f024b30575aee9eaed079dabf236757a8abb60f7dd3f6cd25708c494 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": 4.56.10 + "@jsonjoy.com/fs-node-builtins": 4.56.10 + "@jsonjoy.com/fs-node-utils": 4.56.10 + "@jsonjoy.com/fs-print": 4.56.10 + "@jsonjoy.com/fs-snapshot": 4.56.10 + glob-to-regex.js: ^1.0.0 + thingies: ^2.5.0 + peerDependencies: + tslib: 2 + checksum: 898ecdb4a3ca782de39c5a5985710f031da9d17eb9117ef07d7e47ef91a5fbacec4ecefb6978026201d5638eed9a13e65d7b888ba20d418346a7924227c8dc57 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-print@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-print@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-utils": 4.56.10 + tree-dump: ^1.1.0 + peerDependencies: + tslib: 2 + checksum: 9eff4f179624f9bee799e2a7abcc311a512284fae2c149cd85378604e407bba613d95af065275caf37e0a16a015a040cb4a99cec8c51ac6d393bcf9c343c0d8e + languageName: node + linkType: hard + +"@jsonjoy.com/fs-snapshot@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-snapshot@npm:4.56.10" + dependencies: + "@jsonjoy.com/buffers": ^17.65.0 + "@jsonjoy.com/fs-node-utils": 4.56.10 + "@jsonjoy.com/json-pack": ^17.65.0 + "@jsonjoy.com/util": ^17.65.0 + peerDependencies: + tslib: 2 + checksum: 8abbc8171ab0b30eca5b1f06f1a5fcaf1d04ca342fd9fca497571cbfd4a05c444773945222f2b4cda952931d6703dff743ee554c78ca447d2051698f74c6595c + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" + dependencies: + "@jsonjoy.com/base64": ^1.1.2 + "@jsonjoy.com/buffers": ^1.2.0 + "@jsonjoy.com/codegen": ^1.0.0 + "@jsonjoy.com/json-pointer": ^1.0.2 + "@jsonjoy.com/util": ^1.9.0 + hyperdyperid: ^1.2.0 + thingies: ^2.5.0 + tree-dump: ^1.1.0 + peerDependencies: + tslib: 2 + checksum: 653b02514bd4ca5e57f72d1fe1b57181767001a4b2615f35135085309cc91fd47f7421c17a465becc76d986871831d4a1cb68506720547e7e7fc0822d6bc5092 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pack@npm:17.67.0" + dependencies: + "@jsonjoy.com/base64": 17.67.0 + "@jsonjoy.com/buffers": 17.67.0 + "@jsonjoy.com/codegen": 17.67.0 + "@jsonjoy.com/json-pointer": 17.67.0 + "@jsonjoy.com/util": 17.67.0 + hyperdyperid: ^1.2.0 + thingies: ^2.5.0 + tree-dump: ^1.1.0 + peerDependencies: + tslib: 2 + checksum: f04ae650b26aca75e2b1879ea9a6026ef66c5947882b22ddc03f1bc5ff6bb2b643cd024b2ab3e863d4036bbe3d67afbfbd02309dc32c5fe1b5fc9efce1baf659 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pointer@npm:17.67.0" + dependencies: + "@jsonjoy.com/util": 17.67.0 + peerDependencies: + tslib: 2 + checksum: 6ff4fe4926be6e6dcc570075ca0b79efc017ca77145acb4790123135d307efa27082638007ff329ce8fab399702c3e2af2b7fa071aca76f83be50fb95131e2c7 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" + dependencies: + "@jsonjoy.com/codegen": ^1.0.0 + "@jsonjoy.com/util": ^1.9.0 + peerDependencies: + tslib: 2 + checksum: 93b45eb2e5ea3864778dab45c9fd2313cd9fb0fc9fa9a6401c8dea0365e44551fa8debbf3d0efb8b5131c0fde689f4509248b3e2ba12852a8c75739028ec3c1b + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:17.67.0, @jsonjoy.com/util@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/util@npm:17.67.0" + dependencies: + "@jsonjoy.com/buffers": 17.67.0 + "@jsonjoy.com/codegen": 17.67.0 + peerDependencies: + tslib: 2 + checksum: 945c5e7e889ad4b6c6d3b5fc7a3396e7b1b9db9b2d065a5231c29ffef03c202f4c8e2ac51f6024faba2ad348620f94f3c606c8cae8f5ba4c23cba05b409000f6 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.9.0": + version: 1.9.0 + resolution: "@jsonjoy.com/util@npm:1.9.0" + dependencies: + "@jsonjoy.com/buffers": ^1.0.0 + "@jsonjoy.com/codegen": ^1.0.0 + peerDependencies: + tslib: 2 + checksum: a22c49af0736cede94c24ad8da7230f42697eb5c4a6016450d5bf1cbcb51cd5b45a08989e7ec4cad1cc47718cb5b26e0ba583189f238d095eae4b15cbbe8c9e7 + languageName: node + linkType: hard + "@kurkle/color@npm:^0.3.0": version: 0.3.4 resolution: "@kurkle/color@npm:0.3.4" @@ -3766,6 +5738,51 @@ __metadata: languageName: node linkType: hard +"@mdx-js/mdx@npm:^3.0.0": + version: 3.1.1 + resolution: "@mdx-js/mdx@npm:3.1.1" + dependencies: + "@types/estree": ^1.0.0 + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdx": ^2.0.0 + acorn: ^8.0.0 + collapse-white-space: ^2.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + estree-util-scope: ^1.0.0 + estree-walker: ^3.0.0 + hast-util-to-jsx-runtime: ^2.0.0 + markdown-extensions: ^2.0.0 + recma-build-jsx: ^1.0.0 + recma-jsx: ^1.0.0 + recma-stringify: ^1.0.0 + rehype-recma: ^1.0.0 + remark-mdx: ^3.0.0 + remark-parse: ^11.0.0 + remark-rehype: ^11.0.0 + source-map: ^0.7.0 + unified: ^11.0.0 + unist-util-position-from-estree: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 6e624abc177345b80e1fedd0e899e06ceb2e73dfba7b4a5ac59e415a3f905048818dbe6e89c46e20cafcb20ef53ea6901193fbd5d59fa661680d81b837b6d7df + languageName: node + linkType: hard + +"@mdx-js/react@npm:^3.0.0": + version: 3.1.1 + resolution: "@mdx-js/react@npm:3.1.1" + dependencies: + "@types/mdx": ^2.0.0 + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 7e1742c530dd4b5b586f9ccbc8451062b9a1b4c3c8dd00537aa910b34c7404e4120d50dbd0a19f1697ae8e600d9e5848e29fad846d2975b7c5c7d8d2bd798c83 + languageName: node + linkType: hard + "@microsoft/clarity@npm:^1.0.0": version: 1.0.2 resolution: "@microsoft/clarity@npm:1.0.2" @@ -4161,6 +6178,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 + languageName: node + linkType: hard + "@noble/hashes@npm:^1.1.5": version: 1.8.0 resolution: "@noble/hashes@npm:1.8.0" @@ -4412,6 +6436,151 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-cms@npm:^2.6.0, @peculiar/asn1-cms@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-cms@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + "@peculiar/asn1-x509-attr": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: e5fa34cdb8a0201c6082790f66e1a9bb4dc5648c7acf32e09b84cbe254ce0ed91704649c94c56a14f3c2499559709bb4e6f8394e2742e7c2f3a7fb715d1cd7fd + languageName: node + linkType: hard + +"@peculiar/asn1-csr@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-csr@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: ec0108ad630c2099a1853dd0749c38d883564bec2367bd7f2c3653ebcce68bc3685bd55c1344a4aa103d5bf8e3b3eaef7eb3a038e6a5eba1bd4b4ce1f8d769e3 + languageName: node + linkType: hard + +"@peculiar/asn1-ecc@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-ecc@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: d66ac931529a1b6c2a5a4942157a934a1f8ac5261bbe7c012d14c9ef98765b335f7de41ba1c1de3e4840b21659d164dc3f01aa676fc932951f92925487be26fd + languageName: node + linkType: hard + +"@peculiar/asn1-pfx@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pfx@npm:2.6.1" + dependencies: + "@peculiar/asn1-cms": ^2.6.1 + "@peculiar/asn1-pkcs8": ^2.6.1 + "@peculiar/asn1-rsa": ^2.6.1 + "@peculiar/asn1-schema": ^2.6.0 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: 2fddb69bccf212ff3d219c5490dc513da06443f6cec112a2bf10d17338f827cb56975c2a54ae4f3dccdb3432be4d0b9deff9cfb0c2f243103597f9e93facb9f3 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs8@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs8@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: 4c4ade37460af4f0ff0ce1955aecb16e488d63987a3fa9309b3c6d5fff076a05622b6f6c37c788afe463c4fb2849cf83f80fe88fe39b2934a198fd3a8396de33 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs9@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs9@npm:2.6.1" + dependencies: + "@peculiar/asn1-cms": ^2.6.1 + "@peculiar/asn1-pfx": ^2.6.1 + "@peculiar/asn1-pkcs8": ^2.6.1 + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + "@peculiar/asn1-x509-attr": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: 460792fa588828f06b7c4815e47321156f7ec531315ee4daa7287dc72b9165a2879350f1b44ff799e9351c80e0673b4bb637c50ca4aa196bec219d3ba02589bd + languageName: node + linkType: hard + +"@peculiar/asn1-rsa@npm:^2.6.0, @peculiar/asn1-rsa@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-rsa@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: 90a36cbf018bad03a671a2cd5e7db46bfd2f25c53aee1b4aa20c75f726e49544eac555ef56762ed686682a2306678d9c451f3ba03f5582f6280abb15eb9c6d18 + languageName: node + linkType: hard + +"@peculiar/asn1-schema@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-schema@npm:2.6.0" + dependencies: + asn1js: ^3.0.6 + pvtsutils: ^1.3.6 + tslib: ^2.8.1 + checksum: 1d34d209b8db50ca1431060445fec9ab629d2decc3bcf161847877279c677ac8aa7794a7306950b63dd7535a91611df5464e4721ddb39a2f4c1109bd9a9fff73 + languageName: node + linkType: hard + +"@peculiar/asn1-x509-attr@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509-attr@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.1 + asn1js: ^3.0.6 + tslib: ^2.8.1 + checksum: fdb0f8d0e45dfdab5bf3959dd4fc7db1e7df152c96fbe67dd1325fcb7db21004ad5a6c4a3e2c359226e3d637462fa751ef0b4e260a3c9d4c302f9e9ee39a31d6 + languageName: node + linkType: hard + +"@peculiar/asn1-x509@npm:^2.6.0, @peculiar/asn1-x509@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": ^2.6.0 + asn1js: ^3.0.6 + pvtsutils: ^1.3.6 + tslib: ^2.8.1 + checksum: b032735a5811234344f7ba8a45daa836773accf85e42f80deb426509dc3e45b8d5d23e587f9b77a967cf28ec413afe4f3ea00a3ff4a500d25e684aa160683c0d + languageName: node + linkType: hard + +"@peculiar/x509@npm:^1.14.2": + version: 1.14.3 + resolution: "@peculiar/x509@npm:1.14.3" + dependencies: + "@peculiar/asn1-cms": ^2.6.0 + "@peculiar/asn1-csr": ^2.6.0 + "@peculiar/asn1-ecc": ^2.6.0 + "@peculiar/asn1-pkcs9": ^2.6.0 + "@peculiar/asn1-rsa": ^2.6.0 + "@peculiar/asn1-schema": ^2.6.0 + "@peculiar/asn1-x509": ^2.6.0 + pvtsutils: ^1.3.6 + reflect-metadata: ^0.2.2 + tslib: ^2.8.1 + tsyringe: ^4.10.0 + checksum: 9b7843dffd518fc78c07a28a4e0bcfa515c5ebe4af253cd07f632be8f1db61ec07e49725ce81276fb60e643d18376d646c47a01f38dc0f4cc9f0392a38594a7a + languageName: node + linkType: hard + "@pkgr/core@npm:^0.2.9": version: 0.2.9 resolution: "@pkgr/core@npm:0.2.9" @@ -4456,6 +6625,40 @@ __metadata: languageName: node linkType: hard +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: a3d2b57e35eec9543d9eb085854f6e33e8102dac99fdef2fad2eebdbbfc345e93299f0c20e8eb61c1b4c7aa123bfd47c175678626f161cda65dd147c2b6e1fa0 + languageName: node + linkType: hard + +"@pnpm/network.ca-file@npm:^1.0.1": + version: 1.0.2 + resolution: "@pnpm/network.ca-file@npm:1.0.2" + dependencies: + graceful-fs: 4.2.10 + checksum: d8d0884646500576bd5390464d13db1bb9a62e32a1069293e5bddb2ad8354b354b7e2d2a35e12850025651e795e6a80ce9e601c66312504667b7e3ee7b52becc + languageName: node + linkType: hard + +"@pnpm/npm-conf@npm:^3.0.2": + version: 3.0.2 + resolution: "@pnpm/npm-conf@npm:3.0.2" + dependencies: + "@pnpm/config.env-replace": ^1.1.0 + "@pnpm/network.ca-file": ^1.0.1 + config-chain: ^1.1.11 + checksum: 8a88e8b59858ee7e37b3249d85f491821a878070f736127a1baff55e293c9d6e5db67c8945084970d0f2de5af9351ece28714c7dc1b2888998524999b800c144 + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.29 + resolution: "@polka/url@npm:1.0.0-next.29" + checksum: 69ca11ab15a4ffec7f0b07fcc4e1f01489b3d9683a7e1867758818386575c60c213401259ba3705b8a812228d17e2bfd18e6f021194d943fff4bca389c9d4f28 + languageName: node + linkType: hard + "@popperjs/core@npm:^2.11.8": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" @@ -4800,6 +7003,29 @@ __metadata: languageName: node linkType: hard +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.24.1": version: 0.24.51 resolution: "@sinclair/typebox@npm:0.24.51" @@ -4814,6 +7040,20 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.6.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^5.2.0": + version: 5.6.0 + resolution: "@sindresorhus/is@npm:5.6.0" + checksum: 2e6e0c3acf188dcd9aea0f324ac1b6ad04c9fc672392a7b5a1218512fcde066965797eba8b9fe2108657a504388bd4a6664e6e6602555168e828a6df08b9f10e + languageName: node + linkType: hard + "@sinonjs/commons@npm:^1.7.0": version: 1.8.6 resolution: "@sinonjs/commons@npm:1.8.6" @@ -4892,6 +7132,17 @@ __metadata: languageName: node linkType: hard +"@slorber/remark-comment@npm:^1.0.0": + version: 1.0.0 + resolution: "@slorber/remark-comment@npm:1.0.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.1.0 + micromark-util-symbol: ^1.0.1 + checksum: c96f1533d09913c57381859966f10a706afd8eb680923924af1c451f3b72f22c31e394028d7535131c10f8682d3c60206da95c50fb4f016fbbd04218c853cc88 + languageName: node + linkType: hard + "@smithy/abort-controller@npm:^4.2.8": version: 4.2.8 resolution: "@smithy/abort-controller@npm:4.2.8" @@ -5411,6 +7662,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3fc8e35d16f5abe0af5efe5851f27581225ac405d6a1ca44cda0df064cddfcc29a428c48c2e4bef6cebf627c9ac2f652a096030edb02cf5a120ce28d3c234710 + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:^5.4.0": version: 5.4.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:5.4.0" @@ -5418,6 +7678,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ff992893c6c4ac802713ba3a97c13be34e62e6d981c813af40daabcd676df68a72a61bd1e692bb1eda3587f1b1d700ea462222ae2153bb0f46886632d4f88d08 + languageName: node + linkType: hard + "@svgr/babel-plugin-remove-jsx-attribute@npm:^5.4.0": version: 5.4.0 resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:5.4.0" @@ -5425,6 +7694,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0fb691b63a21bac00da3aa2dccec50d0d5a5b347ff408d60803b84410d8af168f2656e4ba1ee1f24dab0ae4e4af77901f2928752bb0434c1f6788133ec599ec8 + languageName: node + linkType: hard + "@svgr/babel-plugin-remove-jsx-empty-expression@npm:^5.0.1": version: 5.0.1 resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:5.0.1" @@ -5432,6 +7710,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1edda65ef4f4dd8f021143c8ec276a08f6baa6f733b8e8ee2e7775597bf6b97afb47fdeefd579d6ae6c959fe2e634f55cd61d99377631212228c8cfb351b8921 + languageName: node + linkType: hard + "@svgr/babel-plugin-replace-jsx-attribute-value@npm:^5.0.1": version: 5.0.1 resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:5.0.1" @@ -5439,6 +7726,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 876cec891488992e6a9aebb8155e2bea4ec461b4718c51de36e988e00e271c6d9d01ef6be17b9effd44b2b3d7db0b41c161a5904a46ae6f38b26b387ad7f3709 + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-dynamic-title@npm:^5.4.0": version: 5.4.0 resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:5.4.0" @@ -5446,6 +7742,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: be0e2d391164428327d9ec469a52cea7d93189c6b0e2c290999e048f597d777852f701c64dca44cd45b31ed14a7f859520326e2e4ad7c3a4545d0aa235bc7e9a + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-em-dimensions@npm:^5.4.0": version: 5.4.0 resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:5.4.0" @@ -5453,6 +7758,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 85b434a57572f53bd2b9f0606f253e1fcf57b4a8c554ec3f2d43ed17f50d8cae200cb3aaf1ec9d626e1456e8b135dce530ae047eb0bed6d4bf98a752d6640459 + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-react-native-svg@npm:^5.4.0": version: 5.4.0 resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:5.4.0" @@ -5460,6 +7774,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 04e2023d75693eeb0890341c40e449881184663056c249be7e5c80168e4aabb0fadd255e8d5d2dbf54b8c2a6e700efba994377135bfa4060dc4a2e860116ef8c + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-svg-component@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/babel-plugin-transform-svg-component@npm:5.5.0" @@ -5467,6 +7790,24 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-preset@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-preset@npm:8.1.0" + dependencies: + "@svgr/babel-plugin-add-jsx-attribute": 8.0.0 + "@svgr/babel-plugin-remove-jsx-attribute": 8.0.0 + "@svgr/babel-plugin-remove-jsx-empty-expression": 8.0.0 + "@svgr/babel-plugin-replace-jsx-attribute-value": 8.0.0 + "@svgr/babel-plugin-svg-dynamic-title": 8.0.0 + "@svgr/babel-plugin-svg-em-dimensions": 8.0.0 + "@svgr/babel-plugin-transform-react-native-svg": 8.1.0 + "@svgr/babel-plugin-transform-svg-component": 8.0.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a67930f080b8891e1e8e2595716b879c944d253112bae763dce59807ba23454d162216c8d66a0a0e3d4f38a649ecd6c387e545d1e1261dd69a68e9a3392ee08 + languageName: node + linkType: hard + "@svgr/babel-preset@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/babel-preset@npm:5.5.0" @@ -5483,6 +7824,19 @@ __metadata: languageName: node linkType: hard +"@svgr/core@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/core@npm:8.1.0" + dependencies: + "@babel/core": ^7.21.3 + "@svgr/babel-preset": 8.1.0 + camelcase: ^6.2.0 + cosmiconfig: ^8.1.3 + snake-case: ^3.0.4 + checksum: da4a12865c7dc59829d58df8bd232d6c85b7115fda40da0d2f844a1a51886e2e945560596ecfc0345d37837ac457de86a931e8b8d8550e729e0c688c02250d8a + languageName: node + linkType: hard + "@svgr/core@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/core@npm:5.5.0" @@ -5494,6 +7848,16 @@ __metadata: languageName: node linkType: hard +"@svgr/hast-util-to-babel-ast@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" + dependencies: + "@babel/types": ^7.21.3 + entities: ^4.4.0 + checksum: 88401281a38bbc7527e65ff5437970414391a86158ef4b4046c89764c156d2d39ecd7cce77be8a51994c9fb3249170cb1eb8b9128b62faaa81743ef6ed3534ab + languageName: node + linkType: hard + "@svgr/hast-util-to-babel-ast@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/hast-util-to-babel-ast@npm:5.5.0" @@ -5503,6 +7867,20 @@ __metadata: languageName: node linkType: hard +"@svgr/plugin-jsx@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-jsx@npm:8.1.0" + dependencies: + "@babel/core": ^7.21.3 + "@svgr/babel-preset": 8.1.0 + "@svgr/hast-util-to-babel-ast": 8.0.0 + svg-parser: ^2.0.4 + peerDependencies: + "@svgr/core": "*" + checksum: 0418a9780753d3544912ee2dad5d2cf8d12e1ba74df8053651b3886aeda54d5f0f7d2dece0af5e0d838332c4f139a57f0dabaa3ca1afa4d1a765efce6a7656f2 + languageName: node + linkType: hard + "@svgr/plugin-jsx@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/plugin-jsx@npm:5.5.0" @@ -5515,6 +7893,19 @@ __metadata: languageName: node linkType: hard +"@svgr/plugin-svgo@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-svgo@npm:8.1.0" + dependencies: + cosmiconfig: ^8.1.3 + deepmerge: ^4.3.1 + svgo: ^3.0.2 + peerDependencies: + "@svgr/core": "*" + checksum: 59d9d214cebaacca9ca71a561f463d8b7e5a68ca9443e4792a42d903acd52259b1790c0680bc6afecc3f00a255a6cbd7ea278a9f625bac443620ea58a590c2d0 + languageName: node + linkType: hard + "@svgr/plugin-svgo@npm:^5.5.0": version: 5.5.0 resolution: "@svgr/plugin-svgo@npm:5.5.0" @@ -5542,6 +7933,31 @@ __metadata: languageName: node linkType: hard +"@svgr/webpack@npm:^8.1.0": + version: 8.1.0 + resolution: "@svgr/webpack@npm:8.1.0" + dependencies: + "@babel/core": ^7.21.3 + "@babel/plugin-transform-react-constant-elements": ^7.21.3 + "@babel/preset-env": ^7.20.2 + "@babel/preset-react": ^7.18.6 + "@babel/preset-typescript": ^7.21.0 + "@svgr/core": 8.1.0 + "@svgr/plugin-jsx": 8.1.0 + "@svgr/plugin-svgo": 8.1.0 + checksum: c6eec5b0cf2fb2ecd3a7a362d272eda35330b17c76802a3481f499b5d07ff8f87b31d2571043bff399b051a1767b1e2e499dbf186104d1c06d76f9f1535fac01 + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" + dependencies: + defer-to-connect: ^2.0.1 + checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 + languageName: node + linkType: hard + "@testing-library/dom@npm:^10.4.0": version: 10.4.1 resolution: "@testing-library/dom@npm:10.4.1" @@ -5723,7 +8139,7 @@ __metadata: languageName: node linkType: hard -"@types/bonjour@npm:^3.5.9": +"@types/bonjour@npm:^3.5.13, @types/bonjour@npm:^3.5.9": version: 3.5.13 resolution: "@types/bonjour@npm:3.5.13" dependencies: @@ -5758,7 +8174,7 @@ __metadata: languageName: node linkType: hard -"@types/connect-history-api-fallback@npm:^1.3.5": +"@types/connect-history-api-fallback@npm:^1.3.5, @types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: @@ -5962,7 +8378,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.8 resolution: "@types/express-serve-static-core@npm:4.19.8" dependencies: @@ -5994,7 +8410,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.17.0, @types/express@npm:^4.17.13": +"@types/express@npm:^4.17.0, @types/express@npm:^4.17.13, @types/express@npm:^4.17.25": version: 4.17.25 resolution: "@types/express@npm:4.17.25" dependencies: @@ -6022,6 +8438,13 @@ __metadata: languageName: node linkType: hard +"@types/gtag.js@npm:^0.0.12": + version: 0.0.12 + resolution: "@types/gtag.js@npm:0.0.12" + checksum: 34efc27fbfd0013255b8bfd4af38ded9d5a6ba761130c76f17fd3a9585d83acc88d8005aab667cfec4bdec0e7c7217f689739799a8f61aed0edb929be58b162e + languageName: node + linkType: hard + "@types/hast@npm:^3.0.0": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" @@ -6045,6 +8468,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:^4.0.2": + version: 4.2.0 + resolution: "@types/http-cache-semantics@npm:4.2.0" + checksum: c75c63c3d4204eba2dc14f5ac5cfabc1c17ee9f11e6f5ff63d5c73a6245c7e360c0ae3e95512778860f5b08f5886fbaf7400fba3d23fd8faf279f58aa9bb54bc + languageName: node + linkType: hard + "@types/http-errors@npm:*": version: 2.0.5 resolution: "@types/http-errors@npm:2.0.5" @@ -6135,7 +8565,7 @@ __metadata: languageName: node linkType: hard -"@types/mdast@npm:^4.0.0": +"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": version: 4.0.4 resolution: "@types/mdast@npm:4.0.4" dependencies: @@ -6144,6 +8574,13 @@ __metadata: languageName: node linkType: hard +"@types/mdx@npm:^2.0.0": + version: 2.0.13 + resolution: "@types/mdx@npm:2.0.13" + checksum: 195137b548e75a85f0558bb1ca5088aff1c01ae0fc64454da06085b7513a043356d0bb51ed559d3cbc7ad724ccd8cef2a7d07d014b89a47a74dff8875ceb3b15 + languageName: node + linkType: hard + "@types/methods@npm:^1.1.4": version: 1.1.4 resolution: "@types/methods@npm:1.1.4" @@ -6213,6 +8650,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^17.0.5": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 + languageName: node + linkType: hard + "@types/node@npm:^20.0.0": version: 20.19.30 resolution: "@types/node@npm:20.19.30" @@ -6246,6 +8690,13 @@ __metadata: languageName: node linkType: hard +"@types/prismjs@npm:^1.26.0": + version: 1.26.6 + resolution: "@types/prismjs@npm:1.26.6" + checksum: b61abb7370d55b549ab67d1dfab479f1f27539cebe02f051db67f0ad90f5de34df6b9fcaf340dd2f3e0217bba15d3e31c642832560ecf1779397d6950ee69478 + languageName: node + linkType: hard + "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.14, @types/prop-types@npm:^15.7.15": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" @@ -6301,7 +8752,18 @@ __metadata: languageName: node linkType: hard -"@types/react-router-dom@npm:^5.1.7": +"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.7": + version: 5.0.11 + resolution: "@types/react-router-config@npm:5.0.11" + dependencies: + "@types/history": ^4.7.11 + "@types/react": "*" + "@types/react-router": ^5.1.0 + checksum: 4b72d9b71e0576e193c11e5085bbdac43f31debfa3b6ebc24666f3d646ef25c1f57f16c29b1ddd3051c881e85f8e0d4ab5a7bbd5fc215b9377f57675b210be7c + languageName: node + linkType: hard + +"@types/react-router-dom@npm:*, @types/react-router-dom@npm:^5.1.7": version: 5.3.3 resolution: "@types/react-router-dom@npm:5.3.3" dependencies: @@ -6312,7 +8774,7 @@ __metadata: languageName: node linkType: hard -"@types/react-router@npm:*": +"@types/react-router@npm:*, @types/react-router@npm:^5.1.0": version: 5.1.20 resolution: "@types/react-router@npm:5.1.20" dependencies: @@ -6357,6 +8819,22 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a + languageName: node + linkType: hard + +"@types/sax@npm:^1.2.1": + version: 1.2.7 + resolution: "@types/sax@npm:1.2.7" + dependencies: + "@types/node": "*" + checksum: 7ece5fbb5d9c8fc76ab0de2f99d705edf92f18e701d4f9d9b0647275e32eb65e656c1badf9dfaa12f4e1ff3e250561c8c9cfe79e8b5f33dd1417ac0f1804f6cc + languageName: node + linkType: hard + "@types/semver@npm:^7.3.12": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" @@ -6383,7 +8861,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-index@npm:^1.9.1": +"@types/serve-index@npm:^1.9.1, @types/serve-index@npm:^1.9.4": version: 1.9.4 resolution: "@types/serve-index@npm:1.9.4" dependencies: @@ -6392,7 +8870,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:^1, @types/serve-static@npm:^1.13.10": +"@types/serve-static@npm:^1, @types/serve-static@npm:^1.13.10, @types/serve-static@npm:^1.15.5": version: 1.15.10 resolution: "@types/serve-static@npm:1.15.10" dependencies: @@ -6413,7 +8891,7 @@ __metadata: languageName: node linkType: hard -"@types/sockjs@npm:^0.3.33": +"@types/sockjs@npm:^0.3.33, @types/sockjs@npm:^0.3.36": version: 0.3.36 resolution: "@types/sockjs@npm:0.3.36" dependencies: @@ -6492,7 +8970,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.5": +"@types/ws@npm:^8.5.10, @types/ws@npm:^8.5.5": version: 8.18.1 resolution: "@types/ws@npm:8.18.1" dependencies: @@ -7184,7 +9662,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -7200,7 +9678,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" dependencies: @@ -7218,7 +9696,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.9.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -7260,6 +9738,16 @@ __metadata: languageName: node linkType: hard +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -7318,6 +9806,48 @@ __metadata: languageName: node linkType: hard +"algoliasearch-helper@npm:^3.26.0": + version: 3.27.1 + resolution: "algoliasearch-helper@npm:3.27.1" + dependencies: + "@algolia/events": ^4.0.1 + peerDependencies: + algoliasearch: ">= 3.1 < 6" + checksum: 588315a777fd5e0a0f9b55e45746afc7405ccfde18b4c66aff8b09187553474cf54d8e17845bea9c8950222182b5aede7b777bb87d7636c42ee2851aeee83796 + languageName: node + linkType: hard + +"algoliasearch@npm:^5.37.0": + version: 5.48.2 + resolution: "algoliasearch@npm:5.48.2" + dependencies: + "@algolia/abtesting": 1.14.2 + "@algolia/client-abtesting": 5.48.2 + "@algolia/client-analytics": 5.48.2 + "@algolia/client-common": 5.48.2 + "@algolia/client-insights": 5.48.2 + "@algolia/client-personalization": 5.48.2 + "@algolia/client-query-suggestions": 5.48.2 + "@algolia/client-search": 5.48.2 + "@algolia/ingestion": 1.48.2 + "@algolia/monitoring": 1.48.2 + "@algolia/recommend": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: efdd98d98bf46e9e87e6702aede5a218be906ffe0f7e9e9c9c40f4792b6674dfaa0ff466e95f964e6aea0e8fc6963cdef616b35de7efad4ed1da7c66321961bb + languageName: node + linkType: hard + +"ansi-align@npm:^3.0.1": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: ^4.1.0 + checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d + languageName: node + linkType: hard + "ansi-colors@npm:^4.1.1": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -7325,7 +9855,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.1": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -7391,6 +9921,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: f1b0829cf048cce870a305819f65ce2adcebc097b6d6479e12e955fd6225df9b9eb8b497083b764df796d94383ff20016cc4dbbae5b40f36138fb65a9d33c2e2 + languageName: node + linkType: hard + "any-promise@npm:^1.0.0": version: 1.3.0 resolution: "any-promise@npm:1.3.0" @@ -7422,7 +9959,7 @@ __metadata: languageName: node linkType: hard -"arg@npm:^5.0.2": +"arg@npm:^5.0.0, arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 @@ -7612,6 +10149,17 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.6": + version: 3.0.7 + resolution: "asn1js@npm:3.0.7" + dependencies: + pvtsutils: ^1.3.6 + pvutils: ^1.1.3 + tslib: ^2.8.1 + checksum: 33c4ca5349c8eb706f850ae79dbc30aabf96d6c65fe6ea120d0092e897bfc66d88583be502f995950f7c212ec729af217ba03bc4e16edf6ea27541a68540831d + languageName: node + linkType: hard + "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -7633,6 +10181,15 @@ __metadata: languageName: node linkType: hard +"astring@npm:^1.8.0": + version: 1.9.0 + resolution: "astring@npm:1.9.0" + bin: + astring: bin/astring + checksum: 69ffde3643f5280c6846231a995af878a94d3eab41d1a19a86b8c15f456453f63a7982cf5dd72d270b9f50dd26763a3e1e48377c961b7df16f550132b6dba805 + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -7685,6 +10242,23 @@ __metadata: languageName: node linkType: hard +"autoprefixer@npm:^10.4.19, autoprefixer@npm:^10.4.23": + version: 10.4.24 + resolution: "autoprefixer@npm:10.4.24" + dependencies: + browserslist: ^4.28.1 + caniuse-lite: ^1.0.30001766 + fraction.js: ^5.3.4 + picocolors: ^1.1.1 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: c13d69ab38ee3646b2935a2462df45a48447d393eb8f01d2d8c65311dff40b7ae3b8ea0d868b279cfc13802c8c5d119150f63e5bf20013eb93b09b3314c6424e + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -7752,6 +10326,28 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: ^4.0.0 + schema-utils: ^4.0.0 + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: e1858d7625ad7cc8cabe6bbb8657f957041ffb1308375f359e92aa1654f413bfbb86a281bbf7cd4f7fff374d571c637b117551deac0231d779a198d4e4e78331 + languageName: node + linkType: hard + +"babel-plugin-dynamic-import-node@npm:^2.3.3": + version: 2.3.3 + resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" + dependencies: + object.assign: ^4.1.0 + checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b + languageName: node + linkType: hard + "babel-plugin-istanbul@npm:^6.1.1": version: 6.1.1 resolution: "babel-plugin-istanbul@npm:6.1.1" @@ -7810,6 +10406,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.15 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.15" + dependencies: + "@babel/compat-data": ^7.28.6 + "@babel/helper-define-polyfill-provider": ^0.6.6 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: cf32e00ee54cdd75a3acec408f3467edc20cff4359c2bc5fb221144a489d6c0d5936031e18d66483613194a7012034b8a9e1237b84e9063f963f352efc1558bc + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.13.0": version: 0.13.0 resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" @@ -7822,6 +10431,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.0" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.6 + core-js-compat: ^3.48.0 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: dda87e15dd4e36e989fafe3719d9e67ad1ebcfae3530d1b46f285439ecdd1709b147d7a656b10091b37f6490630836fe454755bc8f829d237ada1ac44603ff81 + languageName: node + linkType: hard + "babel-plugin-polyfill-regenerator@npm:^0.6.5": version: 0.6.5 resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" @@ -7833,6 +10454,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.6 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.6" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.6 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 + languageName: node + linkType: hard + "babel-plugin-transform-react-remove-prop-types@npm:^0.4.24": version: 0.4.24 resolution: "babel-plugin-transform-react-remove-prop-types@npm:0.4.24" @@ -8076,7 +10708,7 @@ __metadata: languageName: node linkType: hard -"bonjour-service@npm:^1.0.11": +"bonjour-service@npm:^1.0.11, bonjour-service@npm:^1.2.1": version: 1.3.0 resolution: "bonjour-service@npm:1.3.0" dependencies: @@ -8109,6 +10741,38 @@ __metadata: languageName: node linkType: hard +"boxen@npm:^6.2.1": + version: 6.2.1 + resolution: "boxen@npm:6.2.1" + dependencies: + ansi-align: ^3.0.1 + camelcase: ^6.2.0 + chalk: ^4.1.2 + cli-boxes: ^3.0.0 + string-width: ^5.0.1 + type-fest: ^2.5.0 + widest-line: ^4.0.1 + wrap-ansi: ^8.0.1 + checksum: 2b3226092f1ff8e149c02979098c976552afa15f9e0231c9ed2dfcaaf84604494d16a6f13b647f718439f64d3140a088e822d47c7db00d2266e9ffc8d7321774 + languageName: node + linkType: hard + +"boxen@npm:^7.0.0": + version: 7.1.1 + resolution: "boxen@npm:7.1.1" + dependencies: + ansi-align: ^3.0.1 + camelcase: ^7.0.1 + chalk: ^5.2.0 + cli-boxes: ^3.0.0 + string-width: ^5.1.2 + type-fest: ^2.13.0 + widest-line: ^4.0.1 + wrap-ansi: ^8.1.0 + checksum: ad8833d5f2845b0a728fdf8a0bc1505dff0c518edcb0fd56979a08774b1f26cf48b71e66532179ccdfb9ed95b64aa008689cca26f7776f93f002b8000a683d76 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.12 resolution: "brace-expansion@npm:1.1.12" @@ -8160,7 +10824,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0, browserslist@npm:^4.28.0, browserslist@npm:^4.28.1": +"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.28.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -8215,6 +10879,15 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: ^7.0.0 + checksum: 1d966c8d2dbf4d9d394e53b724ac756c2414c45c01340b37743621f59cc565a435024b394ddcb62b9b335d1c9a31f4640eb648c3fec7f97ee74dc0694c9beb6c + languageName: node + linkType: hard + "bundle-require@npm:^4.0.4": version: 4.2.1 resolution: "bundle-require@npm:4.2.1" @@ -8235,6 +10908,13 @@ __metadata: languageName: node linkType: hard +"bytes@npm:3.0.0": + version: 3.0.0 + resolution: "bytes@npm:3.0.0" + checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 + languageName: node + linkType: hard + "bytes@npm:3.1.2, bytes@npm:^3.1.2, bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -8242,6 +10922,13 @@ __metadata: languageName: node linkType: hard +"bytestreamjs@npm:^2.0.1": + version: 2.0.1 + resolution: "bytestreamjs@npm:2.0.1" + checksum: db4cb039794675a0ec1f097d228e4897378cdf5f794dca04fc3bff63efb466524fcfac95e59e89e928822a80fad7574734c02b8eace9e841d8599da43c82768a + languageName: node + linkType: hard + "c12@npm:3.1.0": version: 3.1.0 resolution: "c12@npm:3.1.0" @@ -8293,6 +10980,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^7.0.0": + version: 7.0.0 + resolution: "cacheable-lookup@npm:7.0.0" + checksum: 9e2856763fc0a7347ab34d704c010440b819d4bb5e3593b664381b7433e942dd22e67ee5581f12256f908e79b82d30b86ebbacf40a081bfe10ee93fbfbc2d6a9 + languageName: node + linkType: hard + +"cacheable-request@npm:^10.2.8": + version: 10.2.14 + resolution: "cacheable-request@npm:10.2.14" + dependencies: + "@types/http-cache-semantics": ^4.0.2 + get-stream: ^6.0.1 + http-cache-semantics: ^4.1.1 + keyv: ^4.5.3 + mimic-response: ^4.0.0 + normalize-url: ^8.0.0 + responselike: ^3.0.0 + checksum: 56f2b8e1c497c91f8391f0b099d19907a7dde25e71087e622b23e45fc8061736c2a6964ef121b16f377c3c61079cf8dc17320ab54004209d1343e4d26aba7015 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -8363,6 +11072,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^7.0.1": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d + languageName: node + linkType: hard + "caniuse-api@npm:^3.0.0": version: 3.0.0 resolution: "caniuse-api@npm:3.0.0" @@ -8382,6 +11098,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001766": + version: 1.0.30001770 + resolution: "caniuse-lite@npm:1.0.30001770" + checksum: 5937fdfbb274211bffb883afb2bc9ab99bea75ea9923dc96baa4eda87c110c36b036ae3d981dc28b0c52807d7ecc7c1bf6b16b4a68dbd077b26faf37ccd1887b + languageName: node + linkType: hard + "canvas-confetti@npm:^1.9.3": version: 1.9.4 resolution: "canvas-confetti@npm:1.9.4" @@ -8459,6 +11182,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.0.1, chalk@npm:^5.2.0": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 4ee2d47a626d79ca27cb5299ecdcce840ef5755e287412536522344db0fc51ca0f6d6433202332c29e2288c6a90a2b31f3bd626bc8c14743b6b6ee28abd3b796 + languageName: node + linkType: hard + "change-case@npm:^4.1.2": version: 4.1.2 resolution: "change-case@npm:4.1.2" @@ -8553,6 +11283,35 @@ __metadata: languageName: node linkType: hard +"cheerio-select@npm:^2.1.0": + version: 2.1.0 + resolution: "cheerio-select@npm:2.1.0" + dependencies: + boolbase: ^1.0.0 + css-select: ^5.1.0 + css-what: ^6.1.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + checksum: 843d6d479922f28a6c5342c935aff1347491156814de63c585a6eb73baf7bb4185c1b4383a1195dca0f12e3946d737c7763bcef0b9544c515d905c5c44c5308b + languageName: node + linkType: hard + +"cheerio@npm:1.0.0-rc.12": + version: 1.0.0-rc.12 + resolution: "cheerio@npm:1.0.0-rc.12" + dependencies: + cheerio-select: ^2.1.0 + dom-serializer: ^2.0.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + htmlparser2: ^8.0.1 + parse5: ^7.0.0 + parse5-htmlparser2-tree-adapter: ^7.0.0 + checksum: 5d4c1b7a53cf22d3a2eddc0aff70cf23cbb30d01a4c79013e703a012475c02461aa1fcd99127e8d83a02216386ed6942b2c8103845fd0812300dd199e6e7e054 + languageName: node + linkType: hard + "chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -8632,12 +11391,39 @@ __metadata: languageName: node linkType: hard -"clean-css@npm:^5.2.2": - version: 5.3.3 - resolution: "clean-css@npm:5.3.3" +"clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: ~0.6.0 + checksum: 941987c14860dd7d346d5cf121a82fd2caf8344160b1565c5387f7ccca4bbcaf885bace961be37c4f4713ce2d8c488dd89483c1add47bb779790edbfdcc79cbc + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cli-boxes@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-boxes@npm:3.0.0" + checksum: 637d84419d293a9eac40a1c8c96a2859e7d98b24a1a317788e13c8f441be052fc899480c6acab3acc82eaf1bccda6b7542d7cdcf5c9c3cc39227175dc098d5b2 + languageName: node + linkType: hard + +"cli-table3@npm:^0.6.3": + version: 0.6.5 + resolution: "cli-table3@npm:0.6.5" dependencies: - source-map: ~0.6.0 - checksum: 941987c14860dd7d346d5cf121a82fd2caf8344160b1565c5387f7ccca4bbcaf885bace961be37c4f4713ce2d8c488dd89483c1add47bb779790edbfdcc79cbc + "@colors/colors": 1.5.0 + string-width: ^4.2.0 + dependenciesMeta: + "@colors/colors": + optional: true + checksum: ab7afbf4f8597f1c631f3ee6bb3481d0bfeac8a3b81cffb5a578f145df5c88003b6cfff46046a7acae86596fdd03db382bfa67f20973b6b57425505abc47e42c languageName: node linkType: hard @@ -8681,6 +11467,17 @@ __metadata: languageName: node linkType: hard +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + "clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" @@ -8713,6 +11510,13 @@ __metadata: languageName: node linkType: hard +"collapse-white-space@npm:^2.0.0": + version: 2.1.0 + resolution: "collapse-white-space@npm:2.1.0" + checksum: c8978b1f4e7d68bf846cfdba6c6689ce8910511df7d331eb6e6757e51ceffb52768d59a28db26186c91dcf9594955b59be9f8ccd473c485790f5d8b90dc6726f + languageName: node + linkType: hard + "collect-v8-coverage@npm:^1.0.0": version: 1.0.3 resolution: "collect-v8-coverage@npm:1.0.3" @@ -8752,7 +11556,7 @@ __metadata: languageName: node linkType: hard -"colord@npm:^2.9.1": +"colord@npm:^2.9.1, colord@npm:^2.9.3": version: 2.9.3 resolution: "colord@npm:2.9.3" checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 @@ -8766,6 +11570,13 @@ __metadata: languageName: node linkType: hard +"combine-promises@npm:^1.1.0": + version: 1.2.0 + resolution: "combine-promises@npm:1.2.0" + checksum: ddce91436e24da03d5dc360c59cd55abfc9da5e949a26255aa42761925c574797c43138f0aabfc364e184e738e5e218a94ac6e88ebc459045bcf048ac7fe5f07 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -8782,6 +11593,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -8796,6 +11614,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^5.1.0": + version: 5.1.0 + resolution: "commander@npm:5.1.0" + checksum: 0b7fec1712fbcc6230fcb161d8d73b4730fa91a21dc089515489402ad78810547683f058e2a9835929c212fead1d6a6ade70db28bbb03edbc2829a9ab7d69447 + languageName: node + linkType: hard + "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -8810,6 +11635,13 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 + languageName: node + linkType: hard + "common-tags@npm:^1.8.0": version: 1.8.2 resolution: "common-tags@npm:1.8.2" @@ -8840,7 +11672,7 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.4": +"compression@npm:^1.7.4, compression@npm:^1.8.1": version: 1.8.1 resolution: "compression@npm:1.8.1" dependencies: @@ -8910,6 +11742,29 @@ __metadata: languageName: node linkType: hard +"config-chain@npm:^1.1.11": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: ^1.3.4 + proto-list: ~1.2.1 + checksum: 828137a28e7c2fc4b7fb229bd0cd6c1397bcf83434de54347e608154008f411749041ee392cbe42fab6307e02de4c12480260bf769b7d44b778fdea3839eafab + languageName: node + linkType: hard + +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" + dependencies: + dot-prop: ^6.0.1 + graceful-fs: ^4.2.6 + unique-string: ^3.0.0 + write-file-atomic: ^3.0.3 + xdg-basedir: ^5.0.1 + checksum: 81995351c10bc04c58507f17748477aeac6f47465109d20e3534cebc881d22e927cfd29e73dd852c46c55f62c2b7be4cd1fe6eb3a93ba51f7f9813c218f9bae0 + languageName: node + linkType: hard + "confusing-browser-globals@npm:^1.0.11": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" @@ -8942,6 +11797,13 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:0.5.2": + version: 0.5.2 + resolution: "content-disposition@npm:0.5.2" + checksum: 298d7da63255a38f7858ee19c7b6aae32b167e911293174b4c1349955e97e78e1d0b0d06c10e229405987275b417cf36ff65cbd4821a98bc9df4e41e9372cde7 + languageName: node + linkType: hard + "content-disposition@npm:^1.0.0": version: 1.0.1 resolution: "content-disposition@npm:1.0.1" @@ -9031,6 +11893,22 @@ __metadata: languageName: node linkType: hard +"copy-webpack-plugin@npm:^11.0.0": + version: 11.0.0 + resolution: "copy-webpack-plugin@npm:11.0.0" + dependencies: + fast-glob: ^3.2.11 + glob-parent: ^6.0.1 + globby: ^13.1.1 + normalize-path: ^3.0.0 + schema-utils: ^4.0.0 + serialize-javascript: ^6.0.0 + peerDependencies: + webpack: ^5.1.0 + checksum: df4f8743f003a29ee7dd3d9b1789998a3a99051c92afb2ba2203d3dacfa696f4e757b275560fafb8f206e520a0aa78af34b990324a0e36c2326cefdeef3ca82e + languageName: node + linkType: hard + "core-js-compat@npm:^3.43.0": version: 3.47.0 resolution: "core-js-compat@npm:3.47.0" @@ -9040,6 +11918,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" + dependencies: + browserslist: ^4.28.1 + checksum: 2625622bc7c4a43a134f7d01eff48bde93100a4b5c11b6a3972bc22bcd403c6d060f26f4786ca21376fb159771f008738a5b6f283ad67b19f94e342fa8d28288 + languageName: node + linkType: hard + "core-js-pure@npm:^3.23.3": version: 3.47.0 resolution: "core-js-pure@npm:3.47.0" @@ -9047,6 +11934,13 @@ __metadata: languageName: node linkType: hard +"core-js-pure@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-pure@npm:3.48.0" + checksum: fdc8a26fa7d2cf7809c7943494660442267666a048d74739900b6a1ba7e4e52815d8203ef453d81ddd1b3dade5880a1275fefc13d884686e71a85e7fcdd69790 + languageName: node + linkType: hard + "core-js@npm:^3.19.2": version: 3.47.0 resolution: "core-js@npm:3.47.0" @@ -9054,6 +11948,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^3.31.1": + version: 3.48.0 + resolution: "core-js@npm:3.48.0" + checksum: e5ba89a2037b06827f198b7a39bf99eaf0ad696e27001b0137f17fcc4a7fce1ecaaa4ea7b3628709ee4cf6828130a2c53ec4bdf0064e1151d46965ca5a98733f + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -9097,6 +11998,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.5": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -9122,6 +12040,15 @@ __metadata: languageName: node linkType: hard +"crypto-random-string@npm:^4.0.0": + version: 4.0.0 + resolution: "crypto-random-string@npm:4.0.0" + dependencies: + type-fest: ^1.0.1 + checksum: 91f148f27bcc8582798f0fb3e75a09d9174557f39c3c40a89dd1bd70fb5a14a02548245aa26fa7d663c426ac5026f4729841231c84f9e30e8c8ece5e38656741 + languageName: node + linkType: hard + "css-blank-pseudo@npm:^3.0.3": version: 3.0.3 resolution: "css-blank-pseudo@npm:3.0.3" @@ -9135,6 +12062,17 @@ __metadata: languageName: node linkType: hard +"css-blank-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-blank-pseudo@npm:7.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 0720f013394141e129f757ffadb780a47be37fae71d195a1e8fbd02b038001bc2c3b62be83e397fe1fb1282ba656b7fce4e972d583defb6f8163e0d791c816a4 + languageName: node + linkType: hard + "css-box-model@npm:^1.2.1": version: 1.2.1 resolution: "css-box-model@npm:1.2.1" @@ -9153,6 +12091,15 @@ __metadata: languageName: node linkType: hard +"css-declaration-sorter@npm:^7.2.0": + version: 7.3.1 + resolution: "css-declaration-sorter@npm:7.3.1" + peerDependencies: + postcss: ^8.0.9 + checksum: ec56a50a1e7a8d56779d2b0de8739bfb0e271ae5002ebafff6c019cf3bb7ea64ff523c88dd23736ca20f19c3789f51c3ae928c429307266cd6abbb0baa90f19f + languageName: node + linkType: hard + "css-has-pseudo@npm:^3.0.4": version: 3.0.4 resolution: "css-has-pseudo@npm:3.0.4" @@ -9166,7 +12113,20 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.5.1": +"css-has-pseudo@npm:^7.0.3": + version: 7.0.3 + resolution: "css-has-pseudo@npm:7.0.3" + dependencies: + "@csstools/selector-specificity": ^5.0.0 + postcss-selector-parser: ^7.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 93ff31d4586ee4e797bdcb4a4a2c12af95019fd34fd326937c797b2aceaad367d83655c49a17f0bf9e4ee1370e4d39a1152f58b88be0211d3ea5a234e178fa43 + languageName: node + linkType: hard + +"css-loader@npm:^6.11.0, css-loader@npm:^6.5.1": version: 6.11.0 resolution: "css-loader@npm:6.11.0" dependencies: @@ -9215,6 +12175,44 @@ __metadata: languageName: node linkType: hard +"css-minimizer-webpack-plugin@npm:^5.0.1": + version: 5.0.1 + resolution: "css-minimizer-webpack-plugin@npm:5.0.1" + dependencies: + "@jridgewell/trace-mapping": ^0.3.18 + cssnano: ^6.0.1 + jest-worker: ^29.4.3 + postcss: ^8.4.24 + schema-utils: ^4.0.1 + serialize-javascript: ^6.0.1 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + "@parcel/css": + optional: true + "@swc/css": + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + checksum: 10055802c61d1ae72584eac03b6bd221ecbefde11d337be44a5459d8de075b38f91b80949f95cd0c3a10295615ee013f82130bfac5fe9b5b3e8e75531f232680 + languageName: node + linkType: hard + +"css-prefers-color-scheme@npm:^10.0.0": + version: 10.0.0 + resolution: "css-prefers-color-scheme@npm:10.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 02b634aac859f5b07482563e39fc415544f8b35064b6b73e93408892dccb86fbb2eff407df4ae666780ee06350601fc6cd3ca42bc05900c7062f52589723d350 + languageName: node + linkType: hard + "css-prefers-color-scheme@npm:^6.0.3": version: 6.0.3 resolution: "css-prefers-color-scheme@npm:6.0.3" @@ -9258,6 +12256,19 @@ __metadata: languageName: node linkType: hard +"css-select@npm:^5.1.0": + version: 5.2.2 + resolution: "css-select@npm:5.2.2" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.1.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + nth-check: ^2.0.1 + checksum: 0ab672620c6bdfe4129dfecf202f6b90f92018b24a1a93cfbb295c24026d0163130ba4b98d7443f87246a2c1d67413798a7a5920cd102b0cfecfbc89896515aa + languageName: node + linkType: hard + "css-tree@npm:1.0.0-alpha.37": version: 1.0.0-alpha.37 resolution: "css-tree@npm:1.0.0-alpha.37" @@ -9278,6 +12289,26 @@ __metadata: languageName: node linkType: hard +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: 2.0.30 + source-map-js: ^1.0.1 + checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 + languageName: node + linkType: hard + +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" + dependencies: + mdn-data: 2.0.28 + source-map-js: ^1.0.1 + checksum: b94aa8cc2f09e6f66c91548411fcf74badcbad3e150345074715012d16333ce573596ff5dfca03c2a87edf1924716db765120f94247e919d72753628ba3aba27 + languageName: node + linkType: hard + "css-what@npm:^3.2.1": version: 3.4.2 resolution: "css-what@npm:3.4.2" @@ -9285,7 +12316,7 @@ __metadata: languageName: node linkType: hard -"css-what@npm:^6.0.1": +"css-what@npm:^6.0.1, css-what@npm:^6.1.0": version: 6.2.2 resolution: "css-what@npm:6.2.2" checksum: 4d1f07b348a638e1f8b4c72804a1e93881f35e0f541256aec5ac0497c5855df7db7ab02da030de950d4813044f6d029a14ca657e0f92c3987e4b604246235b2b @@ -9306,6 +12337,13 @@ __metadata: languageName: node linkType: hard +"cssdb@npm:^8.6.0": + version: 8.7.1 + resolution: "cssdb@npm:8.7.1" + checksum: fd79c91001b0f1b7461a1eca7071a062fb4cb3da0a3bf2d017ae8dc7463f4fb1001487875269f95c0f0430079dae622c55f961f51bc20db7b94f61a607518cf9 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -9315,6 +12353,23 @@ __metadata: languageName: node linkType: hard +"cssnano-preset-advanced@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-advanced@npm:6.1.2" + dependencies: + autoprefixer: ^10.4.19 + browserslist: ^4.23.0 + cssnano-preset-default: ^6.1.2 + postcss-discard-unused: ^6.0.5 + postcss-merge-idents: ^6.0.3 + postcss-reduce-idents: ^6.0.3 + postcss-zindex: ^6.0.2 + peerDependencies: + postcss: ^8.4.31 + checksum: cf70e27915947412730abb3075587efb66bcea58d7f1b906a7225bb4a40c9ca40150251a2ac33363d4f55bbdeb9ba000c242fa6244ee36cba2477ac07fbbe791 + languageName: node + linkType: hard + "cssnano-preset-default@npm:^5.2.14": version: 5.2.14 resolution: "cssnano-preset-default@npm:5.2.14" @@ -9354,6 +12409,46 @@ __metadata: languageName: node linkType: hard +"cssnano-preset-default@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-default@npm:6.1.2" + dependencies: + browserslist: ^4.23.0 + css-declaration-sorter: ^7.2.0 + cssnano-utils: ^4.0.2 + postcss-calc: ^9.0.1 + postcss-colormin: ^6.1.0 + postcss-convert-values: ^6.1.0 + postcss-discard-comments: ^6.0.2 + postcss-discard-duplicates: ^6.0.3 + postcss-discard-empty: ^6.0.3 + postcss-discard-overridden: ^6.0.2 + postcss-merge-longhand: ^6.0.5 + postcss-merge-rules: ^6.1.1 + postcss-minify-font-values: ^6.1.0 + postcss-minify-gradients: ^6.0.3 + postcss-minify-params: ^6.1.0 + postcss-minify-selectors: ^6.0.4 + postcss-normalize-charset: ^6.0.2 + postcss-normalize-display-values: ^6.0.2 + postcss-normalize-positions: ^6.0.2 + postcss-normalize-repeat-style: ^6.0.2 + postcss-normalize-string: ^6.0.2 + postcss-normalize-timing-functions: ^6.0.2 + postcss-normalize-unicode: ^6.1.0 + postcss-normalize-url: ^6.0.2 + postcss-normalize-whitespace: ^6.0.2 + postcss-ordered-values: ^6.0.2 + postcss-reduce-initial: ^6.1.0 + postcss-reduce-transforms: ^6.0.2 + postcss-svgo: ^6.0.3 + postcss-unique-selectors: ^6.0.4 + peerDependencies: + postcss: ^8.4.31 + checksum: 51d93e52df7141143947dc4695b5087c04b41ea153e4f4c0282ac012b62c7457c6aca244f604ae94fa3b4840903a30a1e7df38f8610e0b304d05e3065375ee56 + languageName: node + linkType: hard + "cssnano-utils@npm:^3.1.0": version: 3.1.0 resolution: "cssnano-utils@npm:3.1.0" @@ -9363,6 +12458,15 @@ __metadata: languageName: node linkType: hard +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: f04c6854e75d847c7a43aff835e003d5bc7387ddfc476f0ad3a2d63663d0cec41047d46604c1717bf6b5a8e24e54bb519e465ff78d62c7e073c7cbe2279bebaf + languageName: node + linkType: hard + "cssnano@npm:^5.0.6": version: 5.1.15 resolution: "cssnano@npm:5.1.15" @@ -9376,6 +12480,18 @@ __metadata: languageName: node linkType: hard +"cssnano@npm:^6.0.1, cssnano@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano@npm:6.1.2" + dependencies: + cssnano-preset-default: ^6.1.2 + lilconfig: ^3.1.1 + peerDependencies: + postcss: ^8.4.31 + checksum: 65aad92c5ee0089ffd4cd933c18c65edbf7634f7c3cd833a499dc948aa7e4168be22130dfe83bde07fcdc87f7c45a02d09040b7f439498208bc90b8d5a9abcc8 + languageName: node + linkType: hard + "csso@npm:^4.0.2, csso@npm:^4.2.0": version: 4.2.0 resolution: "csso@npm:4.2.0" @@ -9385,6 +12501,15 @@ __metadata: languageName: node linkType: hard +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: ~2.2.0 + checksum: 0ad858d36bf5012ed243e9ec69962a867509061986d2ee07cc040a4b26e4d062c00d4c07e5ba8d430706ceb02dd87edd30a52b5937fd45b1b6f2119c4993d59a + languageName: node + linkType: hard + "cssom@npm:^0.4.4": version: 0.4.4 resolution: "cssom@npm:0.4.4" @@ -9582,6 +12707,13 @@ __metadata: languageName: node linkType: hard +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.6.0, debug@npm:^2.6.1": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -9686,13 +12818,30 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 languageName: node linkType: hard +"default-browser-id@npm:^5.0.0": + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.5.0 + resolution: "default-browser@npm:5.5.0" + dependencies: + bundle-name: ^4.1.0 + default-browser-id: ^5.0.0 + checksum: c5c5d84a4abd82850e98f06798a55dee87fc1064538bea00cc14c0fb2dccccbff5e9e07eeea80385fa653202d5d92509838b4239d610ddfa1c76a04a1f65e767 + languageName: node + linkType: hard + "default-gateway@npm:^6.0.3": version: 6.0.3 resolution: "default-gateway@npm:6.0.3" @@ -9702,6 +12851,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.1": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -9720,6 +12876,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 54884f94caac0791bf6395a3ec530ce901cf71c47b0196b8754f3fd17edb6c0e80149c1214429d851873bb0d689dbe08dcedbb2306dc45c8534a5934723851b6 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -9814,6 +12977,19 @@ __metadata: languageName: node linkType: hard +"detect-port@npm:^1.5.1": + version: 1.6.1 + resolution: "detect-port@npm:1.6.1" + dependencies: + address: ^1.0.1 + debug: 4 + bin: + detect: bin/detect-port.js + detect-port: bin/detect-port.js + checksum: 0429fa423abb15fc453face64e6ffa406e375f51f5b4421a7886962e680dc05824eae9b6ee4594ba273685c3add415ad00982b5da54802ac3de6f846173284c3 + languageName: node + linkType: hard + "devlop@npm:^1.0.0, devlop@npm:^1.1.0": version: 1.1.0 resolution: "devlop@npm:1.1.0" @@ -9958,6 +13134,17 @@ __metadata: languageName: node linkType: hard +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 + languageName: node + linkType: hard + "domelementtype@npm:1": version: 1.3.1 resolution: "domelementtype@npm:1.3.1" @@ -9965,7 +13152,7 @@ __metadata: languageName: node linkType: hard -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 @@ -9990,6 +13177,15 @@ __metadata: languageName: node linkType: hard +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c + languageName: node + linkType: hard + "domutils@npm:^1.7.0": version: 1.7.0 resolution: "domutils@npm:1.7.0" @@ -10011,6 +13207,17 @@ __metadata: languageName: node linkType: hard +"domutils@npm:^3.0.1": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" + dependencies: + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + checksum: ae941d56f03d857077d55dde9297e960a625229fc2b933187cc4123084d7c2d2517f58283a7336567127029f1e008449bac8ac8506d44341e29e3bb18e02f906 + languageName: node + linkType: hard + "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -10021,6 +13228,15 @@ __metadata: languageName: node linkType: hard +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: ^2.0.0 + checksum: 0f47600a4b93e1dc37261da4e6909652c008832a5d3684b5bf9a9a0d3f4c67ea949a86dceed9b72f5733ed8e8e6383cc5958df3bbd0799ee317fd181f2ece700 + languageName: node + linkType: hard + "dotenv-expand@npm:^5.1.0": version: 5.1.0 resolution: "dotenv-expand@npm:5.1.0" @@ -10060,6 +13276,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + "ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -10132,6 +13355,13 @@ __metadata: languageName: node linkType: hard +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: ea241c342abda5a86ffd3a15d8f4871a616d485f700e03daea38c6ce38205847cea9f6ff8d5e962c00516b004949cc96c6e37b05559ea71a0a496faba53b56da + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -10139,6 +13369,13 @@ __metadata: languageName: node linkType: hard +"emoticon@npm:^4.0.1": + version: 4.1.0 + resolution: "emoticon@npm:4.1.0" + checksum: b19c997ec063eef7dfacd8713e26bca8129683b58aaf6be1600723811ec5dae18974398b808ac2972183d06d00e6e51a5b88ee92e51c69680bb855776e279a64 + languageName: node + linkType: hard + "empathic@npm:2.0.0": version: 2.0.0 resolution: "empathic@npm:2.0.0" @@ -10181,6 +13418,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.19.0": + version: 5.19.0 + resolution: "enhanced-resolve@npm:5.19.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.3.0 + checksum: e7b30fa85a7831c79ad7b0aa15cde50e07eb9e770bc19266005821a596cf324f79d3b580223dccbd61e01a515cf4be09e1474745a4c47ad41d2d499b860314a5 + languageName: node + linkType: hard + "enquirer@npm:^2.3.5": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -10191,10 +13438,24 @@ __metadata: languageName: node linkType: hard -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 + languageName: node + linkType: hard + +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 937b952e81aca641660a6a07f70001c6821973dea3ae7f6a5013eadce94620f3ed2e9c745832d503c8811ce6e97704d8a0396159580c0e567d815234de7fdecf languageName: node linkType: hard @@ -10392,6 +13653,30 @@ __metadata: languageName: node linkType: hard +"esast-util-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "esast-util-from-estree@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + devlop: ^1.0.0 + estree-util-visit: ^2.0.0 + unist-util-position-from-estree: ^2.0.0 + checksum: b9ea5b6db25decbe7c3be23a00251542641c9538499905d740d76fd5c9fea9f727ad1d0cce4f2071b6d9bb2f405f4f11acbdec9b8ea6485649cf60d886b99f28 + languageName: node + linkType: hard + +"esast-util-from-js@npm:^2.0.0": + version: 2.0.1 + resolution: "esast-util-from-js@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + acorn: ^8.0.0 + esast-util-from-estree: ^2.0.0 + vfile-message: ^4.0.0 + checksum: a262b94d973d8cc80227e083a7f1367028c4acf524e8f8507177626302bac567f260f75ea52321c8a9650e34c47e70bcc4f7696f710002f64b21aaa630e73e43 + languageName: node + linkType: hard + "esbuild@npm:^0.17.0": version: 0.17.19 resolution: "esbuild@npm:0.17.19" @@ -10731,6 +14016,13 @@ __metadata: languageName: node linkType: hard +"escape-goat@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-goat@npm:4.0.0" + checksum: 7034e0025eec7b751074b837f10312c5b768493265bdad046347c0aadbc1e652776f7e5df94766473fecb5d3681169cc188fe9ccc1e22be53318c18be1671cc0 + languageName: node + linkType: hard + "escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -10759,6 +14051,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e + languageName: node + linkType: hard + "escodegen@npm:^1.8.1": version: 1.14.3 resolution: "escodegen@npm:1.14.3" @@ -11263,6 +14562,27 @@ __metadata: languageName: node linkType: hard +"estree-util-attach-comments@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-attach-comments@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + checksum: 56254eaef39659e6351919ebc2ae53a37a09290a14571c19e373e9d5fad343a3403d9ad0c23ae465d6e7d08c3e572fd56fb8c793efe6434a261bf1489932dbd5 + languageName: node + linkType: hard + +"estree-util-build-jsx@npm:^3.0.0": + version: 3.0.1 + resolution: "estree-util-build-jsx@npm:3.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + estree-walker: ^3.0.0 + checksum: 185eff060eda2ba32cecd15904db4f5ba0681159fbdf54f0f6586cd9411e77e733861a833d0aee3415e1d1fd4b17edf08bc9e9872cee98e6ec7b0800e1a85064 + languageName: node + linkType: hard + "estree-util-is-identifier-name@npm:^3.0.0": version: 3.0.0 resolution: "estree-util-is-identifier-name@npm:3.0.0" @@ -11270,6 +14590,46 @@ __metadata: languageName: node linkType: hard +"estree-util-scope@npm:^1.0.0": + version: 1.0.0 + resolution: "estree-util-scope@npm:1.0.0" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + checksum: df2ed1b4c078002d50f7e330980e7b6f2630a1f551102203ee5000b61ed8ce5720fe7b9bc1a238a5fded5cf0f157dbe516ad6807323f037b3bb594bd1a0d61bb + languageName: node + linkType: hard + +"estree-util-to-js@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-to-js@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + astring: ^1.8.0 + source-map: ^0.7.0 + checksum: 833edc94ab9978e0918f90261e0a3361bf4564fec4901f326d2237a9235d3f5fc6482da3be5acc545e702c8c7cb8bc5de5c7c71ba3b080eb1975bcfdf3923d79 + languageName: node + linkType: hard + +"estree-util-value-to-estree@npm:^3.0.1": + version: 3.5.0 + resolution: "estree-util-value-to-estree@npm:3.5.0" + dependencies: + "@types/estree": ^1.0.0 + checksum: 2966167c5aec7aa615f9046f9abd14996e0696be41316fe50ff5a5dba65d9fa3228664e721615469d2f0bdfab6db93674624054c172b18b57fc510bcfaf5cb60 + languageName: node + linkType: hard + +"estree-util-visit@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-visit@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/unist": ^3.0.0 + checksum: 6444b38f224322945a6d19ea81a8828a0eec64aefb2bf1ea791fe20df496f7b7c543408d637df899e6a8e318b638f66226f16378a33c4c2b192ba5c3f891121f + languageName: node + linkType: hard + "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" @@ -11277,7 +14637,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^3.0.3": +"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" dependencies: @@ -11293,6 +14653,13 @@ __metadata: languageName: node linkType: hard +"eta@npm:^2.2.0": + version: 2.2.0 + resolution: "eta@npm:2.2.0" + checksum: 6a09631481d4f26a9662a1eb736a65cc1cbc48e24935e6ff5d83a83b0cb509ea56d588d66d7c087d590601dc59bdabdac2356936b1b789d020eb0cf2d8304d54 + languageName: node + linkType: hard + "etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" @@ -11300,6 +14667,16 @@ __metadata: languageName: node linkType: hard +"eval@npm:^0.1.8": + version: 0.1.8 + resolution: "eval@npm:0.1.8" + dependencies: + "@types/node": "*" + require-like: ">= 0.1.1" + checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -11321,7 +14698,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"execa@npm:5.1.1, execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -11419,7 +14796,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.0.0, express@npm:^4.17.3": +"express@npm:^4.0.0, express@npm:^4.17.3, express@npm:^4.22.1": version: 4.22.1 resolution: "express@npm:4.22.1" dependencies: @@ -11501,6 +14878,15 @@ __metadata: languageName: node linkType: hard +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: ^0.1.0 + checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + "extend@npm:^3.0.0, extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -11538,7 +14924,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -11606,6 +14992,15 @@ __metadata: languageName: node linkType: hard +"fault@npm:^2.0.0": + version: 2.0.1 + resolution: "fault@npm:2.0.1" + dependencies: + format: ^0.2.0 + checksum: c9b30f47d95769177130a9409976a899ed31eb598450fbad5b0d39f2f5f56d5f4a9ff9257e0bee8407cb0fc3ce37165657888c6aa6d78472e403893104329b72 + languageName: node + linkType: hard + "faye-websocket@npm:^0.11.3": version: 0.11.4 resolution: "faye-websocket@npm:0.11.4" @@ -11636,6 +15031,24 @@ __metadata: languageName: node linkType: hard +"feed@npm:^4.2.2": + version: 4.2.2 + resolution: "feed@npm:4.2.2" + dependencies: + xml-js: ^1.6.11 + checksum: 2e6992a675a049511eef7bda8ca6c08cb9540cd10e8b275ec4c95d166228ec445a335fa8de990358759f248a92861e51decdcd32bf1c54737d5b7aed7c7ffe97 + languageName: node + linkType: hard + +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -11729,6 +15142,16 @@ __metadata: languageName: node linkType: hard +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: ^3.0.0 + pkg-dir: ^7.0.0 + checksum: 52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f + languageName: node + linkType: hard + "find-root@npm:^1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" @@ -11765,6 +15188,32 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: ^7.1.0 + path-exists: ^5.0.0 + checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 + languageName: node + linkType: hard + +"finishline-docs@workspace:docs-site": + version: 0.0.0-use.local + resolution: "finishline-docs@workspace:docs-site" + dependencies: + "@docusaurus/core": ^3.1.0 + "@docusaurus/module-type-aliases": ^3.1.0 + "@docusaurus/preset-classic": ^3.1.0 + "@docusaurus/types": ^3.1.0 + "@mdx-js/react": ^3.0.0 + clsx: ^2.0.0 + prism-react-renderer: ^2.3.0 + react: ^18.0.0 + react-dom: ^18.0.0 + languageName: unknown + linkType: soft + "finishline-express@workspace:.": version: 0.0.0-use.local resolution: "finishline-express@workspace:." @@ -11808,6 +15257,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.3.3 resolution: "flatted@npm:3.3.3" @@ -11865,6 +15323,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^2.1.2": + version: 2.1.4 + resolution: "form-data-encoder@npm:2.1.4" + checksum: e0b3e5950fb69b3f32c273944620f9861f1933df9d3e42066e038e26dfb343d0f4465de9f27e0ead1a09d9df20bc2eed06a63c2ca2f8f00949e7202bae9e29dd + languageName: node + linkType: hard + "form-data@npm:^3.0.0": version: 3.0.4 resolution: "form-data@npm:3.0.4" @@ -11891,6 +15356,13 @@ __metadata: languageName: node linkType: hard +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 646a60e1336250d802509cf24fb801e43bd4a70a07510c816fa133aa42cdbc9c21e66e9cc0801bb183c5b031c9d68be62e7fbb6877756e52357850f92aa28799 + languageName: node + linkType: hard + "formidable@npm:^2.1.2": version: 2.1.5 resolution: "formidable@npm:2.1.5" @@ -12018,6 +15490,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": + version: 11.3.3 + resolution: "fs-extra@npm:11.3.3" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb2acabbd1e04bcaca90eadfe98e6ffba1523b8009afbb9f4c0aae5efbca0bd0bf6c9a6831df5af5aaacb98d3e499898be848fb0c03d31ae7b9d1b053e81c151 + languageName: node + linkType: hard + "fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" @@ -12228,7 +15711,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.0": +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad @@ -12278,6 +15761,13 @@ __metadata: languageName: node linkType: hard +"github-slugger@npm:^1.5.0": + version: 1.5.0 + resolution: "github-slugger@npm:1.5.0" + checksum: c70988224578b3bdaa25df65973ffc8c24594a77a28550c3636e495e49d17aef5cdb04c04fa3f1744babef98c61eecc6a43299a13ea7f3cc33d680bf9053ffbe + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -12287,7 +15777,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -12296,6 +15786,15 @@ __metadata: languageName: node linkType: hard +"glob-to-regex.js@npm:^1.0.0, glob-to-regex.js@npm:^1.0.1": + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" + peerDependencies: + tslib: 2 + checksum: ed7797dae9469a62f581213fb4e4272a58650896935b3ccd842a3bfafc7845caffc1510e3a02c3fae647d3740b87a51b5bcc7cc621678b9abc663babcfb3088c + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -12328,6 +15827,15 @@ __metadata: languageName: node linkType: hard +"global-dirs@npm:^3.0.0": + version: 3.0.1 + resolution: "global-dirs@npm:3.0.1" + dependencies: + ini: 2.0.0 + checksum: 70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 + languageName: node + linkType: hard + "global-modules@npm:^2.0.0": version: 2.0.0 resolution: "global-modules@npm:2.0.0" @@ -12388,6 +15896,19 @@ __metadata: languageName: node linkType: hard +"globby@npm:^13.1.1": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: ^3.0.1 + fast-glob: ^3.3.0 + ignore: ^5.2.4 + merge2: ^1.4.1 + slash: ^4.0.0 + checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e + languageName: node + linkType: hard + "google-auth-library@npm:^8.0.2, google-auth-library@npm:^8.1.1": version: 8.9.0 resolution: "google-auth-library@npm:8.9.0" @@ -12468,6 +15989,32 @@ __metadata: languageName: node linkType: hard +"got@npm:^12.1.0": + version: 12.6.1 + resolution: "got@npm:12.6.1" + dependencies: + "@sindresorhus/is": ^5.2.0 + "@szmarczak/http-timer": ^5.0.1 + cacheable-lookup: ^7.0.0 + cacheable-request: ^10.2.8 + decompress-response: ^6.0.0 + form-data-encoder: ^2.1.2 + get-stream: ^6.0.1 + http2-wrapper: ^2.1.10 + lowercase-keys: ^3.0.0 + p-cancelable: ^3.0.0 + responselike: ^3.0.0 + checksum: 3c37f5d858aca2859f9932e7609d35881d07e7f2d44c039d189396f0656896af6c77c22f2c51c563f8918be483f60ff41e219de742ab4642d4b106711baccbd5 + languageName: node + linkType: hard + +"graceful-fs@npm:4.2.10": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -12489,6 +16036,18 @@ __metadata: languageName: node linkType: hard +"gray-matter@npm:^4.0.3": + version: 4.0.3 + resolution: "gray-matter@npm:4.0.3" + dependencies: + js-yaml: ^3.13.1 + kind-of: ^6.0.2 + section-matter: ^1.0.0 + strip-bom-string: ^1.0.0 + checksum: 37717bd424344487d655392251ce8d8878a1275ee087003e61208fba3bfd59cbb73a85b2159abf742ae95e23db04964813fdc33ae18b074208428b2528205222 + languageName: node + linkType: hard + "gtoken@npm:^6.1.0": version: 6.1.2 resolution: "gtoken@npm:6.1.2" @@ -12588,6 +16147,13 @@ __metadata: languageName: node linkType: hard +"has-yarn@npm:^3.0.0": + version: 3.0.0 + resolution: "has-yarn@npm:3.0.0" + checksum: b9e14e78e0a37bc070550c862b201534287bc10e62a86ec9c1f455ffb082db42817ce9aed914bd73f1d589bbf268520e194629ff2f62ff6b98a482c4bd2dcbfb + languageName: node + linkType: hard + "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -12597,6 +16163,76 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^8.0.0": + version: 8.0.3 + resolution: "hast-util-from-parse5@npm:8.0.3" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + devlop: ^1.0.0 + hastscript: ^9.0.0 + property-information: ^7.0.0 + vfile: ^6.0.0 + vfile-location: ^5.0.0 + web-namespaces: ^2.0.0 + checksum: 9ca68545a957a59f2bb18c834f1b7f72cdb1fc0d6b43233faa170e721c1f41da1bb0418b477b91332973c6bc2790a09bb07971fd8f0afe98b4cd111ea9fd7c8c + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 76087670d3b0b50b23a6cb70bca53a6176d6608307ccdbb3ed18b650b82e7c3513bfc40348f1389dc0c5ae872b9a768851f4335f44654abd7deafd6974c52402 + languageName: node + linkType: hard + +"hast-util-raw@npm:^9.0.0": + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + "@ungap/structured-clone": ^1.0.0 + hast-util-from-parse5: ^8.0.0 + hast-util-to-parse5: ^8.0.0 + html-void-elements: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + parse5: ^7.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 778961e2d3140362665b306caade3c12df3d03c48827a2cba3534411bb443323a86ad10ed8ef798dd7ebcccb1709edc8df7a62cedc67f69dc40482b6a855f14f + languageName: node + linkType: hard + +"hast-util-to-estree@npm:^3.0.0": + version: 3.1.3 + resolution: "hast-util-to-estree@npm:3.1.3" + dependencies: + "@types/estree": ^1.0.0 + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + estree-util-attach-comments: ^3.0.0 + estree-util-is-identifier-name: ^3.0.0 + hast-util-whitespace: ^3.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + property-information: ^7.0.0 + space-separated-tokens: ^2.0.0 + style-to-js: ^1.0.0 + unist-util-position: ^5.0.0 + zwitch: ^2.0.0 + checksum: 1db15b3a5a5958f61ed4e5e80dd248ed4ecca7e80c9241bb20cf4ee55721fd9a37b54aeb0caf86da2645ce3ce4dd217455d64418bb30339ddfb087e441e491b7 + languageName: node + linkType: hard + "hast-util-to-jsx-runtime@npm:^2.0.0": version: 2.3.6 resolution: "hast-util-to-jsx-runtime@npm:2.3.6" @@ -12620,6 +16256,21 @@ __metadata: languageName: node linkType: hard +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.1 + resolution: "hast-util-to-parse5@npm:8.0.1" + dependencies: + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + property-information: ^7.0.0 + space-separated-tokens: ^2.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: da35619354e03bb0bfc03d50873a7c9836383c384f46faa9a33b2e89c1381705ffc277c67daec059ae496084d2f404916159137456bd154a40682529b99d82ca + languageName: node + linkType: hard + "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -12629,6 +16280,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" + dependencies: + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-parse-selector: ^4.0.0 + property-information: ^7.0.0 + space-separated-tokens: ^2.0.0 + checksum: 2bbb9a3c2dc43c9dec7f6599ef45e5eefb1c2a5f75d33d005dc432e92bf9d7cfb6c0d927f15a7592bb48601d2b582ea2e4b1131a716ac3f7b618a07d88f9a5d7 + languageName: node + linkType: hard + "he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -12713,7 +16377,7 @@ __metadata: languageName: node linkType: hard -"html-escaper@npm:^2.0.0": +"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 @@ -12737,6 +16401,30 @@ __metadata: languageName: node linkType: hard +"html-minifier-terser@npm:^7.2.0": + version: 7.2.0 + resolution: "html-minifier-terser@npm:7.2.0" + dependencies: + camel-case: ^4.1.2 + clean-css: ~5.3.2 + commander: ^10.0.0 + entities: ^4.4.0 + param-case: ^3.0.4 + relateurl: ^0.2.7 + terser: ^5.15.1 + bin: + html-minifier-terser: cli.js + checksum: 39feed354b5a8aafc8e910977d68cfd961d6db330a8e1a5b16a528c86b8ee7745d8945134822cf00acf7bf0d0135bf1abad650bf308bee4ea73adb003f5b8656 + languageName: node + linkType: hard + +"html-tags@npm:^3.3.1": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce + languageName: node + linkType: hard + "html-url-attributes@npm:^3.0.0": version: 3.0.1 resolution: "html-url-attributes@npm:3.0.1" @@ -12744,6 +16432,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 59be397525465a7489028afa064c55763d9cccd1d7d9f630cca47137317f0e897a9ca26cef7e745e7cff1abc44260cfa407742b243a54261dfacd42230e94fce + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.5.0": version: 5.6.5 resolution: "html-webpack-plugin@npm:5.6.5" @@ -12765,6 +16460,27 @@ __metadata: languageName: node linkType: hard +"html-webpack-plugin@npm:^5.6.0": + version: 5.6.6 + resolution: "html-webpack-plugin@npm:5.6.6" + dependencies: + "@types/html-minifier-terser": ^6.0.0 + html-minifier-terser: ^6.0.2 + lodash: ^4.17.21 + pretty-error: ^4.0.0 + tapable: ^2.0.0 + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 6aab02f4be85ed2d939bd7dff296bf4af4b7288d6523670176c143d67f7cd4163daa1070c459d1c40e75b233f7fccefae714f58c3402a78aa83dbe9378ecf76f + languageName: node + linkType: hard + "htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" @@ -12777,6 +16493,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^8.0.1": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + entities: ^4.4.0 + checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" @@ -12844,7 +16572,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.3": +"http-proxy-middleware@npm:^2.0.3, http-proxy-middleware@npm:^2.0.9": version: 2.0.9 resolution: "http-proxy-middleware@npm:2.0.9" dependencies: @@ -12873,6 +16601,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^2.1.10": + version: 2.2.1 + resolution: "http2-wrapper@npm:2.2.1" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.2.0 + checksum: e95e55e22c6fd61182ce81fecb9b7da3af680d479febe8ad870d05f7ebbc9f076e455193766f4e7934e50913bf1d8da3ba121fb5cd2928892390b58cf9d5c509 + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -12900,6 +16638,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 210029d1c86926f09109f6317d143f8b056fc38e8dd11b0c3e3205fc6c6ff8429fb55b4b9c2bce065462719ed9d34366eced387aaa0035d93eb76b306a8547ef + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24, iconv-lite@npm:~0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -12973,13 +16718,22 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.3.1": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard +"image-size@npm:^2.0.2": + version: 2.0.2 + resolution: "image-size@npm:2.0.2" + bin: + image-size: bin/image-size.js + checksum: 33c3fafdd8af6bb2727bca51c4bae6e6dac16e9715337a6685a1af29fcbf7a2f9ec75eeaaa61e82d20f74d6f1fa748110936e32b1dbea4521217133eb159a29d + languageName: node + linkType: hard + "immer@npm:^9.0.7": version: 9.0.21 resolution: "immer@npm:9.0.21" @@ -12994,7 +16748,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" dependencies: @@ -13004,6 +16758,13 @@ __metadata: languageName: node linkType: hard +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + languageName: node + linkType: hard + "import-local@npm:^3.0.2": version: 3.2.0 resolution: "import-local@npm:3.2.0" @@ -13030,6 +16791,13 @@ __metadata: languageName: node linkType: hard +"infima@npm:0.2.0-alpha.45": + version: 0.2.0-alpha.45 + resolution: "infima@npm:0.2.0-alpha.45" + checksum: 23e5a33b147cb3940194c23e249001e7988327bb27896b121883442bce42a532248387649eec74d008dadadcddc790fb6842f043f33c78fda35e29f0b720cf8c + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -13054,7 +16822,14 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.5, ini@npm:~1.3.0": +"ini@npm:2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 @@ -13086,6 +16861,15 @@ __metadata: languageName: node linkType: hard +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: ^1.0.0 + checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + languageName: node + linkType: hard + "ip-address@npm:^10.0.1": version: 10.1.0 resolution: "ip-address@npm:10.1.0" @@ -13100,7 +16884,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": +"ipaddr.js@npm:^2.0.1, ipaddr.js@npm:^2.1.0": version: 2.3.0 resolution: "ipaddr.js@npm:2.3.0" checksum: 275602ad56e765d6c4187c1ab1a17d415da7a263e8d3278da5bdb6db147b29c56fac7e98a3f68b05d25e0b515601f1e750c2dd8ec9a871eb93ea094643b84916 @@ -13190,6 +16974,17 @@ __metadata: languageName: node linkType: hard +"is-ci@npm:^3.0.1": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" + dependencies: + ci-info: ^3.2.0 + bin: + is-ci: bin.js + checksum: 192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e + languageName: node + linkType: hard + "is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" @@ -13236,6 +17031,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-electron@npm:2.2.2": version: 2.2.2 resolution: "is-electron@npm:2.2.2" @@ -13243,6 +17047,13 @@ __metadata: languageName: node linkType: hard +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -13302,6 +17113,27 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: ^3.0.0 + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + +"is-installed-globally@npm:^0.4.0": + version: 0.4.0 + resolution: "is-installed-globally@npm:0.4.0" + dependencies: + global-dirs: ^3.0.0 + is-path-inside: ^3.0.2 + checksum: 3359840d5982d22e9b350034237b2cda2a12bac1b48a721912e1ab8e0631dd07d45a2797a120b7b87552759a65ba03e819f1bd63f2d7ab8657ec0b44ee0bf399 + languageName: node + linkType: hard + "is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -13323,6 +17155,13 @@ __metadata: languageName: node linkType: hard +"is-network-error@npm:^1.0.0": + version: 1.3.0 + resolution: "is-network-error@npm:1.3.0" + checksum: 56dc0b8ed9c0bb72202058f172ad0c3121cf68772e8cbba343d3775f6e2ec7877d423cbcea45f4cedcd345de8693de1b52dfe0c6fc15d652c4aa98c2abf0185a + languageName: node + linkType: hard + "is-node-process@npm:^1.2.0": version: 1.2.0 resolution: "is-node-process@npm:1.2.0" @@ -13330,6 +17169,13 @@ __metadata: languageName: node linkType: hard +"is-npm@npm:^6.0.0": + version: 6.1.0 + resolution: "is-npm@npm:6.1.0" + checksum: 54779c55419da537da77f0f41a409516148d09f1c6db9063ee6598783b309abab109ce4f540ef68c45f4dc1fec8600ed251e393029da31691fa93ce18e72243a + languageName: node + linkType: hard + "is-number-object@npm:^1.1.1": version: 1.1.1 resolution: "is-number-object@npm:1.1.1" @@ -13354,7 +17200,14 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 @@ -13375,6 +17228,15 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + "is-potential-custom-element-name@npm:^1.0.1": version: 1.0.1 resolution: "is-potential-custom-element-name@npm:1.0.1" @@ -13510,6 +17372,22 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.1 + resolution: "is-wsl@npm:3.1.1" + dependencies: + is-inside-container: ^1.0.0 + checksum: 513d95b89af0e60b43d7b17ecb7eb78edea0a439136a3da37b1b56e215379cc46a9221474ad5b2de044824ca72d7869dee6e015273dc3f71f2bb87c715f9f1dc + languageName: node + linkType: hard + +"is-yarn-global@npm:^0.4.0": + version: 0.4.1 + resolution: "is-yarn-global@npm:0.4.1" + checksum: 79ec4e6f581c53d4fefdf5f6c237f9a3ad8db29c85cdc4659e76ae345659317552052a97b7e56952aa5d94a23c798ebec8ccad72fb14d3b26dc647ddceddd716 + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -13545,6 +17423,13 @@ __metadata: languageName: node linkType: hard +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -14259,6 +18144,18 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:^29.4.3": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "*" + jest-util: ^29.7.0 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 + languageName: node + linkType: hard + "jest@npm:^27.4.3": version: 27.5.1 resolution: "jest@npm:27.5.1" @@ -14277,7 +18174,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.21.7": +"jiti@npm:^1.20.0, jiti@npm:^1.21.7": version: 1.21.7 resolution: "jiti@npm:1.21.7" bin: @@ -14295,6 +18192,19 @@ __metadata: languageName: node linkType: hard +"joi@npm:^17.9.2": + version: 17.13.3 + resolution: "joi@npm:17.13.3" + dependencies: + "@hapi/hoek": ^9.3.0 + "@hapi/topo": ^5.1.0 + "@sideway/address": ^4.1.5 + "@sideway/formula": ^3.0.1 + "@sideway/pinpoint": ^2.0.0 + checksum: 66ed454fee3d8e8da1ce21657fd2c7d565d98f3e539d2c5c028767e5f38cbd6297ce54df8312d1d094e62eb38f9452ebb43da4ce87321df66cf5e3f128cbc400 + languageName: node + linkType: hard + "joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -14596,7 +18506,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b @@ -14633,6 +18543,15 @@ __metadata: languageName: node linkType: hard +"latest-version@npm:^7.0.0": + version: 7.0.0 + resolution: "latest-version@npm:7.0.0" + dependencies: + package-json: ^8.1.0 + checksum: 1f0deba00d5a34394cce4463c938811f51bbb539b131674f4bb2062c63f2cc3b80bccd56ecade3bd5932d04a34cf0a5a8a2ccc4ec9e5e6b285a9a7b3e27d0d66 + languageName: node + linkType: hard + "launch-editor@npm:^2.6.0": version: 2.12.0 resolution: "launch-editor@npm:2.12.0" @@ -14643,6 +18562,16 @@ __metadata: languageName: node linkType: hard +"launch-editor@npm:^2.6.1": + version: 2.13.0 + resolution: "launch-editor@npm:2.13.0" + dependencies: + picocolors: ^1.1.1 + shell-quote: ^1.8.3 + checksum: 87260fe657978276d71b2ee3438fc490e7d1337ab2afcd0692000e7c70b5cc88d2b69b76044ef1c82347cdb955af8f7fb1f95aa150f869d4b44a9b3e2aae4a8b + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -14751,6 +18680,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: ^6.0.0 + checksum: c1b653bdf29beaecb3d307dfb7c44d98a2a98a02ebe353c9ad055d1ac45d6ed4e1142563d222df9b9efebc2bcb7d4c792b507fad9e7150a04c29530b7db570f8 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -14870,7 +18808,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -14897,6 +18835,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^3.0.0": + version: 3.0.0 + resolution: "lowercase-keys@npm:3.0.0" + checksum: 67a3f81409af969bc0c4ca0e76cd7d16adb1e25aa1c197229587eaf8671275c8c067cd421795dbca4c81be0098e4c426a086a05e30de8a9c587b7a13c0c7ccc5 + languageName: node + linkType: hard + "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": version: 11.2.4 resolution: "lru-cache@npm:11.2.4" @@ -15016,40 +18961,183 @@ __metadata: languageName: node linkType: hard -"match-sorter@npm:^6.0.2": - version: 6.3.4 - resolution: "match-sorter@npm:6.3.4" +"markdown-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-extensions@npm:2.0.0" + checksum: ec4ffcb0768f112e778e7ac74cb8ef22a966c168c3e6c29829f007f015b0a0b5c79c73ee8599a0c72e440e7f5cfdbf19e80e2d77b9a313b8f66e180a330cf1b2 + languageName: node + linkType: hard + +"markdown-table@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-table@npm:2.0.0" + dependencies: + repeat-string: ^1.0.0 + checksum: 9bb634a9300016cbb41216c1eab44c74b6b7083ac07872e296f900a29449cf0e260ece03fa10c3e9784ab94c61664d1d147da0315f95e1336e2bdcc025615c90 + languageName: node + linkType: hard + +"markdown-table@npm:^3.0.0": + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: bc24b177cbb3ef170cb38c9f191476aa63f7236ebc8980317c5e91b5bf98c8fb471cf46d8920478c5e770d7f4337326f6b5b3efbf0687c2044fd332d7a64dfcb + languageName: node + linkType: hard + +"match-sorter@npm:^6.0.2": + version: 6.3.4 + resolution: "match-sorter@npm:6.3.4" + dependencies: + "@babel/runtime": ^7.23.8 + remove-accents: 0.5.0 + checksum: 950c1600173a639e216947559a389b64258d52f33aea3a6ddb97500589888b83c976a028f731f40bc08d9d8af20de7916992fabb403f38330183a1df44c7634b + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + +"mdast-util-directive@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-directive@npm:3.1.0" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 9c4592cb719bbf4c9e6c7761fa9d378bb7c72fbb1b60b6ef2ee74b8a7592df2f47e625e1b3c4d5d419e94d5ca8d6c8dcc474938323e324b15362583d3f63723f + languageName: node + linkType: hard + +"mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" + dependencies: + "@types/mdast": ^4.0.0 + escape-string-regexp: ^5.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 00dde8aaf87d065034b911bdae20d17c107f5103c6ba5a3d117598c847ce005c6b03114b5603e0d07cc61fefcbb05bdb9f66100efeaa0278dbd80eda1087595f + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + mdast-util-to-string: ^4.0.0 + micromark: ^4.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 1ad19f48b30ac6e0cb756070c210c78ad93c26876edfb3f75127783bc6df8b9402016d8f3e9964f3d1d5430503138ec65c145e869438727e1aa7f3cebf228fba + languageName: node + linkType: hard + +"mdast-util-frontmatter@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-frontmatter@npm:2.0.1" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + escape-string-regexp: ^5.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + micromark-extension-frontmatter: ^2.0.0 + checksum: 86a7c8d9eb183be2621d6d9134b9d33df2a3647e3255f68a9796e2425e25643ffae00a501e36c57d9c10973087b94aa5a2ffd865d33cdd274cc9b88cd2d90a2e + languageName: node + linkType: hard + +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" + dependencies: + "@types/mdast": ^4.0.0 + ccount: ^2.0.0 + devlop: ^1.0.0 + mdast-util-find-and-replace: ^3.0.0 + micromark-util-character: ^2.0.0 + checksum: 5630b12e072d7004cb132231c94f667fb5813486779cb0dfb0a196d7ae0e048897a43b0b37e080017adda618ddfcbea1d7bf23c0fa31c87bfc683e0898ea1cfe + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + checksum: a23c5531d63b254b46cbcb063b5731f56ccc9d1f038a17fa66d3994255868604a2b963f24e0f5b16dd3374743622afafcfe0c98cf90548d485bdc426ba77c618 + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: fe9b1d0eba9b791ff9001c008744eafe3dd7a81b085f2bf521595ce4a8e8b1b44764ad9361761ad4533af3e5d913d8ad053abec38172031d9ee32a8ebd1c7dbd + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" dependencies: - "@babel/runtime": ^7.23.8 - remove-accents: 0.5.0 - checksum: 950c1600173a639e216947559a389b64258d52f33aea3a6ddb97500589888b83c976a028f731f40bc08d9d8af20de7916992fabb403f38330183a1df44c7634b + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + markdown-table: ^3.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 063a627fd0993548fd63ca0c24c437baf91ba7d51d0a38820bd459bc20bf3d13d7365ef8d28dca99176dd5eb26058f7dde51190479c186dfe6af2e11202957c9 languageName: node linkType: hard -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 37db90c59b15330fc54d790404abf5ef9f2f83e8961c53666fe7de4aab8dd5e6b3c296b6be19797456711a89a27840291d8871ff0438e9b4e15c89d170efe072 languageName: node linkType: hard -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.2 - resolution: "mdast-util-from-markdown@npm:2.0.2" +"mdast-util-gfm@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" dependencies: - "@types/mdast": ^4.0.0 - "@types/unist": ^3.0.0 - decode-named-character-reference: ^1.0.0 - devlop: ^1.0.0 - mdast-util-to-string: ^4.0.0 - micromark: ^4.0.0 - micromark-util-decode-numeric-character-reference: ^2.0.0 - micromark-util-decode-string: ^2.0.0 - micromark-util-normalize-identifier: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - unist-util-stringify-position: ^4.0.0 - checksum: 1ad19f48b30ac6e0cb756070c210c78ad93c26876edfb3f75127783bc6df8b9402016d8f3e9964f3d1d5430503138ec65c145e869438727e1aa7f3cebf228fba + mdast-util-from-markdown: ^2.0.0 + mdast-util-gfm-autolink-literal: ^2.0.0 + mdast-util-gfm-footnote: ^2.0.0 + mdast-util-gfm-strikethrough: ^2.0.0 + mdast-util-gfm-table: ^2.0.0 + mdast-util-gfm-task-list-item: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: ecdadc0b46608d03eea53366cfee8c9441ddacc49fe4e12934eff8fea06f9377d2679d9d9e43177295c09c8d7def5f48d739f99b0f6144a0e228a77f5a1c76bc languageName: node linkType: hard @@ -15087,6 +19175,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-mdx@npm:3.0.0" + dependencies: + mdast-util-from-markdown: ^2.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: e2b007d826fcd49fd57ed03e190753c8b0f7d9eff6c7cb26ba609cde15cd3a472c0cd5e4a1ee3e39a40f14be22fdb57de243e093cea0c064d6f3366cff3e3af2 + languageName: node + linkType: hard + "mdast-util-mdxjs-esm@npm:^2.0.0": version: 2.0.1 resolution: "mdast-util-mdxjs-esm@npm:2.0.1" @@ -15161,6 +19262,20 @@ __metadata: languageName: node linkType: hard +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: f51d587a6ebe8e426c3376c74ea6df3e19ec8241ed8e2466c9c8a3904d5d04397199ea4f15b8d34d14524b5de926d8724ae85207984be47e165817c26e49e0aa + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa + languageName: node + linkType: hard + "mdn-data@npm:2.0.4": version: 2.0.4 resolution: "mdn-data@npm:2.0.4" @@ -15191,6 +19306,30 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^4.43.1": + version: 4.56.10 + resolution: "memfs@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": 4.56.10 + "@jsonjoy.com/fs-fsa": 4.56.10 + "@jsonjoy.com/fs-node": 4.56.10 + "@jsonjoy.com/fs-node-builtins": 4.56.10 + "@jsonjoy.com/fs-node-to-fsa": 4.56.10 + "@jsonjoy.com/fs-node-utils": 4.56.10 + "@jsonjoy.com/fs-print": 4.56.10 + "@jsonjoy.com/fs-snapshot": 4.56.10 + "@jsonjoy.com/json-pack": ^1.11.0 + "@jsonjoy.com/util": ^1.9.0 + glob-to-regex.js: ^1.0.1 + thingies: ^2.5.0 + tree-dump: ^1.0.3 + tslib: ^2.0.0 + peerDependencies: + tslib: 2 + checksum: 25eb19575721872831384363fa39a5392915399dbd548a2bc872e20d020d502d2d129c77a39199303427f86a8f0c08b978c423eb52c912af0f0e46358d56c762 + languageName: node + linkType: hard + "memoize-one@npm:^6.0.0": version: 6.0.0 resolution: "memoize-one@npm:6.0.0" @@ -15269,6 +19408,202 @@ __metadata: languageName: node linkType: hard +"micromark-extension-directive@npm:^3.0.0": + version: 3.0.2 + resolution: "micromark-extension-directive@npm:3.0.2" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + parse-entities: ^4.0.0 + checksum: 572c9e4625bc6a37146f6c905cbc8b507f171c07ad0a6d991d6ee22bbde4620826b89303f80e71c30c7903e5fa0661e1f08fb14e69b5273b33afbd87276c8a53 + languageName: node + linkType: hard + +"micromark-extension-frontmatter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-frontmatter@npm:2.0.0" + dependencies: + fault: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: f68032df38c00ae47de15b63bcd72515bfcce39de4a9262a3a1ac9c5990f253f8e41bdc65fd17ec4bb3d144c32529ce0829571331e4901a9a413f1a53785d1e8 + languageName: node + linkType: hard + +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e00a570c70c837b9cbbe94b2c23b787f44e781cd19b72f1828e3453abca2a9fb600fa539cdc75229fa3919db384491063645086e02249481e6ff3ec2c18f767c + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: ac6fb039e98395d37b71ebff7c7a249aef52678b5cf554c89c4f716111d4be62ef99a5d715a5bd5d68fa549778c977d85cb671d1d8506dc8a3a1b46e867ae52f + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: cdb7a38dd6eefb6ceb6792a44a6796b10f951e8e3e45b8579f599f43e7ae26ccd048c0aa7e441b3c29dd0c54656944fe6eb0098de2bc4b5106fbc0a42e9e016c + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-extension-gfm-table@npm:2.1.1" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 16a59c8c2381c8418d9cf36c605abb0b66cfebaad07e09c4c9b113298d13e0c517b652885529fcb74d149afec3f6e8ab065fd27a900073d5ec0a1d8f0c51b593 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: cf21552f4a63592bfd6c96ae5d64a5f22bda4e77814e3f0501bfe80e7a49378ad140f827007f36044666f176b3a0d5fea7c2e8e7973ce4b4579b77789f01ae95 + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b1ad86a4e9d68d9ad536d94fb25a5182acbc85cc79318f4a6316034342f6a71d67983cc13f12911d0290fd09b2bda43cdabe8781a2d9cca2ebe0d421e8b2b8a4 + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: ^2.0.0 + micromark-extension-gfm-footnote: ^2.0.0 + micromark-extension-gfm-strikethrough: ^2.0.0 + micromark-extension-gfm-table: ^2.0.0 + micromark-extension-gfm-tagfilter: ^2.0.0 + micromark-extension-gfm-task-list-item: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 2060fa62666a09532d6b3a272d413bc1b25bbb262f921d7402795ac021e1362c8913727e33d7528d5b4ccaf26922ec51208c43f795a702964817bc986de886c9 + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^3.0.0": + version: 3.0.1 + resolution: "micromark-extension-mdx-expression@npm:3.0.1" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-factory-mdx-expression: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 0e15bc3911b53704723acc300d99093e46e31a1f2210f6fadeaf065d04c964cd4588cf4aa1e9c324430bfd943dfa7f36e369a3bc92f4641015b107bbb2190034 + languageName: node + linkType: hard + +"micromark-extension-mdx-jsx@npm:^3.0.0": + version: 3.0.2 + resolution: "micromark-extension-mdx-jsx@npm:3.0.2" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + micromark-factory-mdx-expression: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + vfile-message: ^4.0.0 + checksum: abe07e592a95804445d2c667bc999696ac39ddd551374f5a39e2d910c8b25e75bf61b4933213696f7bc26f4a5a56d91b3ce31d9a063b6fd7bbd4633565b1d6ec + languageName: node + linkType: hard + +"micromark-extension-mdx-md@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-mdx-md@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 7daf03372fd7faddf3f0ac87bdb0debb0bb770f33b586f72251e1072b222ceee75400ab6194c0e130dbf1e077369a5b627be6e9130d7a2e9e6b849f0d18ff246 + languageName: node + linkType: hard + +"micromark-extension-mdxjs-esm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-position-from-estree: ^2.0.0 + vfile-message: ^4.0.0 + checksum: fb33d850200afce567b95c90f2f7d42259bd33eea16154349e4fa77c3ec934f46c8e5c111acea16321dce3d9f85aaa4c49afe8b810e31b34effc11617aeee8f6 + languageName: node + linkType: hard + +"micromark-extension-mdxjs@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs@npm:3.0.0" + dependencies: + acorn: ^8.0.0 + acorn-jsx: ^5.0.0 + micromark-extension-mdx-expression: ^3.0.0 + micromark-extension-mdx-jsx: ^3.0.0 + micromark-extension-mdx-md: ^2.0.0 + micromark-extension-mdxjs-esm: ^3.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 7da6f0fb0e1e0270a2f5ad257e7422cc16e68efa7b8214c63c9d55bc264cb872e9ca4ac9a71b9dfd13daf52e010f730bac316086f4340e4fcc6569ec699915bf + languageName: node + linkType: hard + "micromark-factory-destination@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-destination@npm:2.0.1" @@ -15292,6 +19627,33 @@ __metadata: languageName: node linkType: hard +"micromark-factory-mdx-expression@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-factory-mdx-expression@npm:2.0.3" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-position-from-estree: ^2.0.0 + vfile-message: ^4.0.0 + checksum: f007987092a3bd00617f023d324caff10c63982e5125a3e3ff147baaf03f378e21c47306e2094b8c6480a726c57785c2175b4ffc3f3a6fde8be87e40fbdff068 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 + languageName: node + linkType: hard + "micromark-factory-space@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-space@npm:2.0.1" @@ -15326,6 +19688,16 @@ __metadata: languageName: node linkType: hard +"micromark-util-character@npm:^1.0.0, micromark-util-character@npm:^1.1.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 089e79162a19b4a28731736246579ab7e9482ac93cd681c2bfca9983dcff659212ef158a66a5957e9d4b1dba957d1b87b565d85418a5b009f0294f1f07f2aaac + languageName: node + linkType: hard + "micromark-util-character@npm:^2.0.0": version: 2.1.1 resolution: "micromark-util-character@npm:2.1.1" @@ -15394,6 +19766,21 @@ __metadata: languageName: node linkType: hard +"micromark-util-events-to-acorn@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-util-events-to-acorn@npm:2.0.3" + dependencies: + "@types/estree": ^1.0.0 + "@types/unist": ^3.0.0 + devlop: ^1.0.0 + estree-util-visit: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + vfile-message: ^4.0.0 + checksum: 8240f1aa072b3a2ec6df4fb55a0a19dd9f53923125a892da156e378b2af0333557f803f8da5228b03e5b1511c999701f0edbff9e483d00c5af5840f8466fb314 + languageName: node + linkType: hard + "micromark-util-html-tag-name@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-html-tag-name@npm:2.0.1" @@ -15442,6 +19829,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-symbol@npm:^1.0.0, micromark-util-symbol@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 02414a753b79f67ff3276b517eeac87913aea6c028f3e668a19ea0fc09d98aea9f93d6222a76ca783d20299af9e4b8e7c797fe516b766185dcc6e93290f11f88 + languageName: node + linkType: hard + "micromark-util-symbol@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-symbol@npm:2.0.1" @@ -15449,6 +19843,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-types@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: b0ef2b4b9589f15aec2666690477a6a185536927ceb7aa55a0f46475852e012d75a1ab945187e5c7841969a842892164b15d58ff8316b8e0d6cc920cabd5ede7 + languageName: node + linkType: hard + "micromark-util-types@npm:^2.0.0": version: 2.0.2 resolution: "micromark-util-types@npm:2.0.2" @@ -15512,6 +19913,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:~1.33.0": + version: 1.33.0 + resolution: "mime-db@npm:1.33.0" + checksum: 281a0772187c9b8f6096976cb193ac639c6007ac85acdbb8dc1617ed7b0f4777fa001d1b4f1b634532815e60717c84b2f280201d55677fb850c9d45015b50084 + languageName: node + linkType: hard + +"mime-types@npm:2.1.18": + version: 2.1.18 + resolution: "mime-types@npm:2.1.18" + dependencies: + mime-db: ~1.33.0 + checksum: 729265eff1e5a0e87cb7f869da742a610679585167d2f2ec997a7387fc6aedf8e5cad078e99b0164a927bdf3ace34fca27430d6487456ad090cba5594441ba43 + languageName: node + linkType: hard + "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:^2.1.35, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -15521,7 +19938,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^3.0.0, mime-types@npm:^3.0.2": +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1, mime-types@npm:^3.0.2": version: 3.0.2 resolution: "mime-types@npm:3.0.2" dependencies: @@ -15562,6 +19979,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-response@npm:4.0.0" + checksum: 33b804cc961efe206efdb1fca6a22540decdcfce6c14eb5c0c50e5ae9022267ab22ce8f5568b1f7247ba67500fe20d523d81e0e9f009b321ccd9d472e78d1850 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -15577,7 +20001,19 @@ __metadata: tapable: ^2.2.1 peerDependencies: webpack: ^5.0.0 - checksum: 4ec46ebdcb5dae4b1c012debca90fea27b1e8e7790d408154232d77d25f56f839e7b1ec5401a962d6356e7b9301c760d2ef62e1cb0d4d7b6ec8209f812733dda + checksum: 4ec46ebdcb5dae4b1c012debca90fea27b1e8e7790d408154232d77d25f56f839e7b1ec5401a962d6356e7b9301c760d2ef62e1cb0d4d7b6ec8209f812733dda + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:^2.9.2": + version: 2.10.0 + resolution: "mini-css-extract-plugin@npm:2.10.0" + dependencies: + schema-utils: ^4.0.0 + tapable: ^2.2.1 + peerDependencies: + webpack: ^5.0.0 + checksum: 53396dcf7ecf9706cc9d2a9fe5289e4c740b0f06978a9576b39fa973f54a69c7ccab33997a3bfa801608629c48d2c71dbcb735cf858780792bd4322779692c21 languageName: node linkType: hard @@ -15588,6 +20024,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + "minimatch@npm:^10.1.1": version: 10.1.1 resolution: "minimatch@npm:10.1.1" @@ -15597,15 +20042,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - "minimatch@npm:^5.0.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -15732,6 +20168,13 @@ __metadata: languageName: node linkType: hard +"mrmime@npm:^2.0.0": + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 455a555009edb2ed6e587e0fcb5e41fcbf8f1dcca28242a57d054f02204ab198bed93ba9de75db06bd3447e8603bc74e10a22440ba99431fc4a751435fba35bf + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -15919,6 +20362,18 @@ __metadata: languageName: node linkType: hard +"node-emoji@npm:^2.1.0": + version: 2.2.0 + resolution: "node-emoji@npm:2.2.0" + dependencies: + "@sindresorhus/is": ^4.6.0 + char-regex: ^1.0.2 + emojilib: ^2.4.0 + skin-tone: ^2.0.0 + checksum: 9642bee0b8c5f2124580e6a2d4c5ec868987bc77b6ce3a335bbec8db677082cbe1a9b72c11aac60043396a8d36e0afad4bcc33d92105d103d2d1b6a59106219a + languageName: node + linkType: hard + "node-fetch-native@npm:^1.6.6": version: 1.6.7 resolution: "node-fetch-native@npm:1.6.7" @@ -16033,6 +20488,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^8.0.0": + version: 8.1.1 + resolution: "normalize-url@npm:8.1.1" + checksum: 4fabd2fe2a2948384125282a4b8649ba5d470509c18576066c7aa8ee4809f5cb8a658861095dff4a04973bb5929f34c43b7ba192eb940a1ccd8324783a387060 + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -16042,6 +20504,13 @@ __metadata: languageName: node linkType: hard +"nprogress@npm:^0.2.0": + version: 0.2.0 + resolution: "nprogress@npm:0.2.0" + checksum: 66b7bec5d563ecf2d1c3d2815e6d5eb74ed815eee8563e0afa63d3f185ab1b9cf2ddd97e1ded263b9995c5019d26d600320e849e50f3747984daa033744619dc + languageName: node + linkType: hard + "nth-check@npm:^1.0.2": version: 1.0.2 resolution: "nth-check@npm:1.0.2" @@ -16060,6 +20529,18 @@ __metadata: languageName: node linkType: hard +"null-loader@npm:^4.0.1": + version: 4.0.1 + resolution: "null-loader@npm:4.0.1" + dependencies: + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: eeb4c4dd2f8f41e46f5665e4500359109e95ec1028a178a60e0161984906572da7dd87644bcc3cb29f0125d77e2b2508fb4f3813cfb1c6604a15865beb4b987b + languageName: node + linkType: hard + "nwsapi@npm:^2.2.0": version: 2.2.23 resolution: "nwsapi@npm:2.2.23" @@ -16110,7 +20591,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": +"object.assign@npm:^4.1.0, object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": version: 4.1.7 resolution: "object.assign@npm:4.1.7" dependencies: @@ -16241,6 +20722,18 @@ __metadata: languageName: node linkType: hard +"open@npm:^10.0.3": + version: 10.2.0 + resolution: "open@npm:10.2.0" + dependencies: + default-browser: ^5.2.1 + define-lazy-prop: ^3.0.0 + is-inside-container: ^1.0.0 + wsl-utils: ^0.1.0 + checksum: 64e2e1fb1dc5ab82af06c990467237b8fd349b1b9ecc6324d12df337a005d039cec11f758abea148be68878ccd616977005682c48ef3c5c7ba48bd3e5d6a3dbb + languageName: node + linkType: hard + "open@npm:^8.0.9, open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -16252,6 +20745,15 @@ __metadata: languageName: node linkType: hard +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -16298,6 +20800,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^3.0.0": + version: 3.0.0 + resolution: "p-cancelable@npm:3.0.0" + checksum: 2b5ae34218f9c2cf7a7c18e5d9a726ef9b165ef07e6c959f6738371509e747334b5f78f3bcdeb03d8a12dcb978faf641fd87eb21486ed7d36fb823b8ddef3219 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -16323,6 +20832,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: ^1.0.0 + checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b + languageName: node + linkType: hard + "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -16350,6 +20868,24 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: ^4.0.0 + checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + "p-map@npm:^7.0.2": version: 7.0.4 resolution: "p-map@npm:7.0.4" @@ -16357,7 +20893,7 @@ __metadata: languageName: node linkType: hard -"p-queue@npm:^6": +"p-queue@npm:^6, p-queue@npm:^6.6.2": version: 6.6.2 resolution: "p-queue@npm:6.6.2" dependencies: @@ -16377,6 +20913,17 @@ __metadata: languageName: node linkType: hard +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" + dependencies: + "@types/retry": 0.12.2 + is-network-error: ^1.0.0 + retry: ^0.13.1 + checksum: 73acd269544b1359b7f2aa5f907f6f8cd4947c596bc43cc25fecce2678e2f190095179407eb874f0e09fc5956ae7952c39ebb08c3d9334f59d41ae0b2d73ee6b + languageName: node + linkType: hard + "p-timeout@npm:^3.2.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" @@ -16400,6 +20947,18 @@ __metadata: languageName: node linkType: hard +"package-json@npm:^8.1.0": + version: 8.1.1 + resolution: "package-json@npm:8.1.1" + dependencies: + got: ^12.1.0 + registry-auth-token: ^5.0.1 + registry-url: ^6.0.0 + semver: ^7.3.7 + checksum: 28bec6f42bf9fba66b7c8fea07576fc23d08ec7923433f7835d6cd8654e72169d74f9738b3785107d18a476ae76712e0daeb1dddcd6930e69f9e4b47eba7c0ca + languageName: node + linkType: hard + "pako@npm:^1.0.10, pako@npm:^1.0.11, pako@npm:^1.0.6": version: 1.0.11 resolution: "pako@npm:1.0.11" @@ -16453,6 +21012,23 @@ __metadata: languageName: node linkType: hard +"parse-numeric-range@npm:^1.3.0": + version: 1.3.0 + resolution: "parse-numeric-range@npm:1.3.0" + checksum: 289ca126d5b8ace7325b199218de198014f58ea6895ccc88a5247491d07f0143bf047f80b4a31784f1ca8911762278d7d6ecb90a31dfae31da91cc1a2524c8ce + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^7.0.0": + version: 7.1.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.1.0" + dependencies: + domhandler: ^5.0.3 + parse5: ^7.0.0 + checksum: 98326fc5443e2149e10695adbfd0b0b3383c54398799f858b4ac2914adb199af8fcc90c2143aa5f7fd5f9482338f26ef253b468722f34d50bb215ec075d89fe9 + languageName: node + linkType: hard + "parse5@npm:6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -16460,6 +21036,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: ^6.0.0 + checksum: ffd040c4695d93f0bc370e3d6d75c1b352178514af41be7afa212475ea5cead1d6e377cd9d4cec6a5e2bcf497ca50daf9e0088eadaa37dbc271f60def08fdfcd + languageName: node + linkType: hard + "parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -16501,6 +21086,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -16508,6 +21100,13 @@ __metadata: languageName: node linkType: hard +"path-is-inside@npm:1.0.2": + version: 1.0.2 + resolution: "path-is-inside@npm:1.0.2" + checksum: 0b5b6c92d3018b82afb1f74fe6de6338c4c654de4a96123cb343f2b747d5606590ac0c890f956ed38220a4ab59baddfd7b713d78a62d240b20b14ab801fa02cb + languageName: node + linkType: hard + "path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -16532,6 +21131,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: bb249d08804f7961dd44fb175466c900b893c56e909db8e2a66ec12b9d9a964af269eb7a50892c933f52b47315953dfdb4279639fbce20977c3625a9ef3055fe + languageName: node + linkType: hard + "path-to-regexp@npm:^1.7.0": version: 1.9.0 resolution: "path-to-regexp@npm:1.9.0" @@ -16689,6 +21295,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: ^6.3.0 + checksum: 94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03 + languageName: node + linkType: hard + "pkg-types@npm:^2.2.0, pkg-types@npm:^2.3.0": version: 2.3.0 resolution: "pkg-types@npm:2.3.0" @@ -16709,6 +21324,20 @@ __metadata: languageName: node linkType: hard +"pkijs@npm:^3.3.3": + version: 3.3.3 + resolution: "pkijs@npm:3.3.3" + dependencies: + "@noble/hashes": 1.4.0 + asn1js: ^3.0.6 + bytestreamjs: ^2.0.1 + pvtsutils: ^1.3.6 + pvutils: ^1.1.3 + tslib: ^2.8.1 + checksum: b1b12435af6f7150b2c66988b719c8e514bf66e241f1ffb76fdfb4fd9090192b296147ae84a27e0bf1ebd809ceec156ae3157f388dc5b90a6c2979d7a7f6ae15 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -16727,6 +21356,17 @@ __metadata: languageName: node linkType: hard +"postcss-attribute-case-insensitive@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-attribute-case-insensitive@npm:7.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 18829dfc6dd2f6b1ca82afa8555f07ec8ac5687fe95612e353aa601b842bdec05ca78fc96016dba2b7d32607b31e085e5087fda00e1e0dfdc6c2a1b07b1b15c2 + languageName: node + linkType: hard + "postcss-browser-comments@npm:^4": version: 4.0.0 resolution: "postcss-browser-comments@npm:4.0.0" @@ -16749,6 +21389,18 @@ __metadata: languageName: node linkType: hard +"postcss-calc@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-calc@npm:9.0.1" + dependencies: + postcss-selector-parser: ^6.0.11 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.2 + checksum: 7327ed83bfec544ab8b3e38353baa72ff6d04378b856db4ad82dbd68ce0b73668867ef182b5d4025f9dd9aa9c64aacc50cd1bd9db8d8b51ccc4cb97866b9d72b + languageName: node + linkType: hard + "postcss-clamp@npm:^4.1.0": version: 4.1.0 resolution: "postcss-clamp@npm:4.1.0" @@ -16771,6 +21423,33 @@ __metadata: languageName: node linkType: hard +"postcss-color-functional-notation@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-color-functional-notation@npm:7.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: c3f59571330defde7c95256dbc2756ffd298072a6b167eb6751efb2f97ac267c081d7313556e3a4615cff8a46202f3c149bb2a456326805ca0cba5173faf5aad + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-hex-alpha@npm:10.0.0" + dependencies: + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 2dbbd66d76522c7d281c292589360f21806b6dd31a582484e7e4a848e5244d645d5c5e1b6c6219dd5fb7333808cd94a27dd0d2e1db093d043668ed7b42db59ad + languageName: node + linkType: hard + "postcss-color-hex-alpha@npm:^8.0.4": version: 8.0.4 resolution: "postcss-color-hex-alpha@npm:8.0.4" @@ -16782,6 +21461,18 @@ __metadata: languageName: node linkType: hard +"postcss-color-rebeccapurple@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-rebeccapurple@npm:10.0.0" + dependencies: + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 8ca0ee2b6b45ff62abdfc9b6757d8832d398c2e47dd705759485b685f544eaed81ec00f050a1bad67ffb5e6243332085a09807d47526ce3b43456b027119e0ae + languageName: node + linkType: hard + "postcss-color-rebeccapurple@npm:^7.1.1": version: 7.1.1 resolution: "postcss-color-rebeccapurple@npm:7.1.1" @@ -16807,6 +21498,20 @@ __metadata: languageName: node linkType: hard +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" + dependencies: + browserslist: ^4.23.0 + caniuse-api: ^3.0.0 + colord: ^2.9.3 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 55a1525de345d953bc7f32ecaa5ee6275ef0277c27d1f97ff06a1bd1a2fedf7f254e36dc1500621f1df20c25a6d2485a74a0b527d8ff74eb90726c76efe2ac8e + languageName: node + linkType: hard + "postcss-convert-values@npm:^5.1.3": version: 5.1.3 resolution: "postcss-convert-values@npm:5.1.3" @@ -16819,6 +21524,32 @@ __metadata: languageName: node linkType: hard +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" + dependencies: + browserslist: ^4.23.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 43e9f66af9bdec3c76695f9dde36885abc01f662c370c490b45d895459caab2c5792f906f3ddad107129133e41485a65634da7f699eef916a636e47f6a37a299 + languageName: node + linkType: hard + +"postcss-custom-media@npm:^11.0.6": + version: 11.0.6 + resolution: "postcss-custom-media@npm:11.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": ^2.0.5 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/media-query-list-parser": ^4.0.3 + peerDependencies: + postcss: ^8.4 + checksum: 3b8ab5eb6d80cf9dd0b74acf69530f73009d860509d820fc5349894a10c2abd08eb1ff77f90c59ee51aebf422fe09d4093ece8d15f652f771ab0fcfd03a42417 + languageName: node + linkType: hard + "postcss-custom-media@npm:^8.0.2": version: 8.0.2 resolution: "postcss-custom-media@npm:8.0.2" @@ -16841,6 +21572,21 @@ __metadata: languageName: node linkType: hard +"postcss-custom-properties@npm:^14.0.6": + version: 14.0.6 + resolution: "postcss-custom-properties@npm:14.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": ^2.0.5 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: f78999e036e8406efcbbd2d7dec599910de88a32a3e829b0c2e78abf6d8944a79fe61fb2cc2ecd07bb96a392249846c363af40c5dc7d3ab8c36606a79c324a28 + languageName: node + linkType: hard + "postcss-custom-selectors@npm:^6.0.3": version: 6.0.3 resolution: "postcss-custom-selectors@npm:6.0.3" @@ -16852,6 +21598,20 @@ __metadata: languageName: node linkType: hard +"postcss-custom-selectors@npm:^8.0.5": + version: 8.0.5 + resolution: "postcss-custom-selectors@npm:8.0.5" + dependencies: + "@csstools/cascade-layer-name-parser": ^2.0.5 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 191cfe62ad3eaf3d8bff75ed461baebbb3b9a52de9c1c75bded61da4ed2302d7c53c457e9febfa7cffc9a1fb7f6ed98cab8c4b2a071a1097e487e0117018e6cf + languageName: node + linkType: hard + "postcss-dir-pseudo-class@npm:^6.0.5": version: 6.0.5 resolution: "postcss-dir-pseudo-class@npm:6.0.5" @@ -16863,6 +21623,17 @@ __metadata: languageName: node linkType: hard +"postcss-dir-pseudo-class@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-dir-pseudo-class@npm:9.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 7f6212fe7f2a83e95d85df14208df3edb75b6b8f89ad865fdfbd1abf5765b6649ff46bb7ff56f7788ff8cfe60546ff305cc2fd2f9b1f9e1647a4386507714070 + languageName: node + linkType: hard + "postcss-discard-comments@npm:^5.1.2": version: 5.1.2 resolution: "postcss-discard-comments@npm:5.1.2" @@ -16872,6 +21643,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-comments@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-comments@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: c1731ccc8d1e3d910412a61395988d3033365e6532d9e5432ad7c74add8c9dcb0af0c03d4e901bf0d2b59ea4e7297a0c77a547ff2ed1b1cc065559cc0de43b4e + languageName: node + linkType: hard + "postcss-discard-duplicates@npm:^5.1.0": version: 5.1.0 resolution: "postcss-discard-duplicates@npm:5.1.0" @@ -16881,6 +21661,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 308e3fb84c35e4703532de1efa5d6e8444cc5f167d0e40f42d7ea3fa3a37d9d636fd10729847d078e0c303eee16f8548d14b6f88a3fce4e38a2b452648465175 + languageName: node + linkType: hard + "postcss-discard-empty@npm:^5.1.1": version: 5.1.1 resolution: "postcss-discard-empty@npm:5.1.1" @@ -16890,6 +21679,15 @@ __metadata: languageName: node linkType: hard +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: bad305572faa066026a295faab37e718cee096589ab827b19c990c55620b2b2a1ce9f0145212651737a66086db01b2676c1927bbb8408c5f9cb42686d5959f00 + languageName: node + linkType: hard + "postcss-discard-overridden@npm:^5.1.0": version: 5.1.0 resolution: "postcss-discard-overridden@npm:5.1.0" @@ -16899,6 +21697,26 @@ __metadata: languageName: node linkType: hard +"postcss-discard-overridden@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-overridden@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: a38e0fe7a36f83cb9b73c1ba9ee2a48cf93c69ec0ea5753935824ffb71e958e58ae0393171c0f3d0014a397469d09bbb0d56bb5ab80f0280722967e2e273aebb + languageName: node + linkType: hard + +"postcss-discard-unused@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-discard-unused@npm:6.0.5" + dependencies: + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 7962640773240186de38125f142a6555b7f9b2493c4968e0f0b11c6629b2bf43ac70b9fc4ee78aa732d82670ad8bf802b2febc9a9864b022eb68530eded26836 + languageName: node + linkType: hard + "postcss-double-position-gradients@npm:^3.1.2": version: 3.1.2 resolution: "postcss-double-position-gradients@npm:3.1.2" @@ -16911,6 +21729,19 @@ __metadata: languageName: node linkType: hard +"postcss-double-position-gradients@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-double-position-gradients@npm:6.0.4" + dependencies: + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 2840202fd819b48f713c63e1bca5e3f6b88ac5374cf2e4ebf6fabad6d5493685f9a3cde6f890ca73f978a7f5cde5ba4b6ec02659715a0b035e9be1063b74fb1f + languageName: node + linkType: hard + "postcss-env-function@npm:^4.0.6": version: 4.0.6 resolution: "postcss-env-function@npm:4.0.6" @@ -16931,6 +21762,17 @@ __metadata: languageName: node linkType: hard +"postcss-focus-visible@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-focus-visible@npm:10.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 47c038ccf139bad6a4c12cf59c5ac78acbac96ae0517ae08d5db676680d585ae7943e22328bd0d31876d6bacc24e4b717b5f809d26218d76989f7b9a44369793 + languageName: node + linkType: hard + "postcss-focus-visible@npm:^6.0.4": version: 6.0.4 resolution: "postcss-focus-visible@npm:6.0.4" @@ -16942,14 +21784,25 @@ __metadata: languageName: node linkType: hard -"postcss-focus-within@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-focus-within@npm:5.0.4" +"postcss-focus-within@npm:^5.0.4": + version: 5.0.4 + resolution: "postcss-focus-within@npm:5.0.4" + dependencies: + postcss-selector-parser: ^6.0.9 + peerDependencies: + postcss: ^8.4 + checksum: f23d8ab757345a6deaa807d76e10c88caf4b771c38b60e1593b24aee161c503b5823620e89302226a6ae5e7afdb6ac31809241291912e4176eb594a7ddcc9521 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-within@npm:9.0.1" dependencies: - postcss-selector-parser: ^6.0.9 + postcss-selector-parser: ^7.0.0 peerDependencies: postcss: ^8.4 - checksum: f23d8ab757345a6deaa807d76e10c88caf4b771c38b60e1593b24aee161c503b5823620e89302226a6ae5e7afdb6ac31809241291912e4176eb594a7ddcc9521 + checksum: ca953bf566605c6519f5318a5a4886f8f0698798ba96d505c287cc0397d90a80246de948af354592a680615667e553c3fb67e88d9f55bdf630dab67b0fc0ceaa languageName: node linkType: hard @@ -16971,6 +21824,15 @@ __metadata: languageName: node linkType: hard +"postcss-gap-properties@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-gap-properties@npm:6.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 8fa8a208fe254ddfcb0442072a6232576efa1fc3deea917be6d3a0c25dfcb855cc6806572e42a098aa0276a5ad3917f19b269409f5ce1f22d233c0072d72f823 + languageName: node + linkType: hard + "postcss-image-set-function@npm:^4.0.7": version: 4.0.7 resolution: "postcss-image-set-function@npm:4.0.7" @@ -16982,6 +21844,18 @@ __metadata: languageName: node linkType: hard +"postcss-image-set-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-image-set-function@npm:7.0.0" + dependencies: + "@csstools/utilities": ^2.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 328946f3f258c230ac50f2f54dc43ac89f21b1afe42e2828fa20bfd19692a1198e439becabe9dfb64de50932c6ef987a8b2b5ea9398ae7ca813afb4f7e595be7 + languageName: node + linkType: hard + "postcss-import@npm:^15.1.0": version: 15.1.0 resolution: "postcss-import@npm:15.1.0" @@ -17027,6 +21901,21 @@ __metadata: languageName: node linkType: hard +"postcss-lab-function@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-lab-function@npm:7.0.12" + dependencies: + "@csstools/css-color-parser": ^3.1.0 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/utilities": ^2.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 4f16254449b2095b143e16ecf4fcae05e461ccd76786059a643e4666589f5793b3aed7d2103bfb00523e40d60a7c77ead563cfbaa39167c69a35e454bbed7ef8 + languageName: node + linkType: hard + "postcss-load-config@npm:^4.0.2 || ^5.0 || ^6.0": version: 6.0.1 resolution: "postcss-load-config@npm:6.0.1" @@ -17064,6 +21953,20 @@ __metadata: languageName: node linkType: hard +"postcss-loader@npm:^7.3.4": + version: 7.3.4 + resolution: "postcss-loader@npm:7.3.4" + dependencies: + cosmiconfig: ^8.3.5 + jiti: ^1.20.0 + semver: ^7.5.4 + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + checksum: f109eb266580eb296441a1ae057f93629b9b79ad962bdd3fc134417180431606a5419b6f5848c31e6d92c818e71fe96e4335a85cc5332c2f7b14e2869951e5b3 + languageName: node + linkType: hard + "postcss-logical@npm:^5.0.4": version: 5.0.4 resolution: "postcss-logical@npm:5.0.4" @@ -17073,6 +21976,17 @@ __metadata: languageName: node linkType: hard +"postcss-logical@npm:^8.1.0": + version: 8.1.0 + resolution: "postcss-logical@npm:8.1.0" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 7db1e8c9f9c1ec9dc8cef56830ac3686766629cc7e28c0494b6e0f3699979f18c11225a39c37210cf81be4491adaa6bdbc394429d7e050f2d03e5845ef6608f9 + languageName: node + linkType: hard + "postcss-media-minmax@npm:^5.0.0": version: 5.0.0 resolution: "postcss-media-minmax@npm:5.0.0" @@ -17082,6 +21996,18 @@ __metadata: languageName: node linkType: hard +"postcss-merge-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-merge-idents@npm:6.0.3" + dependencies: + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: b45780d6d103b8e45a580032747ee6e1842f81863672341a6b4961397e243ca896217bf1f3ee732376a766207d5f610ba8924cf08cf6d5bbd4b093133fd05d70 + languageName: node + linkType: hard + "postcss-merge-longhand@npm:^5.1.7": version: 5.1.7 resolution: "postcss-merge-longhand@npm:5.1.7" @@ -17094,6 +22020,18 @@ __metadata: languageName: node linkType: hard +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" + dependencies: + postcss-value-parser: ^4.2.0 + stylehacks: ^6.1.1 + peerDependencies: + postcss: ^8.4.31 + checksum: 9ae5acf47dc0c1f494684ae55672d55bba7f5ee11c9c0f266aabd7c798e9f7394c6096363cd95685fd21ef088740389121a317772cf523ca22c915009bca2617 + languageName: node + linkType: hard + "postcss-merge-rules@npm:^5.1.4": version: 5.1.4 resolution: "postcss-merge-rules@npm:5.1.4" @@ -17108,6 +22046,20 @@ __metadata: languageName: node linkType: hard +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" + dependencies: + browserslist: ^4.23.0 + caniuse-api: ^3.0.0 + cssnano-utils: ^4.0.2 + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 43f60a1c88806491cf752ae7871676de0e7a2a9d6d2fc6bc894068cc35a910a63d30f7c7d79545e0926c8b3a9ec583e5e8357203c40b5bad5ff58133b0c900f6 + languageName: node + linkType: hard + "postcss-minify-font-values@npm:^5.1.0": version: 5.1.0 resolution: "postcss-minify-font-values@npm:5.1.0" @@ -17119,6 +22071,17 @@ __metadata: languageName: node linkType: hard +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 985e4dd2f89220a4442a822aad7dff016ab58a9dbb7bbca9d01c2d07d5a1e7d8c02e1c6e836abb4c9b4e825b4b80d99ee1f5899e74bf0d969095037738e6e452 + languageName: node + linkType: hard + "postcss-minify-gradients@npm:^5.1.1": version: 5.1.1 resolution: "postcss-minify-gradients@npm:5.1.1" @@ -17132,6 +22095,19 @@ __metadata: languageName: node linkType: hard +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" + dependencies: + colord: ^2.9.3 + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 89b95088c3830f829f6d4636d1be4d4f13300bf9f1577c48c25169c81e11ec0026760b9abb32112b95d2c622f09d3b737f4d2975a7842927ccb567e1002ef7b3 + languageName: node + linkType: hard + "postcss-minify-params@npm:^5.1.4": version: 5.1.4 resolution: "postcss-minify-params@npm:5.1.4" @@ -17145,6 +22121,19 @@ __metadata: languageName: node linkType: hard +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" + dependencies: + browserslist: ^4.23.0 + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1e1cc3057d9bcc532c70e40628e96e3aea0081d8072dffe983a270a8cd59c03ac585e57d036b70e43d4ee725f274a05a6a8efac5a715f448284e115c13f82a46 + languageName: node + linkType: hard + "postcss-minify-selectors@npm:^5.2.1": version: 5.2.1 resolution: "postcss-minify-selectors@npm:5.2.1" @@ -17156,6 +22145,17 @@ __metadata: languageName: node linkType: hard +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 150221a84422ca7627c67ee691ee51e0fe2c3583c8108801e9fc93d3be8b538c2eb04fcfdc908270d7eeaeaf01594a20b81311690a873efccb8a23aeafe1c354 + languageName: node + linkType: hard + "postcss-modules-extract-imports@npm:^3.1.0": version: 3.1.0 resolution: "postcss-modules-extract-imports@npm:3.1.0" @@ -17241,6 +22241,19 @@ __metadata: languageName: node linkType: hard +"postcss-nesting@npm:^13.0.2": + version: 13.0.2 + resolution: "postcss-nesting@npm:13.0.2" + dependencies: + "@csstools/selector-resolve-nested": ^3.1.0 + "@csstools/selector-specificity": ^5.0.0 + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: fce488a2e77d9a8183a4e014caf047e41cb2422c07de1d49a092734fc90feeb8ced21090e3e284cfb2956afdba73e4a3547065ede228b209003bac5e1de62f0a + languageName: node + linkType: hard + "postcss-normalize-charset@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-charset@npm:5.1.0" @@ -17250,6 +22263,15 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 5b8aeb17d61578a8656571cd5d5eefa8d4ee7126a99a41fdd322078002a06f2ae96f649197b9c01067a5f3e38a2e4b03e0e3fda5a0ec9e3d7ad056211ce86156 + languageName: node + linkType: hard + "postcss-normalize-display-values@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-display-values@npm:5.1.0" @@ -17261,6 +22283,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: da30a9394b0e4a269ccad8d240693a6cd564bcc60e24db67caee00f70ddfbc070ad76faed64c32e6eec9ed02e92565488b7879d4fd6c40d877c290eadbb0bb28 + languageName: node + linkType: hard + "postcss-normalize-positions@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-positions@npm:5.1.1" @@ -17272,6 +22305,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 44fb77583fae4d71b76e38226cf770570876bcf5af6940dc9aeac7a7e2252896b361e0249044766cff8dad445f925378f06a005d6541597573c20e599a62b516 + languageName: node + linkType: hard + "postcss-normalize-repeat-style@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-repeat-style@npm:5.1.1" @@ -17283,6 +22327,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: bebdac63bec6777ead3e265fc12527b261cf8d0da1b7f0abb12bda86fd53b7058e4afe392210ac74dac012e413bb1c2a46a1138c89f82b8bf70b81711f620f8c + languageName: node + linkType: hard + "postcss-normalize-string@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-string@npm:5.1.0" @@ -17294,6 +22349,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 5e8e253c528b542accafc142846fb33643c342a787c86e5b68c6287c7d8f63c5ae7d4d3fc28e3daf80821cc26a91add135e58bdd62ff9c735fca65d994898c7d + languageName: node + linkType: hard + "postcss-normalize-timing-functions@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-timing-functions@npm:5.1.0" @@ -17305,6 +22371,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1970f5aad04be11f99d51c59e27debb6fd7b49d0fa4a8879062b42c82113f8e520a284448727add3b54de85deefb8bd5fe554f618406586e9ad8fc9d060609f1 + languageName: node + linkType: hard + "postcss-normalize-unicode@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-unicode@npm:5.1.1" @@ -17317,6 +22394,18 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" + dependencies: + browserslist: ^4.23.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 69ef35d06242061f0c504c128b83752e0f8daa30ebb26734de7d090460910be0b2efd8b17b1d64c3c85b95831a041faad9ad0aaba80e239406a79cfad3d63568 + languageName: node + linkType: hard + "postcss-normalize-url@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-url@npm:5.1.0" @@ -17329,6 +22418,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: bef51a18bbfee4fbf0381fec3c91e6c0dace36fca053bbd5f228e653d2732b6df3985525d79c4f7fc89f840ed07eb6d226e9d7503ecdc6f16d6d80cacae9df33 + languageName: node + linkType: hard + "postcss-normalize-whitespace@npm:^5.1.1": version: 5.1.1 resolution: "postcss-normalize-whitespace@npm:5.1.1" @@ -17340,6 +22440,17 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 6081eb3a4b305749eec02c00a95c2d236336a77ee636bb1d939f18d5dfa5ba82b7cf7fa072e83f9133d0bc984276596af3fe468bdd67c742ce69e9c63dbc218d + languageName: node + linkType: hard + "postcss-normalize@npm:^10.0.1": version: 10.0.1 resolution: "postcss-normalize@npm:10.0.1" @@ -17363,6 +22474,15 @@ __metadata: languageName: node linkType: hard +"postcss-opacity-percentage@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-opacity-percentage@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: dc813113f05f91f1c87ab3c125911f9e5989d1f3fc7cc5586a165901a63c0d02077d134df844391ea5624088680c6b3cee75bc33b8efdcaf340a91046e47e4e1 + languageName: node + linkType: hard + "postcss-ordered-values@npm:^5.1.3": version: 5.1.3 resolution: "postcss-ordered-values@npm:5.1.3" @@ -17375,6 +22495,18 @@ __metadata: languageName: node linkType: hard +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" + dependencies: + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: c3d96177b4ffa43754e835e30c40043cc75ab1e95eb6c55ac8723eb48c13a12e986250e63d96619bbbd1a098876a1c0c1b3b7a8e1de1108a009cf7aa0beac834 + languageName: node + linkType: hard + "postcss-overflow-shorthand@npm:^3.0.4": version: 3.0.4 resolution: "postcss-overflow-shorthand@npm:3.0.4" @@ -17386,6 +22518,17 @@ __metadata: languageName: node linkType: hard +"postcss-overflow-shorthand@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-overflow-shorthand@npm:6.0.0" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 80f07e0beb97b7ac5dac590802591fc93392b0d7a9678e17998b4d34ee0cca637665232c7ea88b3a4342192bc9a2a4f5c757ad86b837a5fd59d083d37cc7da16 + languageName: node + linkType: hard + "postcss-page-break@npm:^3.0.4": version: 3.0.4 resolution: "postcss-page-break@npm:3.0.4" @@ -17395,6 +22538,17 @@ __metadata: languageName: node linkType: hard +"postcss-place@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-place@npm:10.0.0" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4 + checksum: 738cd0dc2412cf573bcfb2f7dce8e1cd21887f61c8808f55114f08fb8fbf03715e957fdd8859241eecebe400a5202771f513610b04e0f17c7742f6a5ea3bafb3 + languageName: node + linkType: hard + "postcss-place@npm:^7.0.5": version: 7.0.5 resolution: "postcss-place@npm:7.0.5" @@ -17406,6 +22560,87 @@ __metadata: languageName: node linkType: hard +"postcss-preset-env@npm:^10.2.1": + version: 10.6.1 + resolution: "postcss-preset-env@npm:10.6.1" + dependencies: + "@csstools/postcss-alpha-function": ^1.0.1 + "@csstools/postcss-cascade-layers": ^5.0.2 + "@csstools/postcss-color-function": ^4.0.12 + "@csstools/postcss-color-function-display-p3-linear": ^1.0.1 + "@csstools/postcss-color-mix-function": ^3.0.12 + "@csstools/postcss-color-mix-variadic-function-arguments": ^1.0.2 + "@csstools/postcss-content-alt-text": ^2.0.8 + "@csstools/postcss-contrast-color-function": ^2.0.12 + "@csstools/postcss-exponential-functions": ^2.0.9 + "@csstools/postcss-font-format-keywords": ^4.0.0 + "@csstools/postcss-gamut-mapping": ^2.0.11 + "@csstools/postcss-gradients-interpolation-method": ^5.0.12 + "@csstools/postcss-hwb-function": ^4.0.12 + "@csstools/postcss-ic-unit": ^4.0.4 + "@csstools/postcss-initial": ^2.0.1 + "@csstools/postcss-is-pseudo-class": ^5.0.3 + "@csstools/postcss-light-dark-function": ^2.0.11 + "@csstools/postcss-logical-float-and-clear": ^3.0.0 + "@csstools/postcss-logical-overflow": ^2.0.0 + "@csstools/postcss-logical-overscroll-behavior": ^2.0.0 + "@csstools/postcss-logical-resize": ^3.0.0 + "@csstools/postcss-logical-viewport-units": ^3.0.4 + "@csstools/postcss-media-minmax": ^2.0.9 + "@csstools/postcss-media-queries-aspect-ratio-number-values": ^3.0.5 + "@csstools/postcss-nested-calc": ^4.0.0 + "@csstools/postcss-normalize-display-values": ^4.0.1 + "@csstools/postcss-oklab-function": ^4.0.12 + "@csstools/postcss-position-area-property": ^1.0.0 + "@csstools/postcss-progressive-custom-properties": ^4.2.1 + "@csstools/postcss-property-rule-prelude-list": ^1.0.0 + "@csstools/postcss-random-function": ^2.0.1 + "@csstools/postcss-relative-color-syntax": ^3.0.12 + "@csstools/postcss-scope-pseudo-class": ^4.0.1 + "@csstools/postcss-sign-functions": ^1.1.4 + "@csstools/postcss-stepped-value-functions": ^4.0.9 + "@csstools/postcss-syntax-descriptor-syntax-production": ^1.0.1 + "@csstools/postcss-system-ui-font-family": ^1.0.0 + "@csstools/postcss-text-decoration-shorthand": ^4.0.3 + "@csstools/postcss-trigonometric-functions": ^4.0.9 + "@csstools/postcss-unset-value": ^4.0.0 + autoprefixer: ^10.4.23 + browserslist: ^4.28.1 + css-blank-pseudo: ^7.0.1 + css-has-pseudo: ^7.0.3 + css-prefers-color-scheme: ^10.0.0 + cssdb: ^8.6.0 + postcss-attribute-case-insensitive: ^7.0.1 + postcss-clamp: ^4.1.0 + postcss-color-functional-notation: ^7.0.12 + postcss-color-hex-alpha: ^10.0.0 + postcss-color-rebeccapurple: ^10.0.0 + postcss-custom-media: ^11.0.6 + postcss-custom-properties: ^14.0.6 + postcss-custom-selectors: ^8.0.5 + postcss-dir-pseudo-class: ^9.0.1 + postcss-double-position-gradients: ^6.0.4 + postcss-focus-visible: ^10.0.1 + postcss-focus-within: ^9.0.1 + postcss-font-variant: ^5.0.0 + postcss-gap-properties: ^6.0.0 + postcss-image-set-function: ^7.0.0 + postcss-lab-function: ^7.0.12 + postcss-logical: ^8.1.0 + postcss-nesting: ^13.0.2 + postcss-opacity-percentage: ^3.0.0 + postcss-overflow-shorthand: ^6.0.0 + postcss-page-break: ^3.0.4 + postcss-place: ^10.0.0 + postcss-pseudo-class-any-link: ^10.0.1 + postcss-replace-overflow-wrap: ^4.0.0 + postcss-selector-not: ^8.0.1 + peerDependencies: + postcss: ^8.4 + checksum: 6a7d4f6680e8723f241aca9219c90b507d7401f8778db889e4bfc850f415e9f655277c74ffae276ce9695e9d43710a6d84dd96055b1b76eed75cb833440f0cd2 + languageName: node + linkType: hard + "postcss-preset-env@npm:^7.0.1": version: 7.8.3 resolution: "postcss-preset-env@npm:7.8.3" @@ -17465,6 +22700,17 @@ __metadata: languageName: node linkType: hard +"postcss-pseudo-class-any-link@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-pseudo-class-any-link@npm:10.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 376525d1a6fa223d908deb884b93d5cb76f4fa7431c090a8ada63e5ee9657bec7bf8e23eff1c36264c051c5a653928e38392165a862b7c5bf5e39e9364383fce + languageName: node + linkType: hard + "postcss-pseudo-class-any-link@npm:^7.1.6": version: 7.1.6 resolution: "postcss-pseudo-class-any-link@npm:7.1.6" @@ -17476,6 +22722,17 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-reduce-idents@npm:6.0.3" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1feff316838f947386c908f50807cf1b9589fd09b8e8df633a01f2640af5492833cc892448938ceba10ab96826c44767b8f2e1569d587579423f2db81202f7c7 + languageName: node + linkType: hard + "postcss-reduce-initial@npm:^5.1.2": version: 5.1.2 resolution: "postcss-reduce-initial@npm:5.1.2" @@ -17488,6 +22745,18 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" + dependencies: + browserslist: ^4.23.0 + caniuse-api: ^3.0.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 39e4034ffbf62a041b66944c5cebc4b17f656e76b97568f7f6230b0b886479e5c75b02ae4ba48c472cb0bde47489f9ed1fe6110ae8cff0d7b7165f53c2d64a12 + languageName: node + linkType: hard + "postcss-reduce-transforms@npm:^5.1.0": version: 5.1.0 resolution: "postcss-reduce-transforms@npm:5.1.0" @@ -17499,6 +22768,17 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" + dependencies: + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: c424cc554eb5d253b7687b64925a13fc16759f058795d223854f5a20d9bca641b5f25d0559d03287e63f07a4629c24ac78156adcf604483fcad3c51721da0a08 + languageName: node + linkType: hard + "postcss-replace-overflow-wrap@npm:^4.0.0": version: 4.0.0 resolution: "postcss-replace-overflow-wrap@npm:4.0.0" @@ -17519,7 +22799,18 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": +"postcss-selector-not@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-selector-not@npm:8.0.1" + dependencies: + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: 28c1f7863ac85016ecd695304ee1eb21b1128eacba333d6d4540fd93691c58ff6329ac323b6a640f2da918e95c7b58e8f534c8b6e2ed016f6e31cdfdc743edbc + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": version: 6.1.2 resolution: "postcss-selector-parser@npm:6.1.2" dependencies: @@ -17539,6 +22830,17 @@ __metadata: languageName: node linkType: hard +"postcss-sort-media-queries@npm:^5.2.0": + version: 5.2.0 + resolution: "postcss-sort-media-queries@npm:5.2.0" + dependencies: + sort-css-media-queries: 2.2.0 + peerDependencies: + postcss: ^8.4.23 + checksum: d4a976a64b53234762cc35c06ce97c1684bd7a64ead17e84c2047676c7307945be7c005235e6aac7c4620e1f835d6ba1a7dcf018ab7fe0a47657c62c96ad9f35 + languageName: node + linkType: hard + "postcss-svgo@npm:^5.1.0": version: 5.1.0 resolution: "postcss-svgo@npm:5.1.0" @@ -17551,14 +22853,37 @@ __metadata: languageName: node linkType: hard +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" + dependencies: + postcss-value-parser: ^4.2.0 + svgo: ^3.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1a7d1c8dea555884a7791e28ec2c22ea92331731067584ff5a23042a0e615f88fefde04e1140f11c262a728ef9fab6851423b40b9c47f9ae05353bd3c0ff051a + languageName: node + linkType: hard + "postcss-unique-selectors@npm:^5.1.1": version: 5.1.1 resolution: "postcss-unique-selectors@npm:5.1.1" dependencies: - postcss-selector-parser: ^6.0.5 + postcss-selector-parser: ^6.0.5 + peerDependencies: + postcss: ^8.2.15 + checksum: 637e7b786e8558265775c30400c54b6b3b24d4748923f4a39f16a65fd0e394f564ccc9f0a1d3c0e770618a7637a7502ea1d0d79f731d429cb202255253c23278 + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: ^6.0.16 peerDependencies: - postcss: ^8.2.15 - checksum: 637e7b786e8558265775c30400c54b6b3b24d4748923f4a39f16a65fd0e394f564ccc9f0a1d3c0e770618a7637a7502ea1d0d79f731d429cb202255253c23278 + postcss: ^8.4.31 + checksum: b09df9943b4e858e88b30f3d279ce867a0490df806f1f947d286b0a4e95ba923f1229c385e5bf365f4f124f1edccda41ec18ccad4ba8798d829279d6dc971203 languageName: node linkType: hard @@ -17569,6 +22894,15 @@ __metadata: languageName: node linkType: hard +"postcss-zindex@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-zindex@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 394119e47b0fb098dc53d1bcf71b5500ab29605fe106526b2e81290bff179174ee00a82a4d4be5a42d4ef4138e8a3d6aabeef3b06cf7cb15b851848c8585d53b + languageName: node + linkType: hard + "postcss@npm:^7.0.35": version: 7.0.39 resolution: "postcss@npm:7.0.39" @@ -17579,7 +22913,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.3.5, postcss@npm:^8.4.27, postcss@npm:^8.4.33, postcss@npm:^8.4.4, postcss@npm:^8.4.43, postcss@npm:^8.4.47, postcss@npm:^8.4.49, postcss@npm:^8.5.6": +"postcss@npm:^8.3.5, postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.27, postcss@npm:^8.4.33, postcss@npm:^8.4.4, postcss@npm:^8.4.43, postcss@npm:^8.4.47, postcss@npm:^8.4.49, postcss@npm:^8.5.4, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -17695,6 +23029,25 @@ __metadata: languageName: node linkType: hard +"pretty-time@npm:^1.1.0": + version: 1.1.0 + resolution: "pretty-time@npm:1.1.0" + checksum: a319e7009aadbc6cfedbd8b66861327d3a0c68bd3e8794bf5b86f62b40b01b9479c5a70c76bb368ad454acce52a1216daee460cc825766e2442c04f3a84a02c9 + languageName: node + linkType: hard + +"prism-react-renderer@npm:^2.3.0": + version: 2.4.1 + resolution: "prism-react-renderer@npm:2.4.1" + dependencies: + "@types/prismjs": ^1.26.0 + clsx: ^2.0.0 + peerDependencies: + react: ">=16.0.0" + checksum: ddd5490a1335629addde9535db7872f0aee8dbce048818dd6e4c3972c779780af13d669c12d3f2fbb54c5b22d1578e50945099ef1a24dd445f33774e87d85e6e + languageName: node + linkType: hard + "prisma@npm:^6.2.1": version: 6.19.2 resolution: "prisma@npm:6.19.2" @@ -17712,6 +23065,13 @@ __metadata: languageName: node linkType: hard +"prismjs@npm:^1.29.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: a68eddd4c5f1c506badb5434b0b28a7cc2479ed1df91bc4218e6833c7971ef40c50ec481ea49749ac964256acb78d8b66a6bd11554938e8998e46c18b5f9a580 + languageName: node + linkType: hard + "proc-log@npm:^6.0.0": version: 6.1.0 resolution: "proc-log@npm:6.1.0" @@ -17787,6 +23147,13 @@ __metadata: languageName: node linkType: hard +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: 4d4826e1713cbfa0f15124ab0ae494c91b597a3c458670c9714c36e8baddf5a6aad22842776f2f5b137f259c8533e741771445eb8df82e861eea37a6eaba03f7 + languageName: node + linkType: hard + "proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -17837,6 +23204,15 @@ __metadata: languageName: node linkType: hard +"pupa@npm:^3.1.0": + version: 3.3.0 + resolution: "pupa@npm:3.3.0" + dependencies: + escape-goat: ^4.0.0 + checksum: a26b57cb4ff761495628b3630ab65fd97229d19314dbd9a08133d34f3f85fdb368da478f7b4a57647660c6d2973f0dae740668f8809c5861e3ede99e938ded05 + languageName: node + linkType: hard + "pure-rand@npm:^6.1.0": version: 6.1.0 resolution: "pure-rand@npm:6.1.0" @@ -17844,6 +23220,22 @@ __metadata: languageName: node linkType: hard +"pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: ^2.8.1 + checksum: 97b023b46d7b95bff004f8340efc465c1d995f35d7e97a2ef2e28d5e160f5ca47b48f42463b6be92b4341452a6b8c555feb2b1eb59ee90b97bd5d6fc86ffb186 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.5 + resolution: "pvutils@npm:1.1.5" + checksum: b86a8d1e74aa430faea75b510e33e5d5315213616e3c2870c2a3c0c152fd5eab08a52d3fdda3a4c711990d5e8e43918b5bc364fba531f81192146c5cbb9b7aa6 + languageName: node + linkType: hard + "q@npm:^1.1.2": version: 1.5.1 resolution: "q@npm:1.5.1" @@ -17874,6 +23266,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + "raf-schd@npm:^4.0.3": version: 4.0.3 resolution: "raf-schd@npm:4.0.3" @@ -17899,6 +23298,13 @@ __metadata: languageName: node linkType: hard +"range-parser@npm:1.2.0": + version: 1.2.0 + resolution: "range-parser@npm:1.2.0" + checksum: bdf397f43fedc15c559d3be69c01dedf38444ca7a1610f5bf5955e3f3da6057a892f34691e7ebdd8c7e1698ce18ef6c4d4811f70e658dda3ff230ef741f8423a + languageName: node + linkType: hard + "range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -17940,7 +23346,7 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.7": +"rc@npm:1.2.8, rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -18035,6 +23441,18 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^18.0.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.2 + peerDependencies: + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 + languageName: node + linkType: hard + "react-draggable@npm:^4.4.6": version: 4.5.0 resolution: "react-draggable@npm:4.5.0" @@ -18073,7 +23491,7 @@ __metadata: languageName: node linkType: hard -"react-fast-compare@npm:^3.1.1": +"react-fast-compare@npm:^3.1.1, react-fast-compare@npm:^3.2.0": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" checksum: 2071415b4f76a3e6b55c84611c4d24dcb12ffc85811a2840b5a3f1ff2d1a99be1020d9437ee7c6e024c9f4cbb84ceb35e48cf84f28fcb00265ad2dfdd3947704 @@ -18090,6 +23508,22 @@ __metadata: languageName: node linkType: hard +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": + version: 1.3.0 + resolution: "@slorber/react-helmet-async@npm:1.3.0" + dependencies: + "@babel/runtime": ^7.12.5 + invariant: ^2.2.4 + prop-types: ^15.7.2 + react-fast-compare: ^3.2.0 + shallowequal: ^1.1.0 + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 2bd080035aa4145761cc08caa2a64f1d8e867ddda71967936b1325f84c5bc7161ac77c1095818952bc5bb09c78ffbd594e7d0508d54255c5bfbc15e3769ef538 + languageName: node + linkType: hard + "react-helmet@npm:^6.1.0": version: 6.1.0 resolution: "react-helmet@npm:6.1.0" @@ -18151,6 +23585,38 @@ __metadata: languageName: node linkType: hard +"react-json-view-lite@npm:^2.3.0": + version: 2.5.0 + resolution: "react-json-view-lite@npm:2.5.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + checksum: 9009cf9c8b5752ade7ee72f234be6ed17c24b6422742f5512bfa1c8a95d24cb128d4df1d994d28d0b1e0e7f06b0ebf84713171e6841602d46b30c3604fbda2b7 + languageName: node + linkType: hard + +"react-loadable-ssr-addon-v5-slorber@npm:^1.0.1": + version: 1.0.1 + resolution: "react-loadable-ssr-addon-v5-slorber@npm:1.0.1" + dependencies: + "@babel/runtime": ^7.10.3 + peerDependencies: + react-loadable: "*" + webpack: ">=4.41.1 || 5.x" + checksum: 1cf7ceb488d329a5be15f891dae16727fb7ade08ef57826addd21e2c3d485e2440259ef8be94f4d54e9afb4bcbd2fcc22c3c5bad92160c9c06ae6ba7b5562497 + languageName: node + linkType: hard + +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version: 6.0.0 + resolution: "@docusaurus/react-loadable@npm:6.0.0" + dependencies: + "@types/react": "*" + peerDependencies: + react: "*" + checksum: 4c32061b2fc10689d5d8ba11ead71b69e4c8a55fcfeafb551a6747b1a7b496c4f2d8dbb5d023f5cafc2a9aea9d14582bdb324d11e6f9b8c3049d45b74439203f + languageName: node + linkType: hard + "react-markdown@npm:^9.0.3": version: 9.1.0 resolution: "react-markdown@npm:9.1.0" @@ -18265,7 +23731,19 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^5.2.0": +"react-router-config@npm:^5.1.1": + version: 5.1.1 + resolution: "react-router-config@npm:5.1.1" + dependencies: + "@babel/runtime": ^7.1.2 + peerDependencies: + react: ">=15" + react-router: ">=5" + checksum: bde7ee79444454bf7c3737fd9c5c268021012c8cc37bc19116b2e7daa28c4231598c275816c7f32c16f9f974dc707b91de279291a5e39efce2e1b1569355b87a + languageName: node + linkType: hard + +"react-router-dom@npm:^5.2.0, react-router-dom@npm:^5.3.4": version: 5.3.4 resolution: "react-router-dom@npm:5.3.4" dependencies: @@ -18282,7 +23760,7 @@ __metadata: languageName: node linkType: hard -"react-router@npm:5.3.4": +"react-router@npm:5.3.4, react-router@npm:^5.3.4": version: 5.3.4 resolution: "react-router@npm:5.3.4" dependencies: @@ -18426,6 +23904,15 @@ __metadata: languageName: node linkType: hard +"react@npm:^18.0.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 + languageName: node + linkType: hard + "read-cache@npm:^1.0.0": version: 1.0.0 resolution: "read-cache@npm:1.0.0" @@ -18505,6 +23992,56 @@ __metadata: languageName: node linkType: hard +"recma-build-jsx@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-build-jsx@npm:1.0.0" + dependencies: + "@types/estree": ^1.0.0 + estree-util-build-jsx: ^3.0.0 + vfile: ^6.0.0 + checksum: ba82fe08efdf5ecd178ab76a08a4acac792a41d9f38aea99f93cb3d9e577ba8952620c547e730ba6717c13efa08fdb3dfe893bccfa9717f5a81d3fb2ab20c572 + languageName: node + linkType: hard + +"recma-jsx@npm:^1.0.0": + version: 1.0.1 + resolution: "recma-jsx@npm:1.0.1" + dependencies: + acorn-jsx: ^5.0.0 + estree-util-to-js: ^2.0.0 + recma-parse: ^1.0.0 + recma-stringify: ^1.0.0 + unified: ^11.0.0 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 4227ec707d2711f8c0f765792e7508f9bd0897991b2479e4612250b4fbba67fc2b06fe65ae8dfeba52a41b910f4e84c18e860b95424526273e8a9fd6e3483f43 + languageName: node + linkType: hard + +"recma-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-parse@npm:1.0.0" + dependencies: + "@types/estree": ^1.0.0 + esast-util-from-js: ^2.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: 676b2097a63ba444985a61af51c2628a546a2537a9ca036ed2249a627fb096f3373139765388b60164e6f5a50c819146a3660351e3f993a360ef107f2ab1c6f8 + languageName: node + linkType: hard + +"recma-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-stringify@npm:1.0.0" + dependencies: + "@types/estree": ^1.0.0 + estree-util-to-js: ^2.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: 3a4f80fe0f6bc11fefa71782dfedb43c28b42518dea450cd1b1591057d9d570f83c85d645bf5ed6da2e47de15a021172c076a8ff4675799855d9f9436cec3c82 + languageName: node + linkType: hard + "recursive-readdir@npm:^2.2.2": version: 2.2.3 resolution: "recursive-readdir@npm:2.2.3" @@ -18531,6 +24068,13 @@ __metadata: languageName: node linkType: hard +"reflect-metadata@npm:^0.2.2": + version: 0.2.2 + resolution: "reflect-metadata@npm:0.2.2" + checksum: a66c7b583e4efdd8f3c3124fbff33da2d0c86d8280617516308b32b2159af7a3698c961db3246387f56f6316b1d33a608f39bb2b49d813316dfc58f6d3bf3210 + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" @@ -18612,6 +24156,24 @@ __metadata: languageName: node linkType: hard +"registry-auth-token@npm:^5.0.1": + version: 5.1.1 + resolution: "registry-auth-token@npm:5.1.1" + dependencies: + "@pnpm/npm-conf": ^3.0.2 + checksum: 36cf27fca6419e4d92c27419c5a333aea1d9dec62f7fb812fa8d8d95dcfa4124e57f22bb944512f5f97ae0e0cda90c28b3a5f0e7ace0b5620d84a8b6b2cab862 + languageName: node + linkType: hard + +"registry-url@npm:^6.0.0": + version: 6.0.1 + resolution: "registry-url@npm:6.0.1" + dependencies: + rc: 1.2.8 + checksum: 33712aa1b489aab7aba2191c1cdadfdd71f5bf166d4792d81744a6be332c160bd7d9273af8269d8a01284b9562f14a5b31b7abcf7ad9306c44887ecff51c89ab + languageName: node + linkType: hard + "regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "regjsgen@npm:0.8.0" @@ -18630,6 +24192,28 @@ __metadata: languageName: node linkType: hard +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": ^3.0.0 + hast-util-raw: ^9.0.0 + vfile: ^6.0.0 + checksum: f9e28dcbf4c6c7d91a97c10a840310f18ef3268aa45abb3e0428b6b191ff3c4fa8f753b910d768588a2dac5c7da7e557b4ddc3f1b6cd252e8d20cb62d60c65ed + languageName: node + linkType: hard + +"rehype-recma@npm:^1.0.0": + version: 1.0.0 + resolution: "rehype-recma@npm:1.0.0" + dependencies: + "@types/estree": ^1.0.0 + "@types/hast": ^3.0.0 + hast-util-to-estree: ^3.0.0 + checksum: d3d544ad4a18485ec6b03a194b40473f96e2169c63d6a8ee3ce9af5e87b946c308fb9549b53e010c7dd39740337e387bb1a8856ce1b47f3e957b696f1d5b2d0c + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -18637,6 +24221,67 @@ __metadata: languageName: node linkType: hard +"remark-directive@npm:^3.0.0": + version: 3.0.1 + resolution: "remark-directive@npm:3.0.1" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-directive: ^3.0.0 + micromark-extension-directive: ^3.0.0 + unified: ^11.0.0 + checksum: e7f273199fbb1c6946863ca3f8293791ee8fa997e373cd20da67d02fdb6a534c728212a93eaf3c9354b6c4416a56ae83098b35554e1e4ed7dca770c9baf69455 + languageName: node + linkType: hard + +"remark-emoji@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-emoji@npm:4.0.1" + dependencies: + "@types/mdast": ^4.0.2 + emoticon: ^4.0.1 + mdast-util-find-and-replace: ^3.0.1 + node-emoji: ^2.1.0 + unified: ^11.0.4 + checksum: 2c02d8c0b694535a9f0c4fe39180cb89a8fbd07eb873c94842c34dfde566b8a6703df9d28fe175a8c28584f96252121de722862baa756f2d875f2f1a4352c1f4 + languageName: node + linkType: hard + +"remark-frontmatter@npm:^5.0.0": + version: 5.0.0 + resolution: "remark-frontmatter@npm:5.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-frontmatter: ^2.0.0 + micromark-extension-frontmatter: ^2.0.0 + unified: ^11.0.0 + checksum: b36e11d528d1d0172489c74ce7961bb6073f7272e71ea1349f765fc79c4246a758aef949174d371a088c48e458af776fcfbb3b043c49cd1120ca8239aeafe16a + languageName: node + linkType: hard + +"remark-gfm@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-gfm: ^3.0.0 + micromark-extension-gfm: ^3.0.0 + remark-parse: ^11.0.0 + remark-stringify: ^11.0.0 + unified: ^11.0.0 + checksum: b278f51c4496f15ad868b72bf2eb2066c23a0892b5885544d3a4c233c964d44e51a0efe22d3fb33db4fbac92aefd51bb33453b8e73077b041a12b8269a02c17d + languageName: node + linkType: hard + +"remark-mdx@npm:^3.0.0": + version: 3.1.1 + resolution: "remark-mdx@npm:3.1.1" + dependencies: + mdast-util-mdx: ^3.0.0 + micromark-extension-mdxjs: ^3.0.0 + checksum: 9e6406ba83e545b5232ce98de71c29ad5746c2d920eed070a2c58687412453875bad52dfdfaf21bee6de59d3a45fa84cf785b3111c5eb4822f29b67cf1dfec96 + languageName: node + linkType: hard + "remark-parse@npm:^11.0.0": version: 11.0.0 resolution: "remark-parse@npm:11.0.0" @@ -18662,6 +24307,17 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-to-markdown: ^2.0.0 + unified: ^11.0.0 + checksum: 59e07460eb629d6c3b3c0f438b0b236e7e6858fd5ab770303078f5a556ec00354d9c7fb9ef6d5f745a4617ac7da1ab618b170fbb4dac120e183fecd9cc86bce6 + languageName: node + linkType: hard + "remove-accents@npm:0.5.0": version: 0.5.0 resolution: "remove-accents@npm:0.5.0" @@ -18682,6 +24338,13 @@ __metadata: languageName: node linkType: hard +"repeat-string@npm:^1.0.0": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -18696,6 +24359,13 @@ __metadata: languageName: node linkType: hard +"require-like@npm:>= 0.1.1": + version: 0.1.2 + resolution: "require-like@npm:0.1.2" + checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -18731,6 +24401,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.2.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -18796,7 +24473,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.11, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -18822,7 +24499,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.10#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.22.8#~builtin": +"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.10#~builtin, resolve@patch:resolve@^1.22.11#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.22.8#~builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#~builtin::version=1.22.11&hash=07638b" dependencies: @@ -18848,6 +24525,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^3.0.0": + version: 3.0.0 + resolution: "responselike@npm:3.0.0" + dependencies: + lowercase-keys: ^3.0.0 + checksum: e0cc9be30df4f415d6d83cdede3c5c887cd4a73e7cc1708bcaab1d50a28d15acb68460ac5b02bcc55a42f3d493729c8856427dcf6e57e6e128ad05cba4cfb95e + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -19030,6 +24716,27 @@ __metadata: languageName: node linkType: hard +"rtlcss@npm:^4.1.0": + version: 4.3.0 + resolution: "rtlcss@npm:4.3.0" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + postcss: ^8.4.21 + strip-json-comments: ^3.1.1 + bin: + rtlcss: bin/rtlcss.js + checksum: b2e78d01cb15ca7da374681f52d29ea71306166788872242a78ad36afdc4b53e78ee6e33b761744353121b01f65a7209b165b253d2715d313f8f282d4ded62bb + languageName: node + linkType: hard + +"run-applescript@npm:^7.0.0": + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 8659fb5f2717b2b37a68cbfe5f678254cf24b5a82a6df3372b180c80c7c137dcd757a4166c3887e459f59a090ca414e8ea7ca97cf3ee5123db54b3b4006d7b7a + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -19152,6 +24859,13 @@ __metadata: languageName: node linkType: hard +"sax@npm:^1.2.4": + version: 1.4.4 + resolution: "sax@npm:1.4.4" + checksum: a6082a153b4ab00968894b3751f6fdc431b0b7edc2d086da67ee162a06716f4bc7d0546e875993e950c757039c9e3838747ab77f50578a6ce579f970a6feadaf + languageName: node + linkType: hard + "sax@npm:~1.2.4": version: 1.2.4 resolution: "sax@npm:1.2.4" @@ -19168,6 +24882,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: ^1.1.0 + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 + languageName: node + linkType: hard + "scheduler@npm:^0.25.0": version: 0.25.0 resolution: "scheduler@npm:0.25.0" @@ -19175,6 +24898,13 @@ __metadata: languageName: node linkType: hard +"schema-dts@npm:^1.1.2": + version: 1.1.5 + resolution: "schema-dts@npm:1.1.5" + checksum: afca7df65a9d714d4aee367f9ea0e8a5a6f62e212457f240c90ded1ab954499a0e0a21bad097ffc810f03e2ea384985b2c2e08c2eb1cf0ec1780fc15b8b16d3f + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" @@ -19208,7 +24938,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": version: 4.3.3 resolution: "schema-utils@npm:4.3.3" dependencies: @@ -19220,6 +24950,16 @@ __metadata: languageName: node linkType: hard +"section-matter@npm:^1.0.0": + version: 1.0.0 + resolution: "section-matter@npm:1.0.0" + dependencies: + extend-shallow: ^2.0.1 + kind-of: ^6.0.0 + checksum: 3cc4131705493b2955729b075dcf562359bba66183debb0332752dc9cad35616f6da7a23e42b6cab45cd2e4bb5cda113e9e84c8f05aee77adb6b0289a0229101 + languageName: node + linkType: hard + "select-hose@npm:^2.0.0": version: 2.0.0 resolution: "select-hose@npm:2.0.0" @@ -19237,6 +24977,25 @@ __metadata: languageName: node linkType: hard +"selfsigned@npm:^5.5.0": + version: 5.5.0 + resolution: "selfsigned@npm:5.5.0" + dependencies: + "@peculiar/x509": ^1.14.2 + pkijs: ^3.3.3 + checksum: aa5d61159d3246e3fca3c282cd3304187988dcdea453af284a084f6f49facda475413cc210372e455154a218332b765508e8034959a3bef0beca74145097fe6a + languageName: node + linkType: hard + +"semver-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "semver-diff@npm:4.0.0" + dependencies: + semver: ^7.3.5 + checksum: 4a958d6f76c7e7858268e1e2cf936712542441c9e003e561b574167279eee0a9bd55cc7eae1bfb31d3e7ad06a9fc370e7dd412fcfefec8c0daf1ce5aea623559 + languageName: node + linkType: hard + "semver@npm:^5.6.0, semver@npm:^5.7.1": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -19333,12 +25092,27 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.2": +"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: - randombytes: ^2.1.0 - checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 + randombytes: ^2.1.0 + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 + languageName: node + linkType: hard + +"serve-handler@npm:^6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + checksum: eb26201e699ac4694fb16f9aaf932330f6b1159e9d9496261baa23caf1e81322afcfd2b5f5f2b306b133298c03a8395a3c13b56fde5d70b331014b3a5ab7217f languageName: node linkType: hard @@ -19439,6 +25213,22 @@ __metadata: languageName: node linkType: hard +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: ^6.0.2 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + languageName: node + linkType: hard + +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 + languageName: node + linkType: hard + "shared@*, shared@1.0.0, shared@workspace:src/shared": version: 0.0.0-use.local resolution: "shared@workspace:src/shared" @@ -19568,6 +25358,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^2.0.3": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" + dependencies: + "@polka/url": ^1.0.0-next.24 + mrmime: ^2.0.0 + totalist: ^3.0.0 + checksum: 6853384a51d6ee9377dd657e2b257e0e98b29abbfbfa6333e105197f0f100c8c56a4520b47028b04ab1833cf2312526206f38fcd4f891c6df453f40da1a15a57 + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -19575,6 +25376,29 @@ __metadata: languageName: node linkType: hard +"sitemap@npm:^7.1.1": + version: 7.1.2 + resolution: "sitemap@npm:7.1.2" + dependencies: + "@types/node": ^17.0.5 + "@types/sax": ^1.2.1 + arg: ^5.0.0 + sax: ^1.2.4 + bin: + sitemap: dist/cli.js + checksum: c6d8e1f06091fdc643f6ed3c13e92215ed1dcbc3bdaf42f50f468a6dc4c6080bd25ffb5f59beb12b4b63f590ad63ab6c285e788d0fade4c811e58bb56a10c6cd + languageName: node + linkType: hard + +"skin-tone@npm:^2.0.0": + version: 2.0.0 + resolution: "skin-tone@npm:2.0.0" + dependencies: + unicode-emoji-modifier-base: ^1.0.0 + checksum: 19de157586b8019cacc55eb25d9d640f00fc02415761f3e41a4527142970fd4e7f6af0333bc90e879858766c20a976107bb386ffd4c812289c01d51f2c8d182c + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -19649,6 +25473,13 @@ __metadata: languageName: node linkType: hard +"sort-css-media-queries@npm:2.2.0": + version: 2.2.0 + resolution: "sort-css-media-queries@npm:2.2.0" + checksum: c090c9a27be40f3e50f5f9bc9d85a8af0e2c5152565eca34bdb028d952749bce169bc5abef21a5a385ca6221a0869640c9faf58f082ac46de9085ebdb506291f + languageName: node + linkType: hard + "source-list-map@npm:^2.0.0, source-list-map@npm:^2.0.1": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" @@ -19700,7 +25531,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.3": +"source-map@npm:^0.7.0, source-map@npm:^0.7.3": version: 0.7.6 resolution: "source-map@npm:0.7.6" checksum: 932f4a2390aa7100e91357d88cc272de984ad29139ac09eedfde8cc78d46da35f389065d0c5343c5d71d054a6ebd4939a8c0f2c98d5df64fe97bb8a730596c2d @@ -19764,6 +25595,13 @@ __metadata: languageName: node linkType: hard +"srcset@npm:^4.0.0": + version: 4.0.0 + resolution: "srcset@npm:4.0.0" + checksum: aceb898c9281101ef43bfbf96bf04dfae828e1bf942a45df6fad74ae9f8f0a425f4bca1480e0d22879beb40dd2bc6947e0e1e5f4d307a714666196164bc5769d + languageName: node + linkType: hard + "ssri@npm:^13.0.0": version: 13.0.0 resolution: "ssri@npm:13.0.0" @@ -19826,7 +25664,7 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.8.0, std-env@npm:^3.9.0": +"std-env@npm:^3.7.0, std-env@npm:^3.8.0, std-env@npm:^3.9.0": version: 3.10.0 resolution: "std-env@npm:3.10.0" checksum: 51d641b36b0fae494a546fb8446d39a837957fbf902c765c62bd12af8e50682d141c4087ca032f1192fa90330c4f6ff23fd6c9795324efacd1684e814471e0e0 @@ -19902,6 +25740,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + "string.prototype.includes@npm:^2.0.1": version: 2.0.1 resolution: "string.prototype.includes@npm:2.0.1" @@ -20039,6 +25888,13 @@ __metadata: languageName: node linkType: hard +"strip-bom-string@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-bom-string@npm:1.0.0" + checksum: 5635a3656d8512a2c194d6c8d5dee7ef0dde6802f7be9413b91e201981ad4132506656d9cf14137f019fd50f0269390d91c7f6a2601b1bee039a4859cfce4934 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -20145,6 +26001,18 @@ __metadata: languageName: node linkType: hard +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" + dependencies: + browserslist: ^4.23.0 + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 7bef69822280a23817caa43969de76d77ba34042e9f1f7baaeda8f22b1d8c20f1f839ad028552c169e158e387830f176feccd0324b07ef6ec657cba1dd0b2466 + languageName: node + linkType: hard + "stylis@npm:4.2.0": version: 4.2.0 resolution: "stylis@npm:4.2.0" @@ -20242,7 +26110,7 @@ __metadata: languageName: node linkType: hard -"svg-parser@npm:^2.0.2": +"svg-parser@npm:^2.0.2, svg-parser@npm:^2.0.4": version: 2.0.4 resolution: "svg-parser@npm:2.0.4" checksum: b3de6653048212f2ae7afe4a423e04a76ec6d2d06e1bf7eacc618a7c5f7df7faa5105561c57b94579ec831fbbdbf5f190ba56a9205ff39ed13eabdf8ab086ddf @@ -20289,6 +26157,23 @@ __metadata: languageName: node linkType: hard +"svgo@npm:^3.0.2, svgo@npm:^3.2.0": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": 0.2.0 + commander: ^7.2.0 + css-select: ^5.1.0 + css-tree: ^2.3.1 + css-what: ^6.1.0 + csso: ^5.0.5 + picocolors: ^1.0.0 + bin: + svgo: ./bin/svgo + checksum: a3f8aad597dec13ab24e679c4c218147048dc1414fe04e99447c5f42a6e077b33d712d306df84674b5253b98c9b84dfbfb41fdd08552443b04946e43d03e054e + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -20439,7 +26324,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.2.5, terser-webpack-plugin@npm:^5.3.16": +"terser-webpack-plugin@npm:^5.2.5, terser-webpack-plugin@npm:^5.3.16, terser-webpack-plugin@npm:^5.3.9": version: 5.3.16 resolution: "terser-webpack-plugin@npm:5.3.16" dependencies: @@ -20461,7 +26346,7 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.31.1": +"terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.31.1": version: 5.46.0 resolution: "terser@npm:5.46.0" dependencies: @@ -20511,6 +26396,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^2.5.0": + version: 2.5.0 + resolution: "thingies@npm:2.5.0" + peerDependencies: + tslib: ^2 + checksum: e73e4bc96aefc41e4f1fdd1cf65eb988c9837f3b5fcd8a472ee30d91c2f7fa9b144562d6b4c5dade6ce70bc5865caf3e869f6d2975cce064b1d81dac3ece3508 + languageName: node + linkType: hard + "throat@npm:^6.0.1": version: 6.0.2 resolution: "throat@npm:6.0.2" @@ -20577,7 +26471,7 @@ __metadata: languageName: node linkType: hard -"tinypool@npm:^1.0.1, tinypool@npm:^1.1.1": +"tinypool@npm:^1.0.1, tinypool@npm:^1.0.2, tinypool@npm:^1.1.1": version: 1.1.1 resolution: "tinypool@npm:1.1.1" checksum: 0258abe108df8be395a2cbdc8b4390c94908850250530f7bea83a129fa33d49a8c93246f76bf81cd458534abd81322f4d4cb3a40690254f8d9044ff449f328a8 @@ -20660,6 +26554,13 @@ __metadata: languageName: node linkType: hard +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a + languageName: node + linkType: hard + "touch@npm:^3.1.0": version: 3.1.1 resolution: "touch@npm:3.1.1" @@ -20715,6 +26616,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" + peerDependencies: + tslib: 2 + checksum: 5f6fcd1b81b0fa7c638ff43cfbd1b62738c318ac14b0c8e439b1bcca353afe90785c075e9262ee18e50a863eae2eaa919ecfc8f22a4d347a0ea4b02ba088c8c0 + languageName: node + linkType: hard + "tree-kill@npm:1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -20831,14 +26741,14 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1, tslib@npm:^1.8.1": +"tslib@npm:^1.11.1, tslib@npm:^1.8.1, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.6.0, tslib@npm:^2.6.2, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a @@ -20879,6 +26789,15 @@ __metadata: languageName: node linkType: hard +"tsyringe@npm:^4.10.0": + version: 4.10.0 + resolution: "tsyringe@npm:4.10.0" + dependencies: + tslib: ^1.9.3 + checksum: 61810b1bca8bd58911fe54fbb5a660a3d9349ce1b62b5bc33fea82bbd0dc6475b57aa1f4fd95007cf7dd2c9d05502525b65bd900941fc4b3de08f9c56751d5e9 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -20934,7 +26853,14 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.19.0": +"type-fest@npm:^1.0.1": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + languageName: node + linkType: hard + +"type-fest@npm:^2.13.0, type-fest@npm:^2.19.0, type-fest@npm:^2.5.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 @@ -21157,6 +27083,13 @@ __metadata: languageName: node linkType: hard +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: 6e1521d35fa69493207eb8b41f8edb95985d8b3faf07c01d820a1830b5e8403e20002563e2f84683e8e962a49beccae789f0879356bf92a4ec7a4dd8e2d16fdb + languageName: node + linkType: hard + "unicode-match-property-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-match-property-ecmascript@npm:2.0.0" @@ -21181,7 +27114,7 @@ __metadata: languageName: node linkType: hard -"unified@npm:^11.0.0": +"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": version: 11.0.5 resolution: "unified@npm:11.0.5" dependencies: @@ -21223,6 +27156,15 @@ __metadata: languageName: node linkType: hard +"unique-string@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-string@npm:3.0.0" + dependencies: + crypto-random-string: ^4.0.0 + checksum: 1a1e2e7d02eab1bb10f720475da735e1990c8a5ff34edd1a3b6bc31590cb4210b7a1233d779360cc622ce11c211e43afa1628dd658f35d3e6a89964b622940df + languageName: node + linkType: hard + "unist-util-is@npm:^6.0.0": version: 6.0.1 resolution: "unist-util-is@npm:6.0.1" @@ -21232,6 +27174,15 @@ __metadata: languageName: node linkType: hard +"unist-util-position-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "unist-util-position-from-estree@npm:2.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: d3b3048a5727c2367f64ef6dcc5b20c4717215ef8b1372ff9a7c426297c5d1e5776409938acd01531213e2cd2543218d16e73f9f862f318e9496e2c73bb18354 + languageName: node + linkType: hard + "unist-util-position@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-position@npm:5.0.0" @@ -21337,6 +27288,28 @@ __metadata: languageName: node linkType: hard +"update-notifier@npm:^6.0.2": + version: 6.0.2 + resolution: "update-notifier@npm:6.0.2" + dependencies: + boxen: ^7.0.0 + chalk: ^5.0.1 + configstore: ^6.0.0 + has-yarn: ^3.0.0 + import-lazy: ^4.0.0 + is-ci: ^3.0.1 + is-installed-globally: ^0.4.0 + is-npm: ^6.0.0 + is-yarn-global: ^0.4.0 + latest-version: ^7.0.0 + pupa: ^3.1.0 + semver: ^7.3.7 + semver-diff: ^4.0.0 + xdg-basedir: ^5.1.0 + checksum: 4bae7b3eca7b2068b6b87dde88c9dad24831fa913a5b83ecb39a7e4702c93e8b05fd9bcac5f1a005178f6e5dc859e0b3817ddda833d2a7ab92c6485e078b3cc8 + languageName: node + linkType: hard + "upper-case-first@npm:^2.0.2": version: 2.0.2 resolution: "upper-case-first@npm:2.0.2" @@ -21364,6 +27337,23 @@ __metadata: languageName: node linkType: hard +"url-loader@npm:^4.1.1": + version: 4.1.1 + resolution: "url-loader@npm:4.1.1" + dependencies: + loader-utils: ^2.0.0 + mime-types: ^2.1.27 + schema-utils: ^3.0.0 + peerDependencies: + file-loader: "*" + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + checksum: c1122a992c6cff70a7e56dfc2b7474534d48eb40b2cc75467cde0c6972e7597faf8e43acb4f45f93c2473645dfd803bcbc20960b57544dd1e4c96e77f72ba6fd + languageName: node + linkType: hard + "url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -21425,6 +27415,13 @@ __metadata: languageName: node linkType: hard +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 35a4866927bbea5d037726744028d05c6e37772ded2aabaca21480ce9380185436aef586ead525e327c7f3c640b1a3287769a12ef269c7b165a2ddd50ea6ad61 + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -21505,6 +27502,16 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^5.0.0": + version: 5.0.3 + resolution: "vfile-location@npm:5.0.3" + dependencies: + "@types/unist": ^3.0.0 + vfile: ^6.0.0 + checksum: bfb3821b6981b6e9aa369bed67a40090b800562064ea312e84437762562df3225a0ca922695389cc0ef1e115f19476c363f53e3ed44dec17c50678b7670b5f2b + languageName: node + linkType: hard + "vfile-message@npm:^4.0.0": version: 4.0.3 resolution: "vfile-message@npm:4.0.3" @@ -21515,7 +27522,7 @@ __metadata: languageName: node linkType: hard -"vfile@npm:^6.0.0": +"vfile@npm:^6.0.0, vfile@npm:^6.0.1": version: 6.0.3 resolution: "vfile@npm:6.0.3" dependencies: @@ -21869,7 +27876,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.4": +"watchpack@npm:^2.4.4, watchpack@npm:^2.5.1": version: 2.5.1 resolution: "watchpack@npm:2.5.1" dependencies: @@ -21888,6 +27895,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + "web-vitals@npm:^4.2.4": version: 4.2.4 resolution: "web-vitals@npm:4.2.4" @@ -21923,6 +27937,28 @@ __metadata: languageName: node linkType: hard +"webpack-bundle-analyzer@npm:^4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" + dependencies: + "@discoveryjs/json-ext": 0.5.7 + acorn: ^8.0.4 + acorn-walk: ^8.0.0 + commander: ^7.2.0 + debounce: ^1.2.1 + escape-string-regexp: ^4.0.0 + gzip-size: ^6.0.0 + html-escaper: ^2.0.2 + opener: ^1.5.2 + picocolors: ^1.0.0 + sirv: ^2.0.3 + ws: ^7.3.1 + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 4f0275e7d87bb6203a618ca5d2d4953943979d986fa2b91be1bf1ad0bcd22bec13398803273d11699f9fbcf106896311208a72d63fe5f8a47b687a226e598dc1 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^5.3.4": version: 5.3.4 resolution: "webpack-dev-middleware@npm:5.3.4" @@ -21938,6 +27974,25 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.5 + resolution: "webpack-dev-middleware@npm:7.4.5" + dependencies: + colorette: ^2.0.10 + memfs: ^4.43.1 + mime-types: ^3.0.1 + on-finished: ^2.4.1 + range-parser: ^1.2.1 + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 54c31f757fec48822c37129ba166f21985ad61a5971655e3c3b7358d997975587687d40dc6c1194f4e54615bd0916df15e4ebc3e3b5203300a52038eaeed5c0b + languageName: node + linkType: hard + "webpack-dev-server@npm:^4.6.0": version: 4.15.2 resolution: "webpack-dev-server@npm:4.15.2" @@ -21985,6 +28040,51 @@ __metadata: languageName: node linkType: hard +"webpack-dev-server@npm:^5.2.2": + version: 5.2.3 + resolution: "webpack-dev-server@npm:5.2.3" + dependencies: + "@types/bonjour": ^3.5.13 + "@types/connect-history-api-fallback": ^1.5.4 + "@types/express": ^4.17.25 + "@types/express-serve-static-core": ^4.17.21 + "@types/serve-index": ^1.9.4 + "@types/serve-static": ^1.15.5 + "@types/sockjs": ^0.3.36 + "@types/ws": ^8.5.10 + ansi-html-community: ^0.0.8 + bonjour-service: ^1.2.1 + chokidar: ^3.6.0 + colorette: ^2.0.10 + compression: ^1.8.1 + connect-history-api-fallback: ^2.0.0 + express: ^4.22.1 + graceful-fs: ^4.2.6 + http-proxy-middleware: ^2.0.9 + ipaddr.js: ^2.1.0 + launch-editor: ^2.6.1 + open: ^10.0.3 + p-retry: ^6.2.0 + schema-utils: ^4.2.0 + selfsigned: ^5.5.0 + serve-index: ^1.9.1 + sockjs: ^0.3.24 + spdy: ^4.0.2 + webpack-dev-middleware: ^7.4.2 + ws: ^8.18.0 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 2b7f2096529945f578e86966d9a0994b0a87b82e3bb3a7cd1ccea2fb81aa95724473a88c9b2033ae3d2f799d13330342948ea77638029d10c8c0c746aac545f7 + languageName: node + linkType: hard + "webpack-manifest-plugin@npm:^4.0.2": version: 4.1.1 resolution: "webpack-manifest-plugin@npm:4.1.1" @@ -21997,6 +28097,28 @@ __metadata: languageName: node linkType: hard +"webpack-merge@npm:^5.9.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: ^4.0.1 + flat: ^5.0.2 + wildcard: ^2.0.0 + checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f + languageName: node + linkType: hard + +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" + dependencies: + clone-deep: ^4.0.1 + flat: ^5.0.2 + wildcard: ^2.0.1 + checksum: e8a604c686b944605a1c57cc7b75e886ab902dc5ffdd15259a092c5c2dd5f58868fe39f995ea4bad4f189e38843b061c4ae1eb22822d7169813f4adab571dc3d + languageName: node + linkType: hard + "webpack-sources@npm:^1.4.3": version: 1.4.3 resolution: "webpack-sources@npm:1.4.3" @@ -22062,6 +28184,62 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5.88.1, webpack@npm:^5.95.0": + version: 5.105.2 + resolution: "webpack@npm:5.105.2" + dependencies: + "@types/eslint-scope": ^3.7.7 + "@types/estree": ^1.0.8 + "@types/json-schema": ^7.0.15 + "@webassemblyjs/ast": ^1.14.1 + "@webassemblyjs/wasm-edit": ^1.14.1 + "@webassemblyjs/wasm-parser": ^1.14.1 + acorn: ^8.15.0 + acorn-import-phases: ^1.0.3 + browserslist: ^4.28.1 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.19.0 + es-module-lexer: ^2.0.0 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.11 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.3.1 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^4.3.3 + tapable: ^2.3.0 + terser-webpack-plugin: ^5.3.16 + watchpack: ^2.5.1 + webpack-sources: ^3.3.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: c5568f6d54fedadadc61d09e72e9eddd1aea7b2ac9ff80355c1107a2305efd82a6de508383da2b0c065a86e4c3d748d2e1ae666274afccda9c5774a7f5993fed + languageName: node + linkType: hard + +"webpackbar@npm:^6.0.1": + version: 6.0.1 + resolution: "webpackbar@npm:6.0.1" + dependencies: + ansi-escapes: ^4.3.2 + chalk: ^4.1.2 + consola: ^3.2.3 + figures: ^3.2.0 + markdown-table: ^2.0.0 + pretty-time: ^1.1.0 + std-env: ^3.7.0 + wrap-ansi: ^7.0.0 + peerDependencies: + webpack: 3 || 4 || 5 + checksum: e9ba314452486230668ab34aea7c3494866dbe29e327e9201551a839000ee7e878d8a47b8977acb76ec9443b4257dfcdb05bae9bbc27ffb21793d2bed7907687 + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" @@ -22248,6 +28426,22 @@ __metadata: languageName: node linkType: hard +"widest-line@npm:^4.0.1": + version: 4.0.1 + resolution: "widest-line@npm:4.0.1" + dependencies: + string-width: ^5.0.1 + checksum: 64c48cf27171221be5f86fc54b94dd29879165bdff1a7aa92dde723d9a8c99fb108312768a5d62c8c2b80b701fa27bbd36a1ddc58367585cd45c0db7920a0cba + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0, wildcard@npm:^2.0.1": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5, word-wrap@npm:~1.2.3": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -22482,6 +28676,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -22489,7 +28694,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": +"write-file-atomic@npm:^3.0.0, write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" dependencies: @@ -22501,7 +28706,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.6": +"ws@npm:^7.3.1, ws@npm:^7.4.6": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -22516,7 +28721,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0": +"ws@npm:^8.13.0, ws@npm:^8.18.0": version: 8.19.0 resolution: "ws@npm:8.19.0" peerDependencies: @@ -22531,6 +28736,33 @@ __metadata: languageName: node linkType: hard +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: ^3.1.0 + checksum: de4c92187e04c3c27b4478f410a02e81c351dc85efa3447bf1666f34fc80baacd890a6698ec91995631714086992036013286aea3d77e6974020d40a08e00aec + languageName: node + linkType: hard + +"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: b60e8a2c663ccb1dac77c2d913f3b96de48dafbfa083657171d3d50e10820b8a04bb4edfe9f00808c8c20e5f5355e1927bea9029f03136e29265cb98291e1fea + languageName: node + linkType: hard + +"xml-js@npm:^1.6.11": + version: 1.6.11 + resolution: "xml-js@npm:1.6.11" + dependencies: + sax: ^1.2.4 + bin: + xml-js: ./bin/cli.js + checksum: 24a55479919413687105fc2d8ab05e613ebedb1c1bc12258a108e07cff5ef793779297db854800a4edf0281303ebd1f177bc4a588442f5344e62b3dddda26c2b + languageName: node + linkType: hard + "xml-name-validator@npm:^3.0.0": version: 3.0.0 resolution: "xml-name-validator@npm:3.0.0" @@ -22681,6 +28913,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.0.0": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 92dd9880c324dbc94ff4b677b7d350ba8d835619062b7102f577add7a59ab4d87f40edc5a03d77d369dfa9d11175b1b2ec4a06a6f8a5d8ce5d1306713f66ee41 + languageName: node + linkType: hard + "yoctocolors-cjs@npm:^2.1.3": version: 2.1.3 resolution: "yoctocolors-cjs@npm:2.1.3"