From 0bdcf901c4d730b83fb138e4abe3d33792fb36f9 Mon Sep 17 00:00:00 2001 From: Gilles <43683714+corp-0@users.noreply.github.com> Date: Tue, 7 Jul 2026 22:48:30 -0400 Subject: [PATCH] feat: site redesign --- .eslintrc.json | 3 - .github/ISSUE_TEMPLATE/sweep-template.yml | 14 - .github/workflows/pull_request.yml | 53 +- .github/workflows/push.yml | 63 +- .husky/commit-msg | 1 + .husky/pre-commit | 1 + .husky/pre-push | 3 + .oxfmtrc.json | 8 + .oxlintrc.json | 17 + .releaserc.json | 11 +- CHANGELOG.md | 122 +- README.md | 9 +- .../confirm-email/[token]/actions.ts | 20 +- app/(account)/confirm-email/[token]/page.tsx | 76 +- app/(account)/login/page.tsx | 148 +- app/(account)/logout/page.tsx | 29 +- app/(account)/register/actions.ts | 61 +- app/(account)/register/page.tsx | 266 +- app/(account)/resend-confirm-email/actions.ts | 54 +- app/(account)/resend-confirm-email/page.tsx | 117 +- .../reset-password/[token]/actions.ts | 92 +- app/(account)/reset-password/[token]/page.tsx | 141 +- app/(account)/reset-password/actions.ts | 32 +- app/(account)/reset-password/page.tsx | 104 +- app/(home)/DownloadButtonClient.tsx | 12 - app/(home)/HomeBannerClient.tsx | 66 - app/(home)/LandingButtonsServer.tsx | 16 - app/(home)/contactInformation.tsx | 38 - app/(home)/featuresList.tsx | 48 - app/(home)/landingText.tsx | 23 - app/(home)/latestNews.tsx | 123 - app/(home)/page.tsx | 66 +- app/(home)/randomThirdTextClient.tsx | 37 - app/blog/[slug]/page.tsx | 68 +- app/blog/[slug]/post.tsx | 70 - app/blog/[slug]/section.tsx | 32 - app/blog/ck-content.css | 72 +- app/blog/layout.tsx | 10 - app/blog/loading.tsx | 34 +- app/blog/page.tsx | 68 +- app/changelog/buildComponent.tsx | 132 - app/changelog/changeComponent.tsx | 67 - app/changelog/loading.tsx | 61 +- app/changelog/page.tsx | 68 +- app/clown/clown.tsx | 99 - app/common/defaultNavbar.tsx | 78 - app/common/emoji.tsx | 21 - app/common/navigation.tsx | 34 - app/common/uiLibrary/Button.tsx | 34 - .../uiLibrary/Layouters/formContainer.tsx | 34 - app/common/uiLibrary/Layouters/fullPage.tsx | 12 - .../uiLibrary/Layouters/topMiddlePlacer.tsx | 12 - app/common/uiLibrary/PageHeading.tsx | 23 - app/common/uiLibrary/capsule.tsx | 22 - app/common/uiLibrary/container.tsx | 12 - app/common/uiLibrary/externalLink.tsx | 35 - .../uiLibrary/forms/alternativeActions.tsx | 32 - app/common/uiLibrary/forms/textField.tsx | 35 - app/common/uiLibrary/genericLoading.tsx | 12 - app/common/uiLibrary/linkButton.tsx | 36 - app/common/uiLibrary/pageSection.tsx | 28 - app/common/uiLibrary/pageSectionTitle.tsx | 20 - app/common/uiLibrary/panel.tsx | 22 - app/common/uiLibrary/spinner.tsx | 16 - app/common/uiLibrary/styledLink.tsx | 22 - app/download/fetchLatestRelease.ts | 20 +- app/download/page.tsx | 87 +- app/globals.css | 197 +- app/layout.tsx | 116 +- app/ledger/page.tsx | 12 +- app/ledger/presentation.tsx | 83 - app/not-found.tsx | 33 +- commitlint.config.mjs | 3 + components/atoms/AltDownloadLink.tsx | 16 - components/atoms/CopyableCommand.tsx | 33 - components/atoms/CornerBadge.tsx | 12 - components/atoms/HeroDownloadLink.tsx | 18 - components/atoms/QuietExternalLink.tsx | 23 - components/atoms/TableCell.tsx | 7 - components/atoms/TableHeaderCell.tsx | 34 - components/blog/BlogFeed.tsx | 25 + components/blog/PostArticle.tsx | 37 + components/blog/PostCard.tsx | 68 + components/blog/PostSection.tsx | 36 + components/changelog/BuildPanel.tsx | 54 + components/changelog/ChangeRow.tsx | 40 + components/changelog/ChangelogFeed.tsx | 23 + components/download/DownloadExperience.tsx | 241 + components/home/AboutSection.tsx | 17 + components/home/CommunitySection.tsx | 41 + components/home/CommunityToolbar.tsx | 24 + components/home/Hero.tsx | 50 + components/home/JobsTicker.tsx | 53 + components/home/NewsSection.tsx | 75 + components/home/RotatingTagline.tsx | 39 + components/home/ScreenshotFeed.tsx | 115 + components/ledger/LedgerPresentation.tsx | 122 + components/molecules/OsSwitcher.tsx | 34 - components/molecules/PackageOption.tsx | 39 - components/molecules/PlatformHeading.tsx | 25 - components/molecules/TableHeaderRow.tsx | 30 - components/molecules/TableRow.tsx | 18 - components/molecules/VariantsPanel.tsx | 68 - components/organisms/DataTable.tsx | 65 - components/organisms/DownloadExperience.tsx | 80 - components/osMeta.ts | 11 - components/site/Clown.tsx | 137 + components/site/Footer.tsx | 72 + components/site/Navbar.tsx | 118 + components/site/ParallaxSpace.tsx | 135 + {app/clown => components/site}/clown.css | 6 +- components/ui/Badge.tsx | 25 + components/ui/Button.tsx | 32 + components/ui/ButtonGroup.tsx | 30 + components/ui/CardLink.tsx | 31 + components/ui/Container.tsx | 27 + components/ui/CopyCommand.tsx | 39 + components/ui/DataTable.tsx | 94 + components/ui/Dropdown.tsx | 110 + components/ui/FormShell.tsx | 56 + components/ui/LinkButton.tsx | 50 + components/ui/LoadingPanel.tsx | 11 + components/ui/Notice.tsx | 35 + components/ui/PageHeader.tsx | 19 + components/ui/Pagination.tsx | 40 + components/ui/Panel.tsx | 57 + components/ui/PanelBar.tsx | 31 + components/ui/SectionIntro.tsx | 53 + components/ui/Spinner.tsx | 10 + components/ui/StatusLight.tsx | 19 + components/ui/TextField.tsx | 46 + components/ui/TextLink.tsx | 29 + components/ui/buttonStyles.ts | 32 + components/ui/tones.ts | 42 + context/AuthorizerContextProvider.tsx | 28 +- context/ledger/LedgerApiProvider.tsx | 17 +- context/ledger/LedgerDataTableProvider.tsx | 101 +- context/providers.tsx | 12 +- cypress.config.ts | 19 +- cypress/component/CopyCommand.cy.tsx | 17 + cypress/component/DownloadExperience.cy.tsx | 108 + cypress/component/Dropdown.cy.tsx | 50 + cypress/component/Pagination.cy.tsx | 37 + cypress/component/dummy.cy.ts | 7 - cypress/component/utils.cy.ts | 121 + cypress/e2e/account.cy.ts | 75 + cypress/e2e/blog.cy.ts | 43 + cypress/e2e/changelog.cy.ts | 60 + cypress/e2e/download.cy.ts | 55 + cypress/e2e/home.cy.ts | 61 +- cypress/e2e/ledger.cy.ts | 52 + cypress/e2e/navigation.cy.ts | 88 + cypress/fixtures/blogPosts-page1.json | 40 + cypress/fixtures/blogPosts-page2.json | 18 + cypress/fixtures/changelog-page1.json | 38 + cypress/fixtures/example.json | 6 +- cypress/fixtures/ledger-page1.json | 27 + cypress/fixtures/ledger-page2.json | 27 + cypress/support/commands.ts | 67 +- cypress/support/component-index.html | 26 +- cypress/support/component.ts | 41 +- cypress/support/e2e.ts | 21 +- cypress/tsconfig.json | 8 + hooks/useInfiniteFeed.ts | 53 + hooks/useWindowSize.ts | 24 - jest.config.js | 19 - lib/auth/authorization.ts | 74 +- lib/auth/fieldError.ts | 12 + lib/auth/guards.ts | 44 +- lib/auth/types.ts | 4 +- lib/auth/useAuth.ts | 131 +- next.config.js | 29 +- package-lock.json | 19666 ++++++---------- package.json | 102 +- pages/README.md | 10 + postcss.config.js | 2 +- public/background/layer1.png | Bin 73148 -> 0 bytes .../background/parallax/parallax_layer1.png | Bin 0 -> 73045 bytes .../background/parallax/parallax_layer2.png | Bin 0 -> 47059 bytes .../background/parallax/parallax_layer3.png | Bin 0 -> 4553 bytes .../background/parallax/parallax_planet.png | Bin 0 -> 17779 bytes sweep.yaml | 60 - tailwind.config.js | 111 +- tsconfig.json | 67 +- types/allChangesResponse.ts | 12 +- types/blogPost.ts | 22 +- types/blogPostsResponse.ts | 10 +- types/build.ts | 8 +- types/change.ts | 16 +- types/githubReleaseResponse.ts | 4 +- types/launcherRelease.ts | 40 +- types/layoutChildren.ts | 4 +- types/ledger/ledgerResponse.ts | 4 +- types/pageParams.ts | 6 +- utils/__fixtures__/puduRelease.json | 62 +- utils/detectPlatform.ts | 56 +- utils/fetchOfType.ts | 11 +- utils/launcherRelease.ts | 77 +- utils/osMeta.ts | 11 + utils/postMeta.ts | 23 + utils/timeUtils.ts | 14 +- utils/urlContants.ts | 19 +- 202 files changed, 11957 insertions(+), 16825 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 .github/ISSUE_TEMPLATE/sweep-template.yml create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .husky/pre-push create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json delete mode 100644 app/(home)/DownloadButtonClient.tsx delete mode 100644 app/(home)/HomeBannerClient.tsx delete mode 100644 app/(home)/LandingButtonsServer.tsx delete mode 100644 app/(home)/contactInformation.tsx delete mode 100644 app/(home)/featuresList.tsx delete mode 100644 app/(home)/landingText.tsx delete mode 100644 app/(home)/latestNews.tsx delete mode 100644 app/(home)/randomThirdTextClient.tsx delete mode 100644 app/blog/[slug]/post.tsx delete mode 100644 app/blog/[slug]/section.tsx delete mode 100644 app/blog/layout.tsx delete mode 100644 app/changelog/buildComponent.tsx delete mode 100644 app/changelog/changeComponent.tsx delete mode 100644 app/clown/clown.tsx delete mode 100644 app/common/defaultNavbar.tsx delete mode 100644 app/common/emoji.tsx delete mode 100644 app/common/navigation.tsx delete mode 100644 app/common/uiLibrary/Button.tsx delete mode 100644 app/common/uiLibrary/Layouters/formContainer.tsx delete mode 100644 app/common/uiLibrary/Layouters/fullPage.tsx delete mode 100644 app/common/uiLibrary/Layouters/topMiddlePlacer.tsx delete mode 100644 app/common/uiLibrary/PageHeading.tsx delete mode 100644 app/common/uiLibrary/capsule.tsx delete mode 100644 app/common/uiLibrary/container.tsx delete mode 100644 app/common/uiLibrary/externalLink.tsx delete mode 100644 app/common/uiLibrary/forms/alternativeActions.tsx delete mode 100644 app/common/uiLibrary/forms/textField.tsx delete mode 100644 app/common/uiLibrary/genericLoading.tsx delete mode 100644 app/common/uiLibrary/linkButton.tsx delete mode 100644 app/common/uiLibrary/pageSection.tsx delete mode 100644 app/common/uiLibrary/pageSectionTitle.tsx delete mode 100644 app/common/uiLibrary/panel.tsx delete mode 100644 app/common/uiLibrary/spinner.tsx delete mode 100644 app/common/uiLibrary/styledLink.tsx delete mode 100644 app/ledger/presentation.tsx create mode 100644 commitlint.config.mjs delete mode 100644 components/atoms/AltDownloadLink.tsx delete mode 100644 components/atoms/CopyableCommand.tsx delete mode 100644 components/atoms/CornerBadge.tsx delete mode 100644 components/atoms/HeroDownloadLink.tsx delete mode 100644 components/atoms/QuietExternalLink.tsx delete mode 100644 components/atoms/TableCell.tsx delete mode 100644 components/atoms/TableHeaderCell.tsx create mode 100644 components/blog/BlogFeed.tsx create mode 100644 components/blog/PostArticle.tsx create mode 100644 components/blog/PostCard.tsx create mode 100644 components/blog/PostSection.tsx create mode 100644 components/changelog/BuildPanel.tsx create mode 100644 components/changelog/ChangeRow.tsx create mode 100644 components/changelog/ChangelogFeed.tsx create mode 100644 components/download/DownloadExperience.tsx create mode 100644 components/home/AboutSection.tsx create mode 100644 components/home/CommunitySection.tsx create mode 100644 components/home/CommunityToolbar.tsx create mode 100644 components/home/Hero.tsx create mode 100644 components/home/JobsTicker.tsx create mode 100644 components/home/NewsSection.tsx create mode 100644 components/home/RotatingTagline.tsx create mode 100644 components/home/ScreenshotFeed.tsx create mode 100644 components/ledger/LedgerPresentation.tsx delete mode 100644 components/molecules/OsSwitcher.tsx delete mode 100644 components/molecules/PackageOption.tsx delete mode 100644 components/molecules/PlatformHeading.tsx delete mode 100644 components/molecules/TableHeaderRow.tsx delete mode 100644 components/molecules/TableRow.tsx delete mode 100644 components/molecules/VariantsPanel.tsx delete mode 100644 components/organisms/DataTable.tsx delete mode 100644 components/organisms/DownloadExperience.tsx delete mode 100644 components/osMeta.ts create mode 100644 components/site/Clown.tsx create mode 100644 components/site/Footer.tsx create mode 100644 components/site/Navbar.tsx create mode 100644 components/site/ParallaxSpace.tsx rename {app/clown => components/site}/clown.css (76%) create mode 100644 components/ui/Badge.tsx create mode 100644 components/ui/Button.tsx create mode 100644 components/ui/ButtonGroup.tsx create mode 100644 components/ui/CardLink.tsx create mode 100644 components/ui/Container.tsx create mode 100644 components/ui/CopyCommand.tsx create mode 100644 components/ui/DataTable.tsx create mode 100644 components/ui/Dropdown.tsx create mode 100644 components/ui/FormShell.tsx create mode 100644 components/ui/LinkButton.tsx create mode 100644 components/ui/LoadingPanel.tsx create mode 100644 components/ui/Notice.tsx create mode 100644 components/ui/PageHeader.tsx create mode 100644 components/ui/Pagination.tsx create mode 100644 components/ui/Panel.tsx create mode 100644 components/ui/PanelBar.tsx create mode 100644 components/ui/SectionIntro.tsx create mode 100644 components/ui/Spinner.tsx create mode 100644 components/ui/StatusLight.tsx create mode 100644 components/ui/TextField.tsx create mode 100644 components/ui/TextLink.tsx create mode 100644 components/ui/buttonStyles.ts create mode 100644 components/ui/tones.ts create mode 100644 cypress/component/CopyCommand.cy.tsx create mode 100644 cypress/component/DownloadExperience.cy.tsx create mode 100644 cypress/component/Dropdown.cy.tsx create mode 100644 cypress/component/Pagination.cy.tsx delete mode 100644 cypress/component/dummy.cy.ts create mode 100644 cypress/component/utils.cy.ts create mode 100644 cypress/e2e/account.cy.ts create mode 100644 cypress/e2e/blog.cy.ts create mode 100644 cypress/e2e/changelog.cy.ts create mode 100644 cypress/e2e/download.cy.ts create mode 100644 cypress/e2e/ledger.cy.ts create mode 100644 cypress/e2e/navigation.cy.ts create mode 100644 cypress/fixtures/blogPosts-page1.json create mode 100644 cypress/fixtures/blogPosts-page2.json create mode 100644 cypress/fixtures/changelog-page1.json create mode 100644 cypress/fixtures/ledger-page1.json create mode 100644 cypress/fixtures/ledger-page2.json create mode 100644 cypress/tsconfig.json create mode 100644 hooks/useInfiniteFeed.ts delete mode 100644 hooks/useWindowSize.ts delete mode 100644 jest.config.js create mode 100644 lib/auth/fieldError.ts create mode 100644 pages/README.md delete mode 100644 public/background/layer1.png create mode 100644 public/background/parallax/parallax_layer1.png create mode 100644 public/background/parallax/parallax_layer2.png create mode 100644 public/background/parallax/parallax_layer3.png create mode 100644 public/background/parallax/parallax_planet.png delete mode 100644 sweep.yaml create mode 100644 utils/osMeta.ts create mode 100644 utils/postMeta.ts diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 1c2aa65..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/.github/ISSUE_TEMPLATE/sweep-template.yml b/.github/ISSUE_TEMPLATE/sweep-template.yml deleted file mode 100644 index 98811de..0000000 --- a/.github/ISSUE_TEMPLATE/sweep-template.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Sweep Issue -title: 'Sweep: ' -description: For small bugs, features, refactors, and tests to be handled by Sweep, an AI-powered junior developer. -labels: sweep -body: - - type: textarea - id: description - attributes: - label: Details - description: Tell Sweep where and what to edit and provide enough context for a new developer to the codebase - placeholder: | - Bugs: The bug might be in ... file. Here are the logs: ... - Features: the new endpoint should use the ... class from ... file because it contains ... logic. - Refactors: We are migrating this function to ... version because ... diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6f9537f..e176e6a 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -7,32 +7,35 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 22.x - - run: npm install - - run: npm run lint - - run: npm run build -# unit_test: -# runs-on: ubuntu-latest -# needs: [lint] -# steps: -# - uses: actions/checkout@v3 -# - uses: actions/setup-node@v3 -# with: -# node-version: 22.x -# - run: npm install -# - name: unit test -# run: npm run test:unit + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - run: npm install + - name: oxlint + run: npm run lint + - name: format check + run: npm run format:check + - run: npm run build + component_test: + runs-on: ubuntu-latest + needs: [lint] + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - run: npm install + - name: component tests + run: npm run test:unit e2e_test: runs-on: ubuntu-latest needs: [lint] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 22.x - - run: npm install - - name: e2e testing - run: npm run test:e2e + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - run: npm install + - name: e2e testing + run: npm run test:e2e diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 22b7d6b..5a2bf50 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -7,13 +7,16 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 22.x - - run: npm install - - run: npm run lint - - run: npm run build + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - run: npm install + - name: oxlint + run: npm run lint + - name: format check + run: npm run format:check + - run: npm run build # unit_test: # runs-on: ubuntu-latest # needs: [lint] @@ -27,31 +30,31 @@ jobs: # run: npm run test:unit e2e_test: runs-on: ubuntu-latest - needs: [ lint ] + needs: [lint] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 22.x - - run: npm install - - name: unit test - run: npm run test:e2e + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - run: npm install + - name: unit test + run: npm run test:e2e release: runs-on: ubuntu-latest - needs: [ lint, e2e_test ] + needs: [lint, e2e_test] if: github.ref == 'refs/heads/master' steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 22.x - - name: Install plugins - run: | - npm install @semantic-release/commit-analyzer -D - npm install @semantic-release/release-notes-generator -D - npm install @semantic-release/changelog -D - npm install @semantic-release/git -D - npm install @semantic-release/github -D - - uses: codfish/semantic-release-action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22.x + - name: Install plugins + run: | + npm install @semantic-release/commit-analyzer -D + npm install @semantic-release/release-notes-generator -D + npm install @semantic-release/changelog -D + npm install @semantic-release/git -D + npm install @semantic-release/github -D + - uses: codfish/semantic-release-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..da99483 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000..cb39666 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,3 @@ +npm run lint +npm run format:check +npm run build diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..9a8e87b --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "tabWidth": 4, + "semi": true, + "singleQuote": false, + "jsxSingleQuote": false, + "ignorePatterns": [] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..dea9077 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,17 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "oxc", "react", "nextjs", "jsx-a11y"], + "categories": { + "correctness": "error" + }, + "rules": { + "react/rules-of-hooks": "error", + "react/react-compiler": "error", + // Suggests /
for role="status"/"group" live regions and + // toolbars where a div with an explicit role is the better fit. + "jsx-a11y/prefer-tag-over-role": "off" + }, + "env": { + "builtin": true + } +} diff --git a/.releaserc.json b/.releaserc.json index 6259a36..eb79980 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -4,10 +4,13 @@ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog", - ["@semantic-release/git", { - "assets": ["CHANGELOG.md"], - "message": "docs(changelog): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" - }], + [ + "@semantic-release/git", + { + "assets": ["CHANGELOG.md"], + "message": "docs(changelog): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ], "@semantic-release/github" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0afcce5..80aa21e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,178 +1,154 @@ # [1.13.0](https://github.com/unitystation/unitystation-web/compare/v1.12.0...v1.13.0) (2025-12-10) - ### Bug Fixes -* update all deps ([f307964](https://github.com/unitystation/unitystation-web/commit/f307964ce27f43656b783ece0db9e1d4f967eab0)) -* updated vulnerable deps ([5826ba7](https://github.com/unitystation/unitystation-web/commit/5826ba71cfb41b1b5023b46f971b797119de6877)) - +- update all deps ([f307964](https://github.com/unitystation/unitystation-web/commit/f307964ce27f43656b783ece0db9e1d4f967eab0)) +- updated vulnerable deps ([5826ba7](https://github.com/unitystation/unitystation-web/commit/5826ba71cfb41b1b5023b46f971b797119de6877)) ### Features -* changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) -* first iteration of the new ledger page ([1cae21d](https://github.com/unitystation/unitystation-web/commit/1cae21d0368529be3fba38b3e8990ff6c61639a4)) -* first iteration of the new ledger page ([cd5c42f](https://github.com/unitystation/unitystation-web/commit/cd5c42f3b569956608fcc80886f1b962d1ed1319)) +- changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) +- first iteration of the new ledger page ([1cae21d](https://github.com/unitystation/unitystation-web/commit/1cae21d0368529be3fba38b3e8990ff6c61639a4)) +- first iteration of the new ledger page ([cd5c42f](https://github.com/unitystation/unitystation-web/commit/cd5c42f3b569956608fcc80886f1b962d1ed1319)) # [1.13.0](https://github.com/unitystation/unitystation-web/compare/v1.12.0...v1.13.0) (2025-04-21) - ### Features -* changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) -* first iteration of the new ledger page ([1cae21d](https://github.com/unitystation/unitystation-web/commit/1cae21d0368529be3fba38b3e8990ff6c61639a4)) -* first iteration of the new ledger page ([cd5c42f](https://github.com/unitystation/unitystation-web/commit/cd5c42f3b569956608fcc80886f1b962d1ed1319)) +- changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) +- first iteration of the new ledger page ([1cae21d](https://github.com/unitystation/unitystation-web/commit/1cae21d0368529be3fba38b3e8990ff6c61639a4)) +- first iteration of the new ledger page ([cd5c42f](https://github.com/unitystation/unitystation-web/commit/cd5c42f3b569956608fcc80886f1b962d1ed1319)) # [1.13.0](https://github.com/unitystation/unitystation-web/compare/v1.12.0...v1.13.0) (2025-03-30) - ### Features -* changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) +- changes "Weekly Update" pill's text to "Progress update" ([6845ea6](https://github.com/unitystation/unitystation-web/commit/6845ea6b17fe2701e8fbdc4cecf64d1a1319ec97)) # [1.12.0](https://github.com/unitystation/unitystation-web/compare/v1.11.0...v1.12.0) (2024-10-27) - ### Bug Fixes -* stupidly fix changelog page not loading enough builds to create the scrollbar ([a871f56](https://github.com/unitystation/unitystation-web/commit/a871f5654d7b010b1e18fb824ced75ac0b46cd88)) - +- stupidly fix changelog page not loading enough builds to create the scrollbar ([a871f56](https://github.com/unitystation/unitystation-web/commit/a871f5654d7b010b1e18fb824ced75ac0b46cd88)) ### Features -* Button component now supports choosing uppercase and side icons. ([1151eab](https://github.com/unitystation/unitystation-web/commit/1151eabdacad7dfdcfe859d26d359c16840eba5d)) -* close dropdown after clicking on an element ([bf4e98e](https://github.com/unitystation/unitystation-web/commit/bf4e98e90decc286f7308c948b4a6cfd48631bea)) +- Button component now supports choosing uppercase and side icons. ([1151eab](https://github.com/unitystation/unitystation-web/commit/1151eabdacad7dfdcfe859d26d359c16840eba5d)) +- close dropdown after clicking on an element ([bf4e98e](https://github.com/unitystation/unitystation-web/commit/bf4e98e90decc286f7308c948b4a6cfd48631bea)) # [1.11.0](https://github.com/unitystation/unitystation-web/compare/v1.10.0...v1.11.0) (2024-10-12) - ### Features -* added button to go to blog posts from the latest news section ([0019de3](https://github.com/unitystation/unitystation-web/commit/0019de39f00cda32c0bb671beae48739de78aca8)) -* remove unneeded margin ([9729be4](https://github.com/unitystation/unitystation-web/commit/9729be40fbd4a84f3e69723786c5d847c5bb05a3)) -* slight redesign of landing page ([9fb157b](https://github.com/unitystation/unitystation-web/commit/9fb157bd90752560e461091f2339ae27dd7e7bc4)) +- added button to go to blog posts from the latest news section ([0019de3](https://github.com/unitystation/unitystation-web/commit/0019de39f00cda32c0bb671beae48739de78aca8)) +- remove unneeded margin ([9729be4](https://github.com/unitystation/unitystation-web/commit/9729be40fbd4a84f3e69723786c5d847c5bb05a3)) +- slight redesign of landing page ([9fb157b](https://github.com/unitystation/unitystation-web/commit/9fb157bd90752560e461091f2339ae27dd7e7bc4)) # [1.10.0](https://github.com/unitystation/unitystation-web/compare/v1.9.0...v1.10.0) (2024-03-09) - ### Bug Fixes -* fix bug where password confirmation field would get the username helper text. ([2d7e47a](https://github.com/unitystation/unitystation-web/commit/2d7e47a15c5e164cf1ba435b16f1a014545dd0fa)) -* fix navbar links being relative instead of absolute path ([1b7d78a](https://github.com/unitystation/unitystation-web/commit/1b7d78af970639e8e767709afa318f0f1c1b1fae)) -* fix wrong URL on reset-password action which caused the process to always fail ([03a7ecb](https://github.com/unitystation/unitystation-web/commit/03a7ecb7e2d63d6f625833edcc23c30f83a56ddf)) - +- fix bug where password confirmation field would get the username helper text. ([2d7e47a](https://github.com/unitystation/unitystation-web/commit/2d7e47a15c5e164cf1ba435b16f1a014545dd0fa)) +- fix navbar links being relative instead of absolute path ([1b7d78a](https://github.com/unitystation/unitystation-web/commit/1b7d78af970639e8e767709afa318f0f1c1b1fae)) +- fix wrong URL on reset-password action which caused the process to always fail ([03a7ecb](https://github.com/unitystation/unitystation-web/commit/03a7ecb7e2d63d6f625833edcc23c30f83a56ddf)) ### Features -* add page to resend confirmation email ([55bc1c2](https://github.com/unitystation/unitystation-web/commit/55bc1c2ac6817def9be89a469983dffff6139765)) -* add page to type your new password as a second step in password-reset process ([79c2118](https://github.com/unitystation/unitystation-web/commit/79c2118d211b4b68d1a788ffdcbe86956da9b8f9)) -* finish reset-password page and functionality ([25f96c7](https://github.com/unitystation/unitystation-web/commit/25f96c74e3672f6383e055e837093e9c3e97bae0)) +- add page to resend confirmation email ([55bc1c2](https://github.com/unitystation/unitystation-web/commit/55bc1c2ac6817def9be89a469983dffff6139765)) +- add page to type your new password as a second step in password-reset process ([79c2118](https://github.com/unitystation/unitystation-web/commit/79c2118d211b4b68d1a788ffdcbe86956da9b8f9)) +- finish reset-password page and functionality ([25f96c7](https://github.com/unitystation/unitystation-web/commit/25f96c74e3672f6383e055e837093e9c3e97bae0)) # [1.9.0](https://github.com/unitystation/unitystation-web/compare/v1.8.0...v1.9.0) (2024-03-08) - ### Bug Fixes -* submitting login works with enter again ([a7cfedb](https://github.com/unitystation/unitystation-web/commit/a7cfedb88e07cd274917a53a93207739e2ddf921)) - +- submitting login works with enter again ([a7cfedb](https://github.com/unitystation/unitystation-web/commit/a7cfedb88e07cd274917a53a93207739e2ddf921)) ### Features -* add new auth context provider to handle authentication state application wide ([dec6c17](https://github.com/unitystation/unitystation-web/commit/dec6c1723dfb111339ed7b5331c8cb190faa4c94)) -* add new login and register pages (still non-functional) ([5f63c24](https://github.com/unitystation/unitystation-web/commit/5f63c2435f9e84b384282fe47a87d04aafeca514)) -* add page to confirm your mail after registering ([#68](https://github.com/unitystation/unitystation-web/issues/68)) ([c2f8d98](https://github.com/unitystation/unitystation-web/commit/c2f8d982407d0214eef16993360c9a8fdf574b05)) -* allow panel to receive props such as className from outside ([0d7d26e](https://github.com/unitystation/unitystation-web/commit/0d7d26eee287f6847e56182fff28993ee54df478)) -* functional login ([b4d74e8](https://github.com/unitystation/unitystation-web/commit/b4d74e84a5993a3cea0bae04553d07546256a589)) -* functional password reset ([3685893](https://github.com/unitystation/unitystation-web/commit/3685893d5751dbdcb9237169db491d7f7c8b0555)) -* functional register ([226f67d](https://github.com/unitystation/unitystation-web/commit/226f67dd46d49b9828c1bd7775d5afa13e54768b)) -* safe sessions handling in server with communication to central command ([2b9e133](https://github.com/unitystation/unitystation-web/commit/2b9e13375d155f948d896328230087848f8b01dd)) +- add new auth context provider to handle authentication state application wide ([dec6c17](https://github.com/unitystation/unitystation-web/commit/dec6c1723dfb111339ed7b5331c8cb190faa4c94)) +- add new login and register pages (still non-functional) ([5f63c24](https://github.com/unitystation/unitystation-web/commit/5f63c2435f9e84b384282fe47a87d04aafeca514)) +- add page to confirm your mail after registering ([#68](https://github.com/unitystation/unitystation-web/issues/68)) ([c2f8d98](https://github.com/unitystation/unitystation-web/commit/c2f8d982407d0214eef16993360c9a8fdf574b05)) +- allow panel to receive props such as className from outside ([0d7d26e](https://github.com/unitystation/unitystation-web/commit/0d7d26eee287f6847e56182fff28993ee54df478)) +- functional login ([b4d74e8](https://github.com/unitystation/unitystation-web/commit/b4d74e84a5993a3cea0bae04553d07546256a589)) +- functional password reset ([3685893](https://github.com/unitystation/unitystation-web/commit/3685893d5751dbdcb9237169db491d7f7c8b0555)) +- functional register ([226f67d](https://github.com/unitystation/unitystation-web/commit/226f67dd46d49b9828c1bd7775d5afa13e54768b)) +- safe sessions handling in server with communication to central command ([2b9e133](https://github.com/unitystation/unitystation-web/commit/2b9e13375d155f948d896328230087848f8b01dd)) # [1.8.0](https://github.com/unitystation/unitystation-web/compare/v1.7.0...v1.8.0) (2023-07-19) - ### Bug Fixes -* readded external link icon and opening in new tab ([72232e7](https://github.com/unitystation/unitystation-web/commit/72232e772df7414dd467311750bc7dff1346054a)) - +- readded external link icon and opening in new tab ([72232e7](https://github.com/unitystation/unitystation-web/commit/72232e772df7414dd467311750bc7dff1346054a)) ### Features -* add hero image behind the call to action button ([1801c98](https://github.com/unitystation/unitystation-web/commit/1801c9820bf41b9295ced30cb047de4a6b31f645)) -* add vercel analytics ([3b46c00](https://github.com/unitystation/unitystation-web/commit/3b46c000a60f3c481e2d7a3051051bb6bd171f3c)) -* finish home page and rewrite site in nextjs 13 ([dd83f0b](https://github.com/unitystation/unitystation-web/commit/dd83f0b131cc782e0890705d47779cdbb6c4c66c)) +- add hero image behind the call to action button ([1801c98](https://github.com/unitystation/unitystation-web/commit/1801c9820bf41b9295ced30cb047de4a6b31f645)) +- add vercel analytics ([3b46c00](https://github.com/unitystation/unitystation-web/commit/3b46c000a60f3c481e2d7a3051051bb6bd171f3c)) +- finish home page and rewrite site in nextjs 13 ([dd83f0b](https://github.com/unitystation/unitystation-web/commit/dd83f0b131cc782e0890705d47779cdbb6c4c66c)) # [1.7.0](https://github.com/unitystation/unitystation-web/compare/v1.6.0...v1.7.0) (2023-05-11) - ### Features -* separate dowload button from socials buttons and add icon prop to buttons ([0f7b7f4](https://github.com/unitystation/unitystation-web/commit/0f7b7f4a07635adfbf040c5e184314e8cc6399af)) +- separate dowload button from socials buttons and add icon prop to buttons ([0f7b7f4](https://github.com/unitystation/unitystation-web/commit/0f7b7f4a07635adfbf040c5e184314e8cc6399af)) # [1.6.0](https://github.com/unitystation/unitystation-web/compare/v1.5.0...v1.6.0) (2023-04-22) - ### Features -* properly display lists and embeded youtube videos ([d41256a](https://github.com/unitystation/unitystation-web/commit/d41256a4f23ba3f3a68993b29e32829d9d3030b9)) +- properly display lists and embeded youtube videos ([d41256a](https://github.com/unitystation/unitystation-web/commit/d41256a4f23ba3f3a68993b29e32829d9d3030b9)) # [1.5.0](https://github.com/unitystation/unitystation-web/compare/v1.4.0...v1.5.0) (2023-04-11) - ### Features -* adds infinite scrolling for blogposts ([cf7f45b](https://github.com/unitystation/unitystation-web/commit/cf7f45b1bbd32f4c0ce66b6e639f1fc205c7d879)) +- adds infinite scrolling for blogposts ([cf7f45b](https://github.com/unitystation/unitystation-web/commit/cf7f45b1bbd32f4c0ce66b6e639f1fc205c7d879)) # [1.4.0](https://github.com/unitystation/unitystation-web/compare/v1.3.1...v1.4.0) (2023-02-12) - ### Bug Fixes -* fix the word "in" being glued to the contributor's name ([#38](https://github.com/unitystation/unitystation-web/issues/38)) ([07e285a](https://github.com/unitystation/unitystation-web/commit/07e285a22d7a1e73004a41c33578c1e137b784a4)) - +- fix the word "in" being glued to the contributor's name ([#38](https://github.com/unitystation/unitystation-web/issues/38)) ([07e285a](https://github.com/unitystation/unitystation-web/commit/07e285a22d7a1e73004a41c33578c1e137b784a4)) ### Features -* **blog:** added badge with blog post type ([b13a644](https://github.com/unitystation/unitystation-web/commit/b13a644c30313482e8a84ff24ebfbd33c7da725a)) -* **blog:** made each post title a link to the blog post itself. ([d0ccf16](https://github.com/unitystation/unitystation-web/commit/d0ccf16478ba9b9e6b6ad87961a0cef6d3191861)) +- **blog:** added badge with blog post type ([b13a644](https://github.com/unitystation/unitystation-web/commit/b13a644c30313482e8a84ff24ebfbd33c7da725a)) +- **blog:** made each post title a link to the blog post itself. ([d0ccf16](https://github.com/unitystation/unitystation-web/commit/d0ccf16478ba9b9e6b6ad87961a0cef6d3191861)) ## [1.3.1](https://github.com/unitystation/unitystation-web/compare/v1.3.0...v1.3.1) (2023-02-01) - ### Bug Fixes -* improved meta tags ([caecda1](https://github.com/unitystation/unitystation-web/commit/caecda14e05cc237ca1b9a866e3958ffd8de62de)) +- improved meta tags ([caecda1](https://github.com/unitystation/unitystation-web/commit/caecda14e05cc237ca1b9a866e3958ffd8de62de)) # [1.3.0](https://github.com/unitystation/unitystation-web/compare/v1.2.0...v1.3.0) (2023-02-01) - ### Features -* added basic metadata with OpenGraph protocol ([e823bb6](https://github.com/unitystation/unitystation-web/commit/e823bb6379136fa97cb056fa8103b1df4ab3bbb1)) -* **blog:** new dynamic page to display a single blog post ([bc7bd40](https://github.com/unitystation/unitystation-web/commit/bc7bd407d51a7f9bbb3ab558683a4ef888577246)) +- added basic metadata with OpenGraph protocol ([e823bb6](https://github.com/unitystation/unitystation-web/commit/e823bb6379136fa97cb056fa8103b1df4ab3bbb1)) +- **blog:** new dynamic page to display a single blog post ([bc7bd40](https://github.com/unitystation/unitystation-web/commit/bc7bd407d51a7f9bbb3ab558683a4ef888577246)) # [1.2.0](https://github.com/unitystation/unitystation-web/compare/v1.1.0...v1.2.0) (2023-01-30) - ### Features -* **blog:** first iteration of blog page ([500d360](https://github.com/unitystation/unitystation-web/commit/500d360a9898a2d046f9ab5ce8faa182c6f1fb12)) +- **blog:** first iteration of blog page ([500d360](https://github.com/unitystation/unitystation-web/commit/500d360a9898a2d046f9ab5ce8faa182c6f1fb12)) # [1.1.0](https://github.com/unitystation/unitystation-web/compare/v1.0.0...v1.1.0) (2022-12-13) - ### Features -* adds a clown that will float around on your screen ([#19](https://github.com/unitystation/unitystation-web/issues/19)) ([93cddf2](https://github.com/unitystation/unitystation-web/commit/93cddf2f4666b387261d68529deeb808d5333948)) +- adds a clown that will float around on your screen ([#19](https://github.com/unitystation/unitystation-web/issues/19)) ([93cddf2](https://github.com/unitystation/unitystation-web/commit/93cddf2f4666b387261d68529deeb808d5333948)) # 1.0.0 (2022-12-11) - ### Bug Fixes -* fixes black text on some screens, background not repeating and build cards being links ([#10](https://github.com/unitystation/unitystation-web/issues/10)) ([fce5f12](https://github.com/unitystation/unitystation-web/commit/fce5f128ab7577ab90186ece1d6a0b50688cb7dd)) - +- fixes black text on some screens, background not repeating and build cards being links ([#10](https://github.com/unitystation/unitystation-web/issues/10)) ([fce5f12](https://github.com/unitystation/unitystation-web/commit/fce5f128ab7577ab90186ece1d6a0b50688cb7dd)) ### Features -* **changelog:** add colours for all different chagne type icons ([#15](https://github.com/unitystation/unitystation-web/issues/15)) ([5bbb520](https://github.com/unitystation/unitystation-web/commit/5bbb52021d5d46542066e06f7c0355fe891e392e)) -* download link will now get the user's OS automatically ([#2](https://github.com/unitystation/unitystation-web/issues/2)) ([b8d2ee7](https://github.com/unitystation/unitystation-web/commit/b8d2ee76bfa8191818f78d32304d67bde331be7c)) -* first iteration of website\nheavily under construction! ([ff7f2f9](https://github.com/unitystation/unitystation-web/commit/ff7f2f9d12beb8a3da1daba09d3d25896d2d1bc0)) +- **changelog:** add colours for all different chagne type icons ([#15](https://github.com/unitystation/unitystation-web/issues/15)) ([5bbb520](https://github.com/unitystation/unitystation-web/commit/5bbb52021d5d46542066e06f7c0355fe891e392e)) +- download link will now get the user's OS automatically ([#2](https://github.com/unitystation/unitystation-web/issues/2)) ([b8d2ee7](https://github.com/unitystation/unitystation-web/commit/b8d2ee76bfa8191818f78d32304d67bde331be7c)) +- first iteration of website\nheavily under construction! ([ff7f2f9](https://github.com/unitystation/unitystation-web/commit/ff7f2f9d12beb8a3da1daba09d3d25896d2d1bc0)) diff --git a/README.md b/README.md index f251bfd..4d95b0d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,21 @@ # Unitystation.org + This repository contains the source code for the Unitystation website, hosted at [unitystation.org](https://unitystation.org/). We are open to contributions from the community, so feel free to submit a pull request if you have any improvements to suggest. Just make sure -to see in issues if someone else is already working on it, and if not, create a new issue and assign it to yourself. +to see in issues if someone else is already working on it, and if not, create a new issue and assign it to yourself. We also have a [Discord](https://discord.com/invite/H6EunER) server, where you can ask questions and get help from the community. ## Development + ### Requirements + - [Node.js](https://nodejs.org/en/) (v18.x.x LTS or higher) - The website consumes the [Unitystation Changelog API](https://github.com/unitystation/changelog-api). Some functionalities might not be available if the API is not running. - The website consumes the [Central Command API](https://github.com/unitystation/central-command). Some functionalities might not be available if the API is not running. ### Technologies you should familiarize yourself with + - [Next.js](https://nextjs.org/) - [Tailwind CSS](https://tailwindcss.com/) - [React](https://reactjs.org/) @@ -19,6 +23,7 @@ We also have a [Discord](https://discord.com/invite/H6EunER) server, where you c - [Cypress](https://www.cypress.io/) ### Installation + 1. Clone the repository 2. Run `npm install` to install the dependencies 3. Run `npm run dev` to start the development server @@ -26,5 +31,5 @@ We also have a [Discord](https://discord.com/invite/H6EunER) server, where you c 5. Make changes to the code and see them reflected in the browser ### Deployment -The website is automatically deployed to [Unitystation.org](https://unitystation.org/) when a pull request is merged into the `master` branch. Also, any Pull Request that is opened will have a preview deployment, so you can see how your changes will look like before merging. +The website is automatically deployed to [Unitystation.org](https://unitystation.org/) when a pull request is merged into the `master` branch. Also, any Pull Request that is opened will have a preview deployment, so you can see how your changes will look like before merging. diff --git a/app/(account)/confirm-email/[token]/actions.ts b/app/(account)/confirm-email/[token]/actions.ts index d555853..4f4c3eb 100644 --- a/app/(account)/confirm-email/[token]/actions.ts +++ b/app/(account)/confirm-email/[token]/actions.ts @@ -1,28 +1,30 @@ -"use server" +"use server"; -import {isFieldError} from "../../../../lib/auth/guards"; +import { isFieldError } from "../../../../lib/auth/guards"; -export const postMailConfirmationToken = async (token: string): Promise => { +export const postMailConfirmationToken = async ( + token: string, +): Promise<{ success?: boolean; error?: string }> => { try { const response = await fetch(`${process.env.CC_API_URL}/accounts/confirm-account`, { method: "POST", headers: { "Content-Type": "application/json", }, - body: JSON.stringify({token}), + body: JSON.stringify({ token }), }); if (!response.ok) { const errorResponse = await response.json(); if (isFieldError(errorResponse) && errorResponse.error.token) { - return {error: errorResponse.error.token.join(' ')}; + return { error: errorResponse.error.token.join(" ") }; } - return {error: "An unexpected error occurred."}; + return { error: "An unexpected error occurred." }; } - return {success: true}; - } catch (error) { - return {error: "An unexpected error occurred."}; + return { success: true }; + } catch { + return { error: "An unexpected error occurred." }; } }; diff --git a/app/(account)/confirm-email/[token]/page.tsx b/app/(account)/confirm-email/[token]/page.tsx index 58761c3..a0cdb0f 100644 --- a/app/(account)/confirm-email/[token]/page.tsx +++ b/app/(account)/confirm-email/[token]/page.tsx @@ -1,49 +1,47 @@ -"use client" -import {useParams} from "next/navigation"; -import {postMailConfirmationToken} from "./actions"; -import React, {useEffect, useState} from "react"; -import Panel from "../../../common/uiLibrary/panel"; -import ContactInformation from "../../../(home)/contactInformation"; +"use client"; +import { useParams } from "next/navigation"; +import { useEffect, useState } from "react"; +import FormShell, { FormFooterLinks } from "../../../../components/ui/FormShell"; +import Spinner from "../../../../components/ui/Spinner"; +import Notice from "../../../../components/ui/Notice"; +import { postMailConfirmationToken } from "./actions"; -const MailConfirmationPage = () => { +export default function MailConfirmationPage() { const [response, setResponse] = useState<{ success?: boolean; error?: string }>({}); - const {token} = useParams<{token: string}>(); + const params = useParams<{ token: string }>(); + const token = params?.token; useEffect(() => { - const fetchData = async () => { - if (token) { - return await postMailConfirmationToken(token); - } - }; - - fetchData().then(r => { - setResponse(r); - }); + if (!token) return; + postMailConfirmationToken(token).then((r) => setResponse(r)); }, [token]); - if (!token) { - return
-
; - } + if (!token) return null; return ( -
-
- -
- {response.success ? ( -

Confirmation successful!

- ) : ( -

{response.error || 'Waiting for confirmation...'}

- )} -
-
-
- -
- ); -}; + + {response.success ? ( + +

Confirmation successful! Your account is ready.

+
+ ) : response.error ? ( + +

{response.error}

+
+ ) : ( +
+ +

Waiting for confirmation…

+
+ )} -export default MailConfirmationPage; \ No newline at end of file + +
+ ); +} diff --git a/app/(account)/login/page.tsx b/app/(account)/login/page.tsx index 9204921..6885efb 100644 --- a/app/(account)/login/page.tsx +++ b/app/(account)/login/page.tsx @@ -1,108 +1,78 @@ -"use client" +"use client"; -import React, {useContext, useEffect, useState} from "react"; -import Button from "../../common/uiLibrary/Button"; -import AlternativeActions from "../../common/uiLibrary/forms/alternativeActions"; -import FormContainer from "../../common/uiLibrary/Layouters/formContainer"; -import TextField from "../../common/uiLibrary/forms/textField"; -import ContactInformation from "../../(home)/contactInformation"; +import { redirect } from "next/navigation"; +import { useContext, useEffect, useState } from "react"; +import Button from "../../../components/ui/Button"; +import FormShell, { FormFooterLinks } from "../../../components/ui/FormShell"; +import Notice from "../../../components/ui/Notice"; +import TextField from "../../../components/ui/TextField"; +import { AuthorizerContext } from "../../../context/AuthorizerContextProvider"; +import { isGeneralError } from "../../../lib/auth/guards"; +import { fieldErrorFor } from "../../../lib/auth/fieldError"; -import {AuthorizerContext} from "../../../context/AuthorizerContextProvider"; -import {isFieldError, isGeneralError} from "../../../lib/auth/guards"; -import GenericLoading from "../../common/uiLibrary/genericLoading"; -import {redirect} from "next/navigation"; -import FullPage from "../../common/uiLibrary/Layouters/fullPage"; - -const LoginPage = () => { - const {state, credentialsLogin} = useContext(AuthorizerContext); +export default function LoginPage() { + const { state, credentialsLogin } = useContext(AuthorizerContext); const [isLoading, setIsLoading] = useState(false); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); useEffect(() => { if (state.isLoggedIn) { - redirect('/'); + redirect("/"); } - }, [state.isLoggedIn]) + }, [state.isLoggedIn]); const handleSubmit = async () => { setIsLoading(true); await credentialsLogin(email, password); setIsLoading(false); - } - - const errorMessage = (message: string) => { - return ( -
-

Oops!

-

{message}

-
- ) - } + }; - const loginForm = () => { - return ( - -
- {isLoading && -
- - Loading... -
- } - - {state.error && isGeneralError(state.error) && errorMessage(state.error.error)} + if (state.isLoggedIn) return null; - { - setEmail(e.target.value) - }} - helperText={state.error && isFieldError(state.error) && state.error.error.email && -
{state.error.error.email}
- } - /> + return ( + + {state.error && isGeneralError(state.error) && ( + +

{state.error.error}

+
+ )} - { - setPassword(e.target.value) - }} - helperText={state.error && isFieldError(state.error) && state.error.error.password && -
{state.error.error.password}
- } - /> + setEmail(e.target.value)} + error={fieldErrorFor(state.error, "email")} + /> - + setPassword(e.target.value)} + error={fieldErrorFor(state.error, "password")} + /> - -
-
- -
- ) - } + - return !state.isLoggedIn && loginForm(); + + + ); } - -export default LoginPage; diff --git a/app/(account)/logout/page.tsx b/app/(account)/logout/page.tsx index 32c6d0f..d0f449f 100644 --- a/app/(account)/logout/page.tsx +++ b/app/(account)/logout/page.tsx @@ -1,17 +1,28 @@ -"use client" +"use client"; -import {useContext, useEffect} from "react"; -import {redirect} from "next/navigation"; -import {AuthorizerContext} from "../../../context/AuthorizerContextProvider"; +import { useRouter } from "next/navigation"; +import { useContext, useEffect } from "react"; +import LoadingPanel from "../../../components/ui/LoadingPanel"; +import Container from "../../../components/ui/Container"; +import { AuthorizerContext } from "../../../context/AuthorizerContextProvider"; -const LogoutPage = () => { +export default function LogoutPage() { const authState = useContext(AuthorizerContext); + const router = useRouter(); useEffect(() => { authState.logout().then(() => { - redirect("login"); + router.replace("/login"); }); - }, [authState]); -} + // Log out exactly once on mount. `authState` gets a fresh identity on every + // render (useAuth returns a new object each time), so depending on it here + // would re-run this effect after logout's setState and loop infinitely. + // oxlint-disable-next-line react/exhaustive-deps + }, []); -export default LogoutPage; \ No newline at end of file + return ( + + + + ); +} diff --git a/app/(account)/register/actions.ts b/app/(account)/register/actions.ts index f018aea..df6aa77 100644 --- a/app/(account)/register/actions.ts +++ b/app/(account)/register/actions.ts @@ -1,58 +1,59 @@ -"use server" +"use server"; -import {FieldError, GeneralError} from "../../../lib/auth/guards"; -import {z} from "zod"; -import {revalidatePath} from "next/cache"; +import { FieldError, GeneralError } from "../../../lib/auth/guards"; +import { z } from "zod"; +import { revalidatePath } from "next/cache"; export interface RegisterResponse { success: boolean; error?: GeneralError | FieldError; } - -export const registerAccount = async (_: RegisterResponse, formData: FormData): Promise => { +export const registerAccount = async ( + _: RegisterResponse, + formData: FormData, +): Promise => { const schema = z.object({ email: z.string().email(), unique_identifier: z.string().min(3), username: z.string().min(3), - password: z.string().min(6) + password: z.string().min(6), }); const parsed = schema.safeParse({ - email: formData.get('email'), - unique_identifier: formData.get('unique_identifier'), - username: formData.get('username'), - password: formData.get('password') + email: formData.get("email"), + unique_identifier: formData.get("unique_identifier"), + username: formData.get("username"), + password: formData.get("password"), }); if (!parsed.success) { const fieldErrors = parsed.error.errors.reduce((acc, error) => { - return {...acc, [error.path[0]]: error.message} + return { ...acc, [error.path[0]]: error.message }; }, {}); - return {success: false, error: {status: 400, error: fieldErrors}}; + return { success: false, error: { status: 400, error: fieldErrors } }; } - const password2 = formData.get('password2'); + const password2 = formData.get("password2"); if (password2 !== parsed.data.password) { return { success: false, - error: - { - status: 400, - error: { - password2: ['Passwords do not match'] - } - } - } + error: { + status: 400, + error: { + password2: ["Passwords do not match"], + }, + }, + }; } const body = { email: parsed.data.email, unique_identifier: parsed.data.unique_identifier, username: parsed.data.username, - password: parsed.data.password - } + password: parsed.data.password, + }; try { const response = await fetch(`${process.env.CC_API_URL}/accounts/register`, { @@ -65,13 +66,13 @@ export const registerAccount = async (_: RegisterResponse, formData: FormData): if (!response.ok) { const error = await response.json(); - return {success: false, error: error}; + return { success: false, error: error }; } - revalidatePath('register'); + revalidatePath("register"); - return {success: true}; - } catch (error) { - return {success: false, error: {status: 500, error: 'An unexpected error occurred'}}; + return { success: true }; + } catch { + return { success: false, error: { status: 500, error: "An unexpected error occurred" } }; } -} \ No newline at end of file +}; diff --git a/app/(account)/register/page.tsx b/app/(account)/register/page.tsx index f9c67d2..9b2f506 100644 --- a/app/(account)/register/page.tsx +++ b/app/(account)/register/page.tsx @@ -1,168 +1,110 @@ -"use client" - -import React, {useActionState} from "react"; -import Button from "../../common/uiLibrary/Button"; -import FormContainer from "../../common/uiLibrary/Layouters/formContainer"; -import TextField from "../../common/uiLibrary/forms/textField"; -import AlternativeActions from "../../common/uiLibrary/forms/alternativeActions"; -import ContactInformation from "../../(home)/contactInformation"; -import "react-dom"; -import {registerAccount, RegisterResponse} from "./actions"; -import {isFieldError} from "../../../lib/auth/guards"; -import { useFormStatus } from "react-dom"; -import GenericLoading from "../../common/uiLibrary/genericLoading"; - -const RegisterPage = () => { - - const initialState: RegisterResponse = { - success: false, - error: undefined - } - const [state, formAction] = useActionState(registerAccount, initialState); - - const uniqueIdHelperText = () => - <> - Choose a unique identifier for your account. This identifier is permanent - and cannot be changed later. Please choose carefully! - - - const usernameHelperText = () => - <> - Choose a username that will be displayed to other users. This can be changed - later. - - - const registerForm = () => { +"use client"; + +import { useActionState } from "react"; +import Button from "../../../components/ui/Button"; +import FormShell, { FormFooterLinks } from "../../../components/ui/FormShell"; +import Notice from "../../../components/ui/Notice"; +import TextField from "../../../components/ui/TextField"; +import { isGeneralError } from "../../../lib/auth/guards"; +import { fieldErrorFor } from "../../../lib/auth/fieldError"; +import { registerAccount, RegisterResponse } from "./actions"; + +const initialState: RegisterResponse = { + success: false, + error: undefined, +}; + +const UNIQUE_ID_HELPER = + "Choose a unique identifier for your account. This identifier is permanent and cannot be changed later, please choose carefully!"; +const USERNAME_HELPER = + "Choose a username that will be displayed to other users. This can be changed later."; + +export default function RegisterPage() { + const [state, formAction, isPending] = useActionState(registerAccount, initialState); + + if (state.success) { return ( - <> - - {state.error?.error.email} - - : - usernameHelperText() - } - /> - - - {state.error?.error.unique_identifier} - - : - uniqueIdHelperText() - } - /> - - - {state.error?.error.username} - - : - usernameHelperText() - } - /> - - - {state.error?.error.password} - - } - /> - - - {state.error?.error.password2} - - } - /> - - - - - - ) - } - const successMessage = () => { - return ( -
-

Success!

-

An email has been sent with instructions to confirm your account.

-

Please check your inbox and follow the instructions to complete the process.

-

Didn't receive the email? Check your Spam folder or try resending the email. Ensure your email - address is - entered correctly.

-
- ) - } - - const FormOrLoading = () => { - const {pending} = useFormStatus(); - if (pending) { - return ( -
- - Loading... -
- ) - } else { - return registerForm() - } + + +

An email has been sent with instructions to confirm your account.

+

+ Please check your inbox and follow the instructions to complete the process. +

+

+ Didn't receive the email? Check your Spam folder or try resending the + email. Ensure your email address is entered correctly. +

+
+ +
+ ); } return ( -
- -
- - {state.success ? successMessage() : FormOrLoading()} - -
- -
+ + {state.error && isGeneralError(state.error) && ( + +

{state.error.error}

+
+ )} + + + + + + + + + + + + + + +
); } - -export default RegisterPage; diff --git a/app/(account)/resend-confirm-email/actions.ts b/app/(account)/resend-confirm-email/actions.ts index b27851b..4ddde6f 100644 --- a/app/(account)/resend-confirm-email/actions.ts +++ b/app/(account)/resend-confirm-email/actions.ts @@ -1,53 +1,61 @@ -"use server" +"use server"; -import {z} from 'zod'; -import {FieldError, GeneralError, isFieldError} from "../../../lib/auth/guards"; +import { z } from "zod"; +import { FieldError, GeneralError, isFieldError } from "../../../lib/auth/guards"; export interface ResendConfirmationMailRequest { success: boolean; error?: GeneralError | FieldError; } -export const postResendConfirmationMail = async (_: ResendConfirmationMailRequest, formData: FormData): Promise => { +export const postResendConfirmationMail = async ( + _: ResendConfirmationMailRequest, + formData: FormData, +): Promise => { const schema = z.object({ - email: z.string().email() + email: z.string().email(), }); const parsed = schema.safeParse({ - email: formData.get('email') + email: formData.get("email"), }); if (!parsed.success) { const fieldErrors = parsed.error.errors.reduce((acc, error) => { - return {...acc, [error.path[0]]: error.message} + return { ...acc, [error.path[0]]: error.message }; }, {}); - return {success: false, error: {status: 400, error: fieldErrors}}; + return { success: false, error: { status: 400, error: fieldErrors } }; } try { - const response = await fetch(`${process.env.CC_API_URL}/accounts/resend-account-confirmation`, { - method: "POST", - headers: { - 'Content-Type': 'application/json' + const response = await fetch( + `${process.env.CC_API_URL}/accounts/resend-account-confirmation`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: parsed.data.email, + }), }, - body: JSON.stringify({ - email: parsed.data.email - }) - }); + ); if (!response.ok) { const error = await response.json(); if (isFieldError(error)) { - return {success: false, error: error}; + return { success: false, error: error }; } - return {success: false, error: {error: 'An unexpected error happened', status: 500}}; + return { + success: false, + error: { error: "An unexpected error happened", status: 500 }, + }; } - - } catch (e) { - return {success: false, error: {error: 'An unexpected error happened', status: 500}}; + } catch { + return { success: false, error: { error: "An unexpected error happened", status: 500 } }; } - return {success: true} -} \ No newline at end of file + return { success: true }; +}; diff --git a/app/(account)/resend-confirm-email/page.tsx b/app/(account)/resend-confirm-email/page.tsx index 1cb6fb9..0fb3e9f 100644 --- a/app/(account)/resend-confirm-email/page.tsx +++ b/app/(account)/resend-confirm-email/page.tsx @@ -1,69 +1,66 @@ -"use client" +"use client"; +import { useActionState } from "react"; +import Button from "../../../components/ui/Button"; +import FormShell, { FormFooterLinks } from "../../../components/ui/FormShell"; +import Notice from "../../../components/ui/Notice"; +import TextField from "../../../components/ui/TextField"; +import { fieldErrorFor } from "../../../lib/auth/fieldError"; +import { postResendConfirmationMail, ResendConfirmationMailRequest } from "./actions"; -import FormContainer from "../../common/uiLibrary/Layouters/formContainer"; -import TextField from "../../common/uiLibrary/forms/textField"; -import Button from "../../common/uiLibrary/Button"; -import ContactInformation from "../../(home)/contactInformation"; -import React, {useActionState} from "react"; -import FullPage from "../../common/uiLibrary/Layouters/fullPage"; -import {postResendConfirmationMail, ResendConfirmationMailRequest} from "./actions"; - -const ResendConfirmationMail = () => { - const initialState: ResendConfirmationMailRequest = { - success: false, - } - - const [state, formAction] = useActionState(postResendConfirmationMail, initialState); +const initialState: ResendConfirmationMailRequest = { + success: false, +}; - const resendForm = () => { - return ( - <> - {!state.success && state.error && errorMessage()} +export default function ResendConfirmationMail() { + const [state, formAction, isPending] = useActionState(postResendConfirmationMail, initialState); - - - - ) - } - const errorMessage = () => { + if (state.success) { return ( -
-

Oops!

-

There was an unexpected error while trying to resend the confirmation email.

-

Please try again later or contact us.

-
- ) + + +

+ Your request has been processed successfully. If your account is found in + our system and the email address you provided matches our records, we have + sent a confirmation email to that address. +

+

+ Please check your inbox for the confirmation email. If you don't + receive it within a few minutes, check your spam or junk folder. For further + assistance, don't hesitate to contact us. +

+
+ +
+ ); } - const successMessage = () => ( -
-

Success!

-

Your request has been processed successfully. If your account is found in our system and the email - address you provided matches our records, we have sent a confirmation email to that address.

-

Please check your inbox for the confirmation email. If you don't receive it within a few minutes, check - your spam or junk folder. For further assistance, don't hesitate to contact us.

-
- ); - return ( - -
- - {state.success ? successMessage() : resendForm()} - -
- -
- ) -}; + + {state.error && ( + +

+ There was an unexpected error while trying to resend the confirmation email. +

+

Please try again later or contact us.

+
+ )} -export default ResendConfirmationMail; \ No newline at end of file + + + + + +
+ ); +} diff --git a/app/(account)/reset-password/[token]/actions.ts b/app/(account)/reset-password/[token]/actions.ts index f233447..139c449 100644 --- a/app/(account)/reset-password/[token]/actions.ts +++ b/app/(account)/reset-password/[token]/actions.ts @@ -1,75 +1,95 @@ -"use server" +"use server"; -import {FieldError, GeneralError, isFieldError, isGeneralError} from "../../../../lib/auth/guards"; -import {z} from "zod"; +import { + FieldError, + GeneralError, + isFieldError, + isGeneralError, +} from "../../../../lib/auth/guards"; +import { z } from "zod"; export interface ResetPasswordStep2Response { success: boolean; error?: GeneralError | FieldError; } -export const postPasswordReset = async (_: ResetPasswordStep2Response, formData: FormData): Promise => { +export const postPasswordReset = async ( + _: ResetPasswordStep2Response, + formData: FormData, +): Promise => { const schema = z.object({ password: z.string().min(6), - token: z.string().min(1) + token: z.string().min(1), }); const parsed = schema.safeParse({ - password: formData.get('password'), - password2: formData.get('password2'), - token: formData.get('token') + password: formData.get("password"), + password2: formData.get("password2"), + token: formData.get("token"), }); if (!parsed.success) { const fieldErrors = parsed.error.errors.reduce((acc, error) => { - return {...acc, [error.path[0]]: error.message} + return { ...acc, [error.path[0]]: error.message }; }, {}); - return {success: false, error: {status: 400, error: fieldErrors}}; + return { success: false, error: { status: 400, error: fieldErrors } }; } - const password2 = formData.get('password2'); + const password2 = formData.get("password2"); if (password2 !== parsed.data.password) { return { success: false, - error: - { - status: 400, - error: { - password2: ['Passwords do not match'] - } - } - } + error: { + status: 400, + error: { + password2: ["Passwords do not match"], + }, + }, + }; } const body = { password: parsed.data.password, - token: parsed.data.token - } + token: parsed.data.token, + }; try { - const response = await fetch(`${process.env.CC_API_URL}/accounts/reset-password/${parsed.data.token}`, { - method: "POST", - headers: { - "Content-Type": "application/json", + const response = await fetch( + `${process.env.CC_API_URL}/accounts/reset-password/${parsed.data.token}`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(body), }, - body: JSON.stringify(body), - }); + ); if (!response.ok) { - if (isFieldError(response) && response.error.token) { - return {success: false, error: {status: 400, error: "Your link has expired. Please request a new one."}}; + const errorResponse = await response.json(); + if (isFieldError(errorResponse) && errorResponse.error.token) { + return { + success: false, + error: { + status: 400, + error: "Your link has expired. Please request a new one.", + }, + }; } - if (isFieldError(response) || isGeneralError(response)) { - return {success: false, error: response}; + if (isFieldError(errorResponse) || isGeneralError(errorResponse)) { + return { success: false, error: errorResponse }; } - return { success: false, error: {status: 400, error: "An unexpected error occurred"}}; + return { + success: false, + error: { status: 400, error: "An unexpected error occurred" }, + }; } - return { success: true}; - } catch (error) { - return { success: false, error: {status: 400, error: "An unexpected error occurred"}}; + return { success: true }; + } catch { + return { success: false, error: { status: 400, error: "An unexpected error occurred" } }; } -} \ No newline at end of file +}; diff --git a/app/(account)/reset-password/[token]/page.tsx b/app/(account)/reset-password/[token]/page.tsx index 39a151b..cda687a 100644 --- a/app/(account)/reset-password/[token]/page.tsx +++ b/app/(account)/reset-password/[token]/page.tsx @@ -1,92 +1,73 @@ -"use client" +"use client"; +import { useParams } from "next/navigation"; +import { useActionState } from "react"; +import Button from "../../../../components/ui/Button"; +import FormShell, { FormFooterLinks } from "../../../../components/ui/FormShell"; +import Notice from "../../../../components/ui/Notice"; +import TextField from "../../../../components/ui/TextField"; +import { fieldErrorFor } from "../../../../lib/auth/fieldError"; +import { postPasswordReset, ResetPasswordStep2Response } from "./actions"; -import {useParams} from "next/navigation"; -import React, {useActionState} from "react"; -import FormContainer from "../../../common/uiLibrary/Layouters/formContainer"; -import TextField from "../../../common/uiLibrary/forms/textField"; -import Button from "../../../common/uiLibrary/Button"; -import {postPasswordReset, ResetPasswordStep2Response} from "./actions"; -import {isFieldError} from "../../../../lib/auth/guards"; -import FullPage from "../../../common/uiLibrary/Layouters/fullPage"; +const initialState: ResetPasswordStep2Response = { + success: false, + error: undefined, +}; -const ResetPasswordPageStep2 = () => { - const {token} = useParams<{ token: string }>(); - const initialState: ResetPasswordStep2Response = { - success: false, - error: undefined - } - - const [state, formAction] = useActionState(postPasswordReset, initialState); +export default function ResetPasswordPageStep2() { + const params = useParams<{ token: string }>(); + const token = params?.token; + const [state, formAction, isPending] = useActionState(postPasswordReset, initialState); - const successMessage = () => ( -
-

Success!

-

Your password has been reset successfully.

-

You can now log in using your new password.

-
- ); - - const errorMessage = () => { + if (state.success) { return ( -
-

Oops!

-

There was an error while trying to reset your password. Your password-reset token might be invalid or expired.

-

Please try requesting a new password reset or contact us.

-
- ) + + +

Your password has been reset successfully.

+

You can now log in using your new password.

+
+ +
+ ); } - const resetPasswordForm = () => { - return ( - <> - {state.error && errorMessage()} - - {state.error?.error.password} - - } - /> + return ( + + {state.error && ( + +

+ There was an error while trying to reset your password. Your password-reset + token might be invalid or expired. +

+

Please try requesting a new password reset or contact us.

+
+ )} - - {state.error?.error.password2} - - } - /> + - + - - - ) - } + - return ( - -
- - {state.success ? successMessage() : resetPasswordForm()} - -
-
- ) + +
+ ); } - -export default ResetPasswordPageStep2; \ No newline at end of file diff --git a/app/(account)/reset-password/actions.ts b/app/(account)/reset-password/actions.ts index 675c059..46b34b5 100644 --- a/app/(account)/reset-password/actions.ts +++ b/app/(account)/reset-password/actions.ts @@ -1,7 +1,7 @@ -'use server' +"use server"; -import {revalidatePath} from "next/cache"; -import {z} from "zod"; +import { revalidatePath } from "next/cache"; +import { z } from "zod"; export interface ResetPassowrdStep1 { success: boolean; @@ -10,17 +10,23 @@ export interface ResetPassowrdStep1 { fieldErrors?: { [key: string]: string }; } -export const requestAPasswordReset = async (_: ResetPassowrdStep1, formData : FormData): Promise => { +export const requestAPasswordReset = async ( + _: ResetPassowrdStep1, + formData: FormData, +): Promise => { const schema = z.object({ email: z.string().email(), }); - const parsed = schema.safeParse( - { email: formData.get('email')} - ); + const parsed = schema.safeParse({ email: formData.get("email") }); if (!parsed.success) { - return { success: false, email: '', message: '', fieldErrors: { email: 'Invalid email address'}}; + return { + success: false, + email: "", + message: "", + fieldErrors: { email: "Invalid email address" }, + }; } const email = parsed.data.email; @@ -35,13 +41,13 @@ export const requestAPasswordReset = async (_: ResetPassowrdStep1, formData : Fo }); if (!response.ok) { - return { success: false, email: email, message: 'An unexpected error occurred'}; + return { success: false, email: email, message: "An unexpected error occurred" }; } - revalidatePath('reset-password'); + revalidatePath("reset-password"); - return { success: true}; - } catch (error) { - return { success: false, email: email, message: 'An unexpected error occurred'}; + return { success: true }; + } catch { + return { success: false, email: email, message: "An unexpected error occurred" }; } }; diff --git a/app/(account)/reset-password/page.tsx b/app/(account)/reset-password/page.tsx index 2da580b..411638d 100644 --- a/app/(account)/reset-password/page.tsx +++ b/app/(account)/reset-password/page.tsx @@ -1,67 +1,63 @@ -'use client' +"use client"; -import Button from "../../common/uiLibrary/Button"; -import React, {useActionState} from "react"; -import FormContainer from "../../common/uiLibrary/Layouters/formContainer"; -import TextField from "../../common/uiLibrary/forms/textField"; -import {requestAPasswordReset, ResetPassowrdStep1} from "./actions"; -import ContactInformation from "../../(home)/contactInformation"; +import { useActionState } from "react"; +import Button from "../../../components/ui/Button"; +import FormShell, { FormFooterLinks } from "../../../components/ui/FormShell"; +import Notice from "../../../components/ui/Notice"; +import TextField from "../../../components/ui/TextField"; +import { requestAPasswordReset, ResetPassowrdStep1 } from "./actions"; const initialState: ResetPassowrdStep1 = { success: false, message: undefined, - email: '' + email: "", }; -const ResetPasswordPage = () => { - const [state, formAction] = useActionState(requestAPasswordReset, initialState); +export default function ResetPasswordPage() { + const [state, formAction, isPending] = useActionState(requestAPasswordReset, initialState); - const successMessage = () => ( -
-

Success!

-

An email has been sent with instructions to reset your password.

-

Please check your inbox and follow the instructions to complete the process.

-

Didn't receive the email? Check your Spam folder or try requesting a password reset again. Ensure your email address is - entered correctly.

-
- ); - - const errorMessages = () => { + if (state.success) { return ( -
-

Oops!

-

There was an unexpected error while trying to reset your password.

-

Please try again later or contact us.

-
- ) + + +

An email has been sent with instructions to reset your password.

+

+ Please check your inbox and follow the instructions to complete the process. +

+

+ Didn't receive the email? Check your Spam folder or try requesting a + password reset again. Ensure your email address is entered correctly. +

+
+ +
+ ); } return ( -
-
- - {state.success ? successMessage() : state.message && errorMessages()} - - - {state.fieldErrors?.email} -
- } - /> - - -
- - - ) + + {state.message && ( + +

There was an unexpected error while trying to reset your password.

+

Please try again later or contact us.

+
+ )} + + + + + + +
+ ); } - -export default ResetPasswordPage; \ No newline at end of file diff --git a/app/(home)/DownloadButtonClient.tsx b/app/(home)/DownloadButtonClient.tsx deleted file mode 100644 index 2c5c433..0000000 --- a/app/(home)/DownloadButtonClient.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import LinkButton from '../common/uiLibrary/linkButton'; -import { BiSolidDownload } from 'react-icons/bi'; - -const DownloadButtonClient = () => { - return ( -
- -
- ); -}; - -export default DownloadButtonClient; diff --git a/app/(home)/HomeBannerClient.tsx b/app/(home)/HomeBannerClient.tsx deleted file mode 100644 index 8ddb769..0000000 --- a/app/(home)/HomeBannerClient.tsx +++ /dev/null @@ -1,66 +0,0 @@ -'use client'; - -import layoutChildren from "../../types/layoutChildren"; -import {useEffect, useState} from "react"; - -const images: string[] = [ - "https://cdn.unitystation.org/Website-Statics/heroImages/bar-engine.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/clowns.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/conveyor.jpg", - "https://cdn.unitystation.org/Website-Statics/heroImages/df.jpg", - "https://cdn.unitystation.org/Website-Statics/heroImages/go-outsid.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/honk.jpg", - "https://cdn.unitystation.org/Website-Statics/heroImages/hugger.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/lemons.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/shuttlecrash.png", - "https://cdn.unitystation.org/Website-Statics/heroImages/chairs.jpg", -]; - -let currentIndex = 0; - -const getNextImage = () => { - currentIndex = (currentIndex + 1) % images.length; - return images[currentIndex]; -}; - -const HomeBannerClient = (props: layoutChildren) => { - const {children} = props; - - const [image1, setImage1] = useState(getNextImage()); - const [image2, setImage2] = useState(getNextImage()); - const [showImage1, setShowImage1] = useState(true); - - useEffect(() => { - const intervalId = setInterval(() => { - setShowImage1(!showImage1); - if (showImage1) { - setImage2(getNextImage()); - } else { - setImage1(getNextImage()); - } - }, 10000); - - return () => clearInterval(intervalId); - }, [showImage1]); - - - return ( -
-
-
-
-
-
-
- {children} -
-
- ) - -} - -export default HomeBannerClient; \ No newline at end of file diff --git a/app/(home)/LandingButtonsServer.tsx b/app/(home)/LandingButtonsServer.tsx deleted file mode 100644 index a93f3c2..0000000 --- a/app/(home)/LandingButtonsServer.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import LinkButton from "../common/uiLibrary/linkButton"; -import {DISCORD_INVITE_URL, GITHUB_URL, PATREON_URL} from "../../utils/urlContants"; - - - -const LandingButtonsServer = () => { - return ( -
- - - -
- ) -} - -export default LandingButtonsServer; \ No newline at end of file diff --git a/app/(home)/contactInformation.tsx b/app/(home)/contactInformation.tsx deleted file mode 100644 index 21d5390..0000000 --- a/app/(home)/contactInformation.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import {DISCORD_INVITE_URL} from "../../utils/urlContants"; -import {BsDiscord} from "react-icons/bs"; -import {MdEmail} from "react-icons/md"; -import React from "react"; - -const ContactInformation = () => { - return ( -
-
Let's Chat!
-

- We'd love to hear from you! The quickest way to reach us is by joining our Discord server and dropping - us a message. But, if you'd rather, feel free to shoot us an email. -

- -
- ); -} - -export default ContactInformation; \ No newline at end of file diff --git a/app/(home)/featuresList.tsx b/app/(home)/featuresList.tsx deleted file mode 100644 index cea98fa..0000000 --- a/app/(home)/featuresList.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import {IconType} from "react-icons"; - -export type FeatureData = { - title: string; - description: string; - icon: IconType, - imageUrl: string; -} - -interface FeaturesListProps{ - features: FeatureData[]; -} - -type FeatureCardProps = { - feature: FeatureData; -} - -const FeatureCard = ({ feature }: FeatureCardProps) => { - const { title, description, icon: Icon } = feature; - - return ( -
-
-
- -
-
-

{title}

-

{description}

-
-
-
- ); -} - - -const FeaturesList = ({ features }: FeaturesListProps) => { - return ( -
- {features.map((feature, index) => ( - - ))} -
- ); -} - -export default FeaturesList; diff --git a/app/(home)/landingText.tsx b/app/(home)/landingText.tsx deleted file mode 100644 index 7dcd992..0000000 --- a/app/(home)/landingText.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import RandomThirdTextClient from "./randomThirdTextClient"; - -interface LandingTextProps { - mainText: string - secondaryText: string -} - -const LandingText = (props: LandingTextProps) => { - const {mainText, secondaryText} = props; - - return ( -
-

- {mainText} -

-

- {secondaryText} -

- -
) -} - -export default LandingText; \ No newline at end of file diff --git a/app/(home)/latestNews.tsx b/app/(home)/latestNews.tsx deleted file mode 100644 index f4da1f9..0000000 --- a/app/(home)/latestNews.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import {BlogPost} from "../../types/blogPost"; -import classNames from "classnames"; -import Container from "../common/uiLibrary/container"; -import PageSectionTitle from "../common/uiLibrary/pageSectionTitle"; -import LinkButton from "../common/uiLibrary/linkButton"; -import Image from "next/image"; - -interface PostPreviewCardProps { - post: BlogPost, - isMain?: boolean, - className?: string -} - -interface LatestNewsProps { - posts: BlogPost[] - className?: string -} - -const PostPreviewImage = ({post, isMain = false, className}: PostPreviewCardProps) => { - const outerContainerStyles = classNames( - {'flex-1 overflow-hidden': isMain}, - {'w-full xl:w-1/3 overflow-hidden rounded-lg': !isMain}, - ) - - const innerContainerStyles = classNames( - {'w-full h-32 lg:h-40': !isMain}, - 'overflow-hidden', 'rounded-lg', - {'h-full' : isMain} - ) - - return ( -
-
- {/* eslint-disable-next-line @next/next/no-img-element */} - {post.title} -
-
- ) -} - -const PostPreviewBody = ({post, isMain = false, className}: PostPreviewCardProps) => { - const truncateSummary = (text: string) => { - const maxChars = 100; - - if (isMain) { - return text; - } - return text.length > maxChars ? text.slice(0, maxChars - 3) + '...' : text; - }; - - const styles = classNames( - 'mt-4', - {'lg:mt-0 lg:ml-4 lg:flex-1': !isMain} - - ); - - const titleStyles = classNames( - {'text-xl': isMain}, - {'text-l': !isMain}, - 'font-bold text-white-800 mb-2' - ); - - return ( -
-

{post.title}

-

{new Date(post.date_created).toLocaleDateString()}

-

{truncateSummary(post.summary)}

-
- ) -} - -const PostPreviewCard = ({post, isMain}: PostPreviewCardProps) => { - const style = classNames( - 'flex', - 'flex-col', - 'flex-1', - 'hover:border-l hover:border-r hover:border-b hover:border-t hover:border-gray-700 hover:rounded-lg', - 'group', - 'mb-8 xl:mb-0', - {'xl:max-w-[600px]': isMain}, - {'xl:max-w-[550px] xl:flex-row': !isMain}, - ); - - return ( - - - - - ); -}; - -const LatestNews = (props: LatestNewsProps) => { - const {posts, className} = props; - - return ( -
- Latest News - -
-
- - -
- {posts.slice(1).map((post) => ( - - ))} -
-
-
- -
-
-
-
- ); -} - -export default LatestNews; diff --git a/app/(home)/page.tsx b/app/(home)/page.tsx index 30d30a0..fd547dd 100644 --- a/app/(home)/page.tsx +++ b/app/(home)/page.tsx @@ -1,45 +1,43 @@ -import LandingText from "./landingText"; -import {BlogPost} from "../../types/blogPost"; -import {BlogPostsResponse} from "../../types/blogPostsResponse"; +import { BlogPost } from "../../types/blogPost"; +import { BlogPostsResponse } from "../../types/blogPostsResponse"; import FetchOfType from "../../utils/fetchOfType"; -import LandingButtonsServer from "./LandingButtonsServer"; -import DownloadButtonClient from "./DownloadButtonClient"; -import LatestNews from "./latestNews"; -import ContactInformation from "./contactInformation"; -import React from "react"; -import dynamic from 'next/dynamic'; -import HomeBannerClient from "./HomeBannerClient"; +import Hero from "../../components/home/Hero"; +import JobsTicker from "../../components/home/JobsTicker"; +import AboutSection from "../../components/home/AboutSection"; +import NewsSection from "../../components/home/NewsSection"; +import CommunitySection from "../../components/home/CommunitySection"; -const mainText = "Welcome to Unitystation!"; -const secondaryText = "Free and open-source remake of the cult classic Space Station 13, made in Unity Engine."; -const fetchLatestBlogPost = async (): Promise => { - const revalidateConfig = {next: {revalidate: 60}}; - const resPage1 = await FetchOfType('https://changelog.unitystation.org/posts/', revalidateConfig); - const resPage2 = await FetchOfType('https://changelog.unitystation.org/posts/?page=2', revalidateConfig); - return resPage1.results.concat(resPage2.results); -} +const fetchLatestBlogPosts = async (): Promise => { + const revalidateConfig = { next: { revalidate: 60 } }; + try { + const [page1, page2] = await Promise.all([ + FetchOfType( + "https://changelog.unitystation.org/posts/", + revalidateConfig, + ), + FetchOfType( + "https://changelog.unitystation.org/posts/?page=2", + revalidateConfig, + ), + ]); + return page1.results.concat(page2.results); + } catch { + return []; + } +}; const HomePage = async () => { - const latestBlogPosts: BlogPost[] = await fetchLatestBlogPost(); + const latestBlogPosts = await fetchLatestBlogPosts(); return ( <> -
-
- - - - - -
-
- -
-
- - + + + + + ); }; -export default HomePage; \ No newline at end of file +export default HomePage; diff --git a/app/(home)/randomThirdTextClient.tsx b/app/(home)/randomThirdTextClient.tsx deleted file mode 100644 index 86a2238..0000000 --- a/app/(home)/randomThirdTextClient.tsx +++ /dev/null @@ -1,37 +0,0 @@ -'use client'; - - -import {useEffect, useState} from "react"; - -const texts = [ - 'Join our Discord server to get involved!', - 'Yeah, we have some bugs but at least they are funny!', - 'We are not dead yet!', - 'Surviving the curse one PR at a time!', - 'I\'m not a web developer, please send help!', - 'Thank you patreons for keeping the lights on!', - 'Check our Github if you want to contribute!', - 'Devlog might release any time now!', - '[object Object]', - 'Join us every Saturday on our community playtest! (More info on Discord)', -] - -const RandomThirdTextClient = () => { - - const [randomText, setRandomText] = useState(texts[0]); - - useEffect(() => { - const interval = setInterval(() => { - setRandomText(texts[Math.floor(Math.random() * texts.length)]); - }, 5000); - return () => clearInterval(interval); - }) - - return ( -

- {randomText} -

- ) -} - -export default RandomThirdTextClient; \ No newline at end of file diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index 5208318..39d2c9d 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -1,50 +1,42 @@ -import {BlogPost} from "../../../types/blogPost"; +import { Metadata } from "next"; +import Container from "../../../components/ui/Container"; +import { BlogPost } from "../../../types/blogPost"; +import { PageParams } from "../../../types/pageParams"; import FetchOfType from "../../../utils/fetchOfType"; -import React from "react"; -import Post from "./post"; -import {PageParams} from "../../../types/pageParams"; -import {Metadata} from "next"; +import "../ck-content.css"; +import PostArticle from "../../../components/blog/PostArticle"; const fetchPost = async (slug: string): Promise => { - return await FetchOfType(`https://changelog.unitystation.org/posts/${slug}`); -} - -export const metadata: Metadata = { + return FetchOfType(`https://changelog.unitystation.org/posts/${slug}`, { + next: { revalidate: 60 }, + }); +}; -} +export async function generateMetadata(query: PageParams): Promise { + const { slug } = await query.params; + const post = await fetchPost(slug); -const setMetadata = (post: BlogPost) => { - metadata.title = `Unitystation - ${post.title}`; - metadata.description = post.summary; - metadata.openGraph = { - type: 'website', - locale: 'en_US', - url: `https://unitystation.org/blog/${post.slug}`, + return { title: `Unitystation - ${post.title}`, description: post.summary, - images: [ - { - url: post.socials_image - } - ] - } + openGraph: { + type: "website", + locale: "en_US", + url: `https://unitystation.org/blog/${post.slug}`, + title: `Unitystation - ${post.title}`, + description: post.summary, + images: [{ url: post.socials_image }], + }, + }; } -const PostPage = async (query: PageParams) => { - - const {slug} = await query.params; - const post: BlogPost = await fetchPost(slug as string); - setMetadata(post); +export default async function PostPage(query: PageParams) { + const { slug } = await query.params; + const post = await fetchPost(slug); return ( - <> -
-
- {} -
-
- - ) + + + + ); } - -export default PostPage; \ No newline at end of file diff --git a/app/blog/[slug]/post.tsx b/app/blog/[slug]/post.tsx deleted file mode 100644 index 26edba0..0000000 --- a/app/blog/[slug]/post.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import Link from "next/link"; -import Dict = NodeJS.Dict; -import {BlogPost} from "../../../types/blogPost"; -import Panel from "../../common/uiLibrary/panel"; -import {toAgoTime} from "../../../utils/timeUtils"; -import Capsule from "../../common/uiLibrary/capsule"; -import Section from "./section"; - -const colourByType: Dict = { - 'announcement': 'blue', - 'weekly': 'indigo', - 'community': 'green', -} - -const textByType: Dict = { - 'announcement': 'Announcement', - 'weekly': 'Progress Update', - 'community': 'Community Highlight', -} - -type PostProps = { - post: BlogPost; -} - -const Post = ({ post }: PostProps) => { - const {title, author, date_created, slug, type, sections} = post; - - return ( - <> - -
-
-
-
- -

- {title} -

- -

by {author}

-

- -

-
-
-
- -
-
-
-
- {!!sections && sections.map((section, index) => { - return ( -
- ) - }) - } -
-
- - ) -} - -export default Post; \ No newline at end of file diff --git a/app/blog/[slug]/section.tsx b/app/blog/[slug]/section.tsx deleted file mode 100644 index 116ded0..0000000 --- a/app/blog/[slug]/section.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import {BlogPostSection} from "../../../types/blogPost"; - -const handleOembed = (heading: string, body: string): string => { - const pattern = /<\/oembed>/g; - const iframeReplacement = (match: string, videoId: string): string => { - return ` -
- -
- `; - } - - return body.replace(pattern, iframeReplacement); -} - - -const Section = (props: BlogPostSection) => { - const {heading, body} = props; - - return ( -
- {heading &&

{heading}

} -
-
- ) -} - -export default Section; \ No newline at end of file diff --git a/app/blog/ck-content.css b/app/blog/ck-content.css index 8ea791d..d79580d 100644 --- a/app/blog/ck-content.css +++ b/app/blog/ck-content.css @@ -5,22 +5,22 @@ */ :root { - --ck-color-image-caption-background: hsl(0, 0%, 97%); - --ck-color-image-caption-text: hsl(0, 0%, 20%); - --ck-color-table-caption-background: hsl(0, 0%, 97%); - --ck-color-table-caption-text: hsl(0, 0%, 20%); + --ck-color-image-caption-background: rgb(var(--c-hull)); + --ck-color-image-caption-text: rgb(var(--c-dim)); + --ck-color-table-caption-background: rgb(var(--c-hull)); + --ck-color-table-caption-text: rgb(var(--c-dim)); --ck-image-style-spacing: 1.5em; --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2); } /* ckeditor5-font/theme/fontsize.css */ .ck-content .text-tiny { - font-size: .7em; + font-size: 0.7em; } /* ckeditor5-font/theme/fontsize.css */ .ck-content .text-small { - font-size: .85em; + font-size: 0.85em; } /* ckeditor5-font/theme/fontsize.css */ @@ -82,8 +82,8 @@ word-break: break-word; color: var(--ck-color-image-caption-text); background-color: var(--ck-color-image-caption-background); - padding: .6em; - font-size: .75em; + padding: 0.6em; + font-size: 0.75em; outline-offset: -1px; } @@ -193,8 +193,8 @@ text-align: center; color: var(--ck-color-table-caption-text); background-color: var(--ck-color-table-caption-background); - padding: .6em; - font-size: .75em; + padding: 0.6em; + font-size: 0.75em; outline-offset: -1px; } @@ -217,7 +217,7 @@ .ck-content .table table td, .ck-content .table table th { min-width: 2em; - padding: .4em; + padding: 0.4em; border: 1px solid hsl(0, 0%, 75%); } @@ -253,23 +253,35 @@ position: relative; } -/* Custom CSS for ck-content */ +/* Custom CSS for ck-content, themed with the site's design tokens */ +.ck-content { + line-height: 1.7; +} + .ck-content p { padding: 5px; } -.ck-content p a { - color: slateblue; +.ck-content a { + color: rgb(var(--c-accent)); text-decoration: underline; } +.ck-content a:hover { + color: rgb(var(--c-crew)); +} + +.ck-content strong { + color: rgb(var(--c-crew)); +} + .ck-content section { padding: 5px; margin-top: auto; } .ck-content ul { - list-style-type: disc; + list-style-type: square; padding-left: 2rem; } @@ -278,13 +290,37 @@ padding-left: 2rem; } +.ck-content blockquote { + margin: 1em 0; + border-left: 2px solid rgb(var(--c-warning)); + padding-left: 1em; + color: rgb(var(--c-dim)); +} + +.ck-content code { + font-family: var(--font-mono), ui-monospace, monospace; + font-size: 0.875em; + background: rgb(var(--c-hull)); + border: 1px solid rgb(var(--c-seam)); + padding: 0.1em 0.4em; +} + +.ck-content .table table td, +.ck-content .table table th { + border-color: rgb(var(--c-seam)); +} + +.ck-content .table table { + border-color: rgb(var(--c-seam)); +} + .video-wrapper { position: relative; height: auto; - padding-top: calc(100% / (16 / 9)); /* 16:9 aspect ratio */ + padding-top: calc(100% / (16 / 9)); + /* 16:9 aspect ratio */ overflow: hidden; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - border-radius: 1em; + border: 1px solid rgb(var(--c-seam)); } .video-wrapper iframe { diff --git a/app/blog/layout.tsx b/app/blog/layout.tsx deleted file mode 100644 index 5429dea..0000000 --- a/app/blog/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import './ck-content.css'; - -export default function BlogLayout({children,}: { children: React.ReactNode; }) { - return ( - <> - {children} - - ) -} \ No newline at end of file diff --git a/app/blog/loading.tsx b/app/blog/loading.tsx index 40ddbfa..a2633e9 100644 --- a/app/blog/loading.tsx +++ b/app/blog/loading.tsx @@ -1,32 +1,10 @@ -import React from "react"; -import Panel from "../common/uiLibrary/panel"; +import Container from "../../components/ui/Container"; +import LoadingPanel from "../../components/ui/LoadingPanel"; -const BlogLoading = () => { +export default function BlogLoading() { return ( -
-
- -
-
-
-
-
-
{/* Placeholder for image */} -
{/* Additional lines of text */} -
-
-
-
-
-
-
-
-
-
-
-
-
+ + + ); } - -export default BlogLoading; diff --git a/app/blog/page.tsx b/app/blog/page.tsx index b08229d..f3a2205 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -1,58 +1,18 @@ -'use client'; +import { Metadata } from "next"; +import Container from "../../components/ui/Container"; +import PageHeader from "../../components/ui/PageHeader"; +import BlogFeed from "../../components/blog/BlogFeed"; -import React, {useCallback, useEffect, useState} from "react"; -import {BlogPostsResponse} from "../../types/blogPostsResponse"; -import {BlogPost} from "../../types/blogPost"; -import Post from "./[slug]/post"; -import BlogLoading from "./loading"; - -const fetchPosts = async (url: string): Promise => { - const response = await fetch(url); - return await response.json(); -} - -const BlogPage = () => { - const [postsResponse, setPostsResponse] = useState(); - const [posts, setPosts] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const INITIAL_PAGE = "https://changelog.unitystation.org/posts/?page=1"; - - useEffect(() => { - fetchPosts(INITIAL_PAGE).then((response) => { - setIsLoading(true); - setPostsResponse(response); - setPosts(response.results); - }).finally( - () => setIsLoading(false) - ) - }, []); - - const handleScroll = useCallback(async () => { - if (isLoading) return; - if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight || !postsResponse?.next) return; - setIsLoading(true); - const json = await fetchPosts(postsResponse.next); - - setPosts((prevPosts) => [...prevPosts, ...json.results]); - setPostsResponse(json); - setIsLoading(false); - }, [postsResponse]); - - useEffect(() => { - window.addEventListener('scroll', handleScroll); - return () => window.removeEventListener('scroll', handleScroll); - }, [handleScroll]); +export const metadata: Metadata = { + title: "Blog · Unitystation", + description: "News, progress updates and community highlights from the Unitystation crew.", +}; +export default function BlogPage() { return ( -
- {!!posts && posts.map((post, index) => { - return
- -
- })} - {isLoading && } -
- ) + + + + + ); } - -export default BlogPage \ No newline at end of file diff --git a/app/changelog/buildComponent.tsx b/app/changelog/buildComponent.tsx deleted file mode 100644 index f327f3b..0000000 --- a/app/changelog/buildComponent.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import Build from "../../types/build"; -import Change from "../../types/change"; -import ChangeComponent from "./changeComponent"; -import React, {useEffect, useRef, useState} from "react"; -import Panel from "../common/uiLibrary/panel"; -import Button from "../common/uiLibrary/Button"; -import {BiSolidChevronDown} from "react-icons/bi"; -import classNames from "classnames"; - -function populateChangeList(changes: Change[]) { - let changesList; - - if (changes?.length > 0) { - changesList = changes.map((change: Change, index: number) => { - return ( - - - ) - }); - } else { - changesList = -
  • -
    -
    -

    This build has no registered changes :(

    -
    -
    -
  • - } - - return changesList; -} - -interface BuildProps { - build: Build -} - -//TODO: make this component a general dropdown instead and move it to commons -const DownloadBuildDropdown = (props: { version: string }) => { - 'use client' - - const [isOpen, setIsOpen] = useState(false); - const dropdownRef = useRef(null); - - const platforms = [ - "linuxserver", - "StandaloneLinux64", - "StandaloneOSX", - "StandaloneWindows64" - ]; - - const listClasses = classNames( - 'absolute top-full mt-2 w-56 rounded-md shadow-lg bg-slate-600 ring-1 ring-black ring-opacity-5 transition-opacity transition-transform duration-500 ease-out', - { - 'opacity-100 translate-y-0': isOpen, - 'opacity-0 -translate-y-4 pointer-events-none': !isOpen - } - ); - - const handleClick = () => { - setIsOpen(!isOpen); - } - - const handleClickOutside = (event: MouseEvent) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false); - } - }; - - useEffect(() => { - if (isOpen) { - document.addEventListener('mousedown', handleClickOutside); - } else { - document.removeEventListener('mousedown', handleClickOutside); - } - return () => document.removeEventListener('mousedown', handleClickOutside); - }, [isOpen]); - - return ( -
    - -
    -
    - {platforms.map((platform) => ( - - {platform} - - ))} -
    -
    -
    - ); -} - -const BuildComponent = (props: BuildProps) => { - const { version_number, date_created, changes } = props.build; - const changesList = populateChangeList(changes); - - return ( - -
    -
    - Build: {version_number} -
    -
    - Date: {date_created} -
    -
    -
    -
      - {changesList} -
    -
    -
    - -
    -
    - ) -} - -export default BuildComponent; \ No newline at end of file diff --git a/app/changelog/changeComponent.tsx b/app/changelog/changeComponent.tsx deleted file mode 100644 index cbc50dc..0000000 --- a/app/changelog/changeComponent.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import Change from "../../types/change"; -import {IconType} from "react-icons"; -import classNames from "classnames"; -import {FaArrowUp, FaCirclePlus} from "react-icons/fa6"; -import {FaBalanceScale, FaQuestion, FaWrench} from "react-icons/fa"; - -const determineIcon = (category: string): IconType => { - switch (category) { - case "NEW": - return FaCirclePlus; - case "FIX": - return FaWrench; - case "IMPROVEMENT": - return FaArrowUp; - case 'BALANCE': - return FaBalanceScale; - default: - return FaQuestion; - } -} - -const determineColour = (category: string): string => { - switch (category) { - case 'NEW': - return 'text-green-500'; - case 'FIX': - return 'text-orange-600'; - case 'IMPROVEMENT': - return 'text-blue-600'; - case 'BALANCE': - return 'yellow-200'; - default: - return 'text-white'; - } -} - -interface ChangeProps { - change: Change -} - -const ChangeComponent = (props: ChangeProps) => { - const {author_username, author_url, description, pr_url, pr_number, category} = props.change; - const Icon = determineIcon(category); - const colourClass = determineColour(category); - - return ( -
  • -
    -
    - -
    -
    -

    - {description} -

    -

    - contributed by {author_username} - in PR - #{pr_number} -

    -
    -
    -
  • - ) -} - -export default ChangeComponent; \ No newline at end of file diff --git a/app/changelog/loading.tsx b/app/changelog/loading.tsx index 2f29301..9452f19 100644 --- a/app/changelog/loading.tsx +++ b/app/changelog/loading.tsx @@ -1,57 +1,10 @@ -import React from "react"; -import Panel from "../common/uiLibrary/panel"; -import {IconType} from "react-icons"; -import classNames from "classnames"; -import {FaQuestion} from "react-icons/fa"; - -const ChangePlaceholderComponent = () => { - const Icon: IconType = FaQuestion; - const colourClass: string = 'text-gray-500'; - - return ( -
  • -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
  • - ) -} - - -function LoadingBuild() { - let placeholderList = []; - - for(let i=0; i<5; i++) { - placeholderList.push( - - ) - } +import Container from "../../components/ui/Container"; +import LoadingPanel from "../../components/ui/LoadingPanel"; +export default function ChangelogLoading() { return ( - -
    -
    - -
    -
    - -
    -
    -
    -
      - {placeholderList} -
    -
    -
    - ) + + + + ); } - -export default LoadingBuild; diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index d8faea6..23881c5 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -1,60 +1,18 @@ -'use client'; +import { Metadata } from "next"; +import Container from "../../components/ui/Container"; +import PageHeader from "../../components/ui/PageHeader"; +import ChangelogFeed from "../../components/changelog/ChangelogFeed"; -import React, {useCallback, useEffect, useState} from "react"; -import {AllChangesResponse} from "../../types/allChangesResponse"; -import Build from "../../types/build"; -import Container from "../common/uiLibrary/container"; -import PageHeading from "../common/uiLibrary/PageHeading"; -import BuildComponent from "./buildComponent"; -import LoadingBuild from "./loading"; - -const fetchChangelog = async (url: string): Promise => { - const response = await fetch(url); - return await response.json(); -} - -const ChangelogPage = () => { - const [buildsResponse, setBuildsResponse] = useState(); - const [builds, setBuilds] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const INITIAL_PAGE = "https://changelog.unitystation.org/all-changes?limit=5"; - - useEffect(() => { - fetchChangelog(INITIAL_PAGE).then((response) => { - setIsLoading(true); - setBuildsResponse(response); - setBuilds(response.results); - }).finally( - () => setIsLoading(false) - ) - }, []); - - const handleScroll = useCallback(async () => { - if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight || !buildsResponse?.next) return; - setIsLoading(true); - const json = await fetchChangelog(buildsResponse.next); - - setBuilds((prevBuilds) => [...prevBuilds, ...json.results]); - setBuildsResponse(json); - setIsLoading(false); - }, [buildsResponse]); - - useEffect(() => { - window.addEventListener('scroll', handleScroll); - return () => window.removeEventListener('scroll', handleScroll); - }, [handleScroll]); +export const metadata: Metadata = { + title: "Changelog · Unitystation", + description: "Every build of Unitystation and every change that made it in.", +}; +export default function ChangelogPage() { return ( - - Changelog -
    - {!!builds && builds.map((build, index) => { - return - })} - {isLoading && } -
    + + + - ) + ); } - -export default ChangelogPage \ No newline at end of file diff --git a/app/clown/clown.tsx b/app/clown/clown.tsx deleted file mode 100644 index af5747f..0000000 --- a/app/clown/clown.tsx +++ /dev/null @@ -1,99 +0,0 @@ -'use client'; -import './clown.css'; -import useWindowSize from "../../hooks/useWindowSize"; -import React, {RefObject, useEffect, useState} from "react"; - -const MS_PER_FRAME = 30; -const CLOWN_SIZE = 64; - -const Clown = () => { - const size = useWindowSize(); - const [x, setX] = useState(-CLOWN_SIZE); - const [y, setY] = useState(-CLOWN_SIZE); - const [dirX, setDirX] = useState(1); - const [dirY, setDirY] = useState(1); - const [timesClicked, setTimesClicked] = useState(0); - const audioRef: RefObject = React.createRef(); - - const handleClick = () => { - audioRef.current!.play(); - setTimesClicked(timesClicked + 1); - } - - const renderTimesClicked = () => { - const tooManyClick = () => { - if (timesClicked > 499) { - return

    Ok, You killed the clown. I hope you are happy now.

    - } - if (timesClicked > 300) { - return

    What are you trying to do? You want to post how many times you clicked the clown and get and - get a medal or something?

    - } - if (timesClicked > 200) { - return

    Seriously?

    - } - if (timesClicked > 100) { - return

    Don't you have anything better to do?

    - } - if (timesClicked > 50) { - return

    Erm, aren't you getting bored?

    - } - if (timesClicked > 20) { - return

    Haha, clicking the clown is so funny!

    - } - } - - if (timesClicked > 5) { - return ( -
    -

    Times you have clicked the clown: {timesClicked}

    - {tooManyClick()} -
    - ); - } - } - - const renderClown = () => { - if (timesClicked < 500) { - return ( - - me - - ); - } - } - - useEffect(() => { - const interval = setInterval(() => { - if (x + dirX > size.width + CLOWN_SIZE / 4 || x + dirX < (-CLOWN_SIZE * 2)) { - setDirX(prevDx => -prevDx); - } - - if (y + dirY > size.height + CLOWN_SIZE / 4 || y + dirY < (-CLOWN_SIZE * 2)) { - setDirY(prevDy => -prevDy); - } - - setX(prevX => prevX + dirX); - setY(prevY => prevY + dirY); - }, MS_PER_FRAME); - - return () => clearInterval(interval); - }); - - return ( -
    - {renderTimesClicked()} - - {renderClown()} -
    - ) -}; - -export default Clown; \ No newline at end of file diff --git a/app/common/defaultNavbar.tsx b/app/common/defaultNavbar.tsx deleted file mode 100644 index 765fa63..0000000 --- a/app/common/defaultNavbar.tsx +++ /dev/null @@ -1,78 +0,0 @@ -'use client'; - -import {Dropdown, Navbar} from 'flowbite-react'; -import React, {useContext} from "react"; -import {GoLinkExternal} from "react-icons/go"; -import {AuthorizerContext} from "../../context/AuthorizerContextProvider"; -import Link from "next/link"; - - -const playerWiki = 'https://wiki.unitystation.org' -const devWiki = 'https://unitystation.github.io/unitystation/' - -export default function DefaultNavbar() { - const {state} = useContext(AuthorizerContext); - const username = state.authContext?.account.username; - - const loggedOptions = () => ( - <> - {/* hidden while we work on it */} - {/*My Account*/} - - Logout - - - ) - - const notLoggedOptions = () => ( - <> - - Login/Register - - - - Reset password - - - ) - - return ( - - - - -
    - - {state.isLoggedIn ? loggedOptions() : notLoggedOptions()} - -
    - - - -

    Home

    - - -

    Blog

    - - -

    Changelog

    - - -

    Ledger

    - - -
    -

    Player's wiki

    - -
    -
    - -
    -

    Dev's wiki

    - -
    -
    -
    -
    - ) -} diff --git a/app/common/emoji.tsx b/app/common/emoji.tsx deleted file mode 100644 index 59a52ae..0000000 --- a/app/common/emoji.tsx +++ /dev/null @@ -1,21 +0,0 @@ -interface EmojiProps { - symbol: string; - label?: string; -} - -const Emoji = (props: EmojiProps) => { - const { label, symbol } = props; - - return ( - - {symbol} - - ) -} - -export default Emoji diff --git a/app/common/navigation.tsx b/app/common/navigation.tsx deleted file mode 100644 index 28f24cc..0000000 --- a/app/common/navigation.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import StyledLink from "./uiLibrary/styledLink"; -import ExternalLink from "./uiLibrary/externalLink"; - -const playerWiki = 'https://wiki.unitystation.org' -const devWiki = 'https://unitystation.github.io/unitystation/' - -const Navigation = () => { - return ( - - ) -} - -export default Navigation; diff --git a/app/common/uiLibrary/Button.tsx b/app/common/uiLibrary/Button.tsx deleted file mode 100644 index 4e67738..0000000 --- a/app/common/uiLibrary/Button.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import {IconType} from "react-icons"; -import classNames from "classnames"; -import React from "react"; - -interface ButtonProps extends React.HTMLAttributes{ - filled?: boolean, - upperCase?: boolean, - type?: 'button' | 'submit' | 'reset', - iconLeft?: IconType, - iconRight?: IconType, - className?: string -} - -const Button = (props: ButtonProps) => { - const {type = 'button', filled = true, upperCase = true, iconLeft: IconLeft, iconRight: IconRight} = props; - const filledClass = 'bg-gray-800 border-2 border-transparent text-white text-md mr-4 hover:bg-gray-900'; - const outlineClass = 'bg-gray-800 bg-opacity-30 border-2 border-gray-800 text-white text-md hover:bg-gray-800'; - const classes = classNames( - 'py-2 px-4 flex justify-center items-center', - {'uppercase': upperCase}, - filled ? filledClass : outlineClass, - props.className - ) - - return ( - - ) -} - -export default Button; \ No newline at end of file diff --git a/app/common/uiLibrary/Layouters/formContainer.tsx b/app/common/uiLibrary/Layouters/formContainer.tsx deleted file mode 100644 index 7a9aff8..0000000 --- a/app/common/uiLibrary/Layouters/formContainer.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import layoutChildren from "../../../../types/layoutChildren"; -import Container from "../container"; -import TopMiddlePlacer from "./topMiddlePlacer"; -import Panel from "../panel"; -import React from "react"; -import classNames from "classnames"; - -interface FormContainerProps extends layoutChildren, React.FormHTMLAttributes{ - title: string; -} - -const FormContainer = (props: FormContainerProps) => { - - const classes = classNames( - props.className ? props.className : 'flex flex-col gap-4 w-full', - ); - - return ( - - - -
    -

    {props.title}

    -
    - {props.children} -
    -
    -
    -
    -
    - ); -} - -export default FormContainer; \ No newline at end of file diff --git a/app/common/uiLibrary/Layouters/fullPage.tsx b/app/common/uiLibrary/Layouters/fullPage.tsx deleted file mode 100644 index ef34bfa..0000000 --- a/app/common/uiLibrary/Layouters/fullPage.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import layoutChildren from "../../../../types/layoutChildren"; - -// makes the view occupy the full page, excluding the header. -const FullPage = (props: layoutChildren) => { - return ( -
    - {props.children} -
    - ) -} - -export default FullPage; \ No newline at end of file diff --git a/app/common/uiLibrary/Layouters/topMiddlePlacer.tsx b/app/common/uiLibrary/Layouters/topMiddlePlacer.tsx deleted file mode 100644 index aedc6a4..0000000 --- a/app/common/uiLibrary/Layouters/topMiddlePlacer.tsx +++ /dev/null @@ -1,12 +0,0 @@ -// Places the content on the top middle of the screen. Useful for things such as forms and modals. -import layoutChildren from "../../../../types/layoutChildren"; - -const TopMiddlePlacer = (props: layoutChildren) => { - return ( -
    - {props.children} -
    - ); -} - -export default TopMiddlePlacer; \ No newline at end of file diff --git a/app/common/uiLibrary/PageHeading.tsx b/app/common/uiLibrary/PageHeading.tsx deleted file mode 100644 index bcdb8cd..0000000 --- a/app/common/uiLibrary/PageHeading.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import classNames from "classnames"; -import LayoutChildren from "../../../types/layoutChildren"; - -interface PageHeadingProps extends LayoutChildren{ - isCentered?: boolean; - isLink?: boolean; -} - -export default function PageHeading(props: PageHeadingProps) { - const { children, isCentered, isLink } = props; - const className = classNames( - "mb-4 text-4xl font-extrabold leading-tight lg:mb-6 text-white", - { - "hover:underline hover:cursor-pointer": isLink, - "text-center": isCentered, - }); - - return ( -

    - {children} -

    - ); -} \ No newline at end of file diff --git a/app/common/uiLibrary/capsule.tsx b/app/common/uiLibrary/capsule.tsx deleted file mode 100644 index 816bed5..0000000 --- a/app/common/uiLibrary/capsule.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import classNames from "classnames"; -interface CapsuleProps { - text: string - colour: string -} - -export default function Capsule(props: CapsuleProps) { - const {text, colour} = props; - const classes = classNames( - 'inline-flex items-center justify-center px-2 py-1 mr-2 text-xs font-bold leading-none rounded', - { - 'text-indigo-100 bg-indigo-600': colour === 'indigo', - 'text-green-100 bg-green-600': colour === 'green', - 'text-blue-100 bg-blue-600': colour === 'blue', - }); - - return ( - - {text} - - ) -} \ No newline at end of file diff --git a/app/common/uiLibrary/container.tsx b/app/common/uiLibrary/container.tsx deleted file mode 100644 index 2fb3bb0..0000000 --- a/app/common/uiLibrary/container.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import LayoutChildren from "../../../types/layoutChildren"; - - -export default function Container(props: LayoutChildren) { - const { children } = props; - - return ( -
    - {children} -
    - ); -} \ No newline at end of file diff --git a/app/common/uiLibrary/externalLink.tsx b/app/common/uiLibrary/externalLink.tsx deleted file mode 100644 index a10e342..0000000 --- a/app/common/uiLibrary/externalLink.tsx +++ /dev/null @@ -1,35 +0,0 @@ -interface ExternalLinkProps { - href: string; - text: string; -} - -const ExternalLink = (props: ExternalLinkProps) => { - const { href, text } = props; - - return ( - - {text} - - - - - ) -} - -export default ExternalLink; diff --git a/app/common/uiLibrary/forms/alternativeActions.tsx b/app/common/uiLibrary/forms/alternativeActions.tsx deleted file mode 100644 index a219258..0000000 --- a/app/common/uiLibrary/forms/alternativeActions.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; -import Link from "next/link"; -import classNames from "classnames"; - -interface LinkElement { - link: string; - linkText: string; -} - -interface AlternativeActionsProps { - links: LinkElement[]; - className?: string; -} - -const AlternativeActions = (props: AlternativeActionsProps) => { - const classes = classNames( - props.className ? props.className : 'flex flex-col text-center', - ) - - return ( -
    - {props.links.map((link, index) => ( - - {link.linkText} - - ))} -
    - ) -} - -export default AlternativeActions; diff --git a/app/common/uiLibrary/forms/textField.tsx b/app/common/uiLibrary/forms/textField.tsx deleted file mode 100644 index 8672370..0000000 --- a/app/common/uiLibrary/forms/textField.tsx +++ /dev/null @@ -1,35 +0,0 @@ - -import React from "react"; -import {Label, TextInput} from "flowbite-react"; - -interface TextFieldProps extends React.InputHTMLAttributes { - shadow?: boolean; - label: string; - helperText?: React.ReactNode; -} - -const TextField = (props: TextFieldProps) => { - const {shadow = false} = props; - - return ( -
    -
    -
    - -
    - ) -} - -export default TextField; \ No newline at end of file diff --git a/app/common/uiLibrary/genericLoading.tsx b/app/common/uiLibrary/genericLoading.tsx deleted file mode 100644 index d8fb745..0000000 --- a/app/common/uiLibrary/genericLoading.tsx +++ /dev/null @@ -1,12 +0,0 @@ -const GenericLoading = () => { - - return ( -
    -
    -
    -
    -
    - ) -} - -export default GenericLoading; \ No newline at end of file diff --git a/app/common/uiLibrary/linkButton.tsx b/app/common/uiLibrary/linkButton.tsx deleted file mode 100644 index 49d0993..0000000 --- a/app/common/uiLibrary/linkButton.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import {IconType} from "react-icons"; -import classNames from "classnames"; - -type LinkButtonProps = { - filled: boolean, - text: string, - linkTo: string, - iconLeft?: IconType, - iconRight?: IconType, - className?: string -} - -const LinkButton = (props: LinkButtonProps) => { - const {filled, text, linkTo, iconLeft: IconLeft, iconRight: IconRight} = props; - const filledClass = 'bg-gray-800 border-2 border-transparent text-white text-md mr-4 hover:bg-gray-900'; - const outlineClass = 'bg-gray-800 bg-opacity-30 border-2 border-gray-800 text-white text-md hover:bg-gray-800'; - const classes = classNames( - 'uppercase py-2 px-4 flex justify-center items-center', - filled ? filledClass : outlineClass, - props.className - ) - - return ( - - {IconLeft && } -
    - {text} -
    - {IconRight && } -
    - ) -}; - -export default LinkButton; diff --git a/app/common/uiLibrary/pageSection.tsx b/app/common/uiLibrary/pageSection.tsx deleted file mode 100644 index 8ccd4ad..0000000 --- a/app/common/uiLibrary/pageSection.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import classNames from "classnames"; -import React from "react"; - -interface PageSectionProps { - children: React.ReactNode, - className?: string, - horizontalCenter?: boolean, - verticalCenter?: boolean -} - -const PageSection = (props: PageSectionProps) => { - const {children, className, horizontalCenter = true, verticalCenter = true} = props; - - return ( -
    - {children} -
    - ) -} - -export default PageSection; \ No newline at end of file diff --git a/app/common/uiLibrary/pageSectionTitle.tsx b/app/common/uiLibrary/pageSectionTitle.tsx deleted file mode 100644 index 2172376..0000000 --- a/app/common/uiLibrary/pageSectionTitle.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import classNames from "classnames"; - -interface PageSectionTitleProps { - children: React.ReactNode, - extraClasses?: string -} - -const PageSectionTitle = (props: PageSectionTitleProps) => { - const {children, extraClasses} = props; - - return ( - -

    - {children} -

    - ) -} - -export default PageSectionTitle; \ No newline at end of file diff --git a/app/common/uiLibrary/panel.tsx b/app/common/uiLibrary/panel.tsx deleted file mode 100644 index 42a064c..0000000 --- a/app/common/uiLibrary/panel.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import classNames from "classnames"; -import LayoutChildren from "../../../types/layoutChildren"; - -interface PanelProps extends LayoutChildren { - solid?: boolean; -} - -export default function Panel(props: PanelProps) { - const { children, solid, ...rest } = props; - const className = classNames( - "mx-auto w-full px-10 py-10 mb-8 format format-sm sm:format-base lg:format-lg format-invert bg-gray-900",{ - "bg-opacity-75": !solid, - }, - rest.className - ); - - return ( -
    - {children} -
    - ); -} \ No newline at end of file diff --git a/app/common/uiLibrary/spinner.tsx b/app/common/uiLibrary/spinner.tsx deleted file mode 100644 index 62988f3..0000000 --- a/app/common/uiLibrary/spinner.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; - -const Spinner: React.FC = () => { - return ( -
    - - Loading... - -
    - ); -}; - -export default Spinner; \ No newline at end of file diff --git a/app/common/uiLibrary/styledLink.tsx b/app/common/uiLibrary/styledLink.tsx deleted file mode 100644 index 15231a1..0000000 --- a/app/common/uiLibrary/styledLink.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import Link from 'next/link'; -import React from "react"; - -interface StyledLinkProps { - href: string; - className?: string; - children?: React.ReactNode; - newTab?: boolean; -} - -const StyledLink = (props: StyledLinkProps) => { - const { href, className, children, newTab} = props; - return ( - - - {children} - - - ); -} - -export default StyledLink; diff --git a/app/download/fetchLatestRelease.ts b/app/download/fetchLatestRelease.ts index f83f05e..5c9d413 100644 --- a/app/download/fetchLatestRelease.ts +++ b/app/download/fetchLatestRelease.ts @@ -1,15 +1,15 @@ -import GithubReleaseResponse from '../../types/githubReleaseResponse'; -import { LAUNCHER_RELEASES_API } from '../../utils/urlContants'; +import GithubReleaseResponse from "../../types/githubReleaseResponse"; +import { LAUNCHER_RELEASES_API } from "../../utils/urlContants"; async function fetchLatestRelease(): Promise { - const response = await fetch(LAUNCHER_RELEASES_API, { - next: { revalidate: 3600 }, - headers: { Accept: 'application/vnd.github+json' }, - }); - if (!response.ok) { - throw new Error(`GitHub releases API responded ${response.status}`); - } - return response.json(); + const response = await fetch(LAUNCHER_RELEASES_API, { + next: { revalidate: 3600 }, + headers: { Accept: "application/vnd.github+json" }, + }); + if (!response.ok) { + throw new Error(`GitHub releases API responded ${response.status}`); + } + return response.json(); } export default fetchLatestRelease; diff --git a/app/download/page.tsx b/app/download/page.tsx index ef4e98e..b5f6871 100644 --- a/app/download/page.tsx +++ b/app/download/page.tsx @@ -1,53 +1,56 @@ -import React from 'react'; -import { headers } from 'next/headers'; -import PageHeading from '../common/uiLibrary/PageHeading'; -import { LauncherRelease } from '../../types/launcherRelease'; -import { GITHUB_RELEASES_URL, LAUNCHER_REPO_URL } from '../../utils/urlContants'; -import mapLauncherRelease from '../../utils/launcherRelease'; -import { detectPlatform } from '../../utils/detectPlatform'; -import fetchLatestRelease from './fetchLatestRelease'; -import DownloadExperience from '../../components/organisms/DownloadExperience'; -import QuietExternalLink from '../../components/atoms/QuietExternalLink'; +import { Metadata } from "next"; +import { headers } from "next/headers"; +import Container from "../../components/ui/Container"; +import PageHeader from "../../components/ui/PageHeader"; +import TextLink from "../../components/ui/TextLink"; +import { LauncherRelease } from "../../types/launcherRelease"; +import { detectPlatform } from "../../utils/detectPlatform"; +import mapLauncherRelease from "../../utils/launcherRelease"; +import { GITHUB_RELEASES_URL, LAUNCHER_REPO_URL } from "../../utils/urlContants"; +import DownloadExperience from "../../components/download/DownloadExperience"; +import fetchLatestRelease from "./fetchLatestRelease"; -export const metadata = { - title: 'Download · Unitystation', - description: 'Download the Pudu Launcher and start playing Unitystation.', +export const metadata: Metadata = { + title: "Download · Unitystation", + description: "Download the Pudu Launcher and start playing Unitystation.", }; const DownloadPage = async () => { - let release: LauncherRelease | null = null; - try { - release = mapLauncherRelease(await fetchLatestRelease()); - } catch { - release = null; - } + let release: LauncherRelease | null = null; + try { + release = mapLauncherRelease(await fetchLatestRelease()); + } catch { + release = null; + } - // Detect the platform on the server from the request so the right OS is in the - // first paint. The client effect only re-runs when this comes back unknown. - const userAgent = (await headers()).get('user-agent') ?? undefined; - const platform = detectPlatform(userAgent); - const initialOs = platform.os === 'unknown' ? undefined : platform.os; + // Detect the platform on the server from the request so the right OS is in the + // first paint. The client effect only re-runs when this comes back unknown. + const userAgent = (await headers()).get("user-agent") ?? undefined; + const platform = detectPlatform(userAgent); + const initialOs = platform.os === "unknown" ? undefined : platform.os; - return ( -
    - Download Pudu Launcher -

    - The Pudu Launcher keeps your game up to date and gets you into a round quickly. - We've highlighted the build for your system below. -

    + return ( + + - + - - View the launcher source on GitHub - -
    - ); +

    + + View the launcher source on GitHub + +

    +
    + ); }; export default DownloadPage; diff --git a/app/globals.css b/app/globals.css index 92e93c7..3629f47 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2,16 +2,107 @@ @tailwind components; @tailwind utilities; -html, body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - color: white; +/* + * ── Unitystation design tokens ───────────────────────────────────────── + * The StationHub / PuduLauncher palette: teal accent #0078a3, steel-blue + * surfaces #132736 → #21435C → #38729C, deep navy #05131e behind it all. + * Raw RGB triplets so Tailwind can compose alpha. + * + * surfaces: void → hull → panel → raised + * lines: seam / seam-bright + * text: crew / dim / faint + * accents: primary / info / success / warning / danger + */ +:root { + /* surfaces: dark desaturated slate, like the PuduLauncher window */ + --c-void: 5 19 30; + /* #05131e, space behind everything */ + --c-hull: 10 15 21; + /* #0a0f15, navbar, footer, inputs, wells */ + --c-panel: 21 28 38; + /* #151c26, panels, cards */ + --c-raised: 28 37 48; + /* #1c2530, title bars, table headers, hovers */ + + /* lines & interactive chrome */ + --c-seam: 36 46 59; + /* #242e3b, borders */ + --c-seam-bright: 56 114 156; + /* #38729c, highlighted edges, scrollbars */ + --c-steel: 33 67 92; + /* #21435c, chips, selected states, secondary buttons */ + + /* text */ + --c-crew: 252 252 253; + /* #fcfcfd */ + --c-dim: 197 208 220; + /* #c5d0dc */ + --c-faint: 112 137 162; + /* #7089a2 */ + + /* accents */ + --c-primary: 0 120 163; + /* #0078a3, filled actions */ + --c-primary-hot: 0 102 139; + /* #00668b, filled action hover */ + --c-accent: 79 161 219; + /* #4fa1db, links, focus, highlights */ + --c-info: 77 189 231; + /* #4dbde7 */ + --c-success: 62 174 108; + /* #3eae6c */ + --c-warning: 232 168 28; + /* #e8a81c */ + --c-danger: 212 102 102; + /* #d66, readable on dark */ + --c-danger-fill: 170 68 68; + /* #aa4444, filled destructive actions */ +} + +html { + background-color: rgb(var(--c-void)); + color-scheme: dark; } body { - background-image: url("https://cdn.unitystation.org/Website-Statics/layer1.png"); + margin: 0; + padding: 0; + /* the clown roams past the right edge; never let it widen the page */ + overflow-x: clip; + color: rgb(var(--c-crew)); + font-family: var(--font-body), system-ui, sans-serif; + /* No background here: an opaque body background would paint over the + fixed -z-10 parallax layers. The html element carries the base colour. */ +} + +* { + box-sizing: border-box; + scrollbar-width: thin; + scrollbar-color: #38729c #0a0f15; +} + +*::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +*::-webkit-scrollbar-track { + background: #0a0f15; +} + +*::-webkit-scrollbar-thumb { + background-color: #38729c; + border: 2px solid #0a0f15; + border-radius: 8px; +} + +*::-webkit-scrollbar-thumb:hover { + background-color: #4fa1db; +} + +::selection { + background: rgb(var(--c-accent)); + color: rgb(var(--c-void)); } a { @@ -19,49 +110,81 @@ a { text-decoration: none; } -* { - box-sizing: border-box; +/* Slow sideways drift of the space layers, like the game's main menu. + Composited (transform only); one loop shifts exactly one tile. */ +@keyframes space-drift { + from { + transform: translateX(0); + } + + to { + transform: translateX(calc(var(--tile) * -1px)); + } } -.inset-shadow::after { - content: ''; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - box-shadow: var(--tw-shadow); - pointer-events: none; +.space-drift { + animation: space-drift var(--drift-duration, 180s) linear infinite; } -.dot { - width: 40px; - height: 40px; - background-color: whitesmoke; - border-radius: 50%; - margin: 0 10px; - animation: dotAnimation 1.5s infinite cubic-bezier(0.68, -0.55, 0.27, 1.55); +@media (prefers-reduced-motion: reduce) { + .space-drift { + animation: none; + } } -@keyframes dotAnimation { - 0%, 100% { - transform: translateY(0); - opacity: 0.2; +/* Minecraft-style splash text: diagonal, pulsing over the title. */ +@keyframes splash-pulse { + 0%, + 100% { + transform: rotate(-12deg) scale(1); } + 50% { - transform: translateY(-20px); - opacity: 1; + transform: rotate(-12deg) scale(1.08); } } -.dot:nth-child(1) { - animation-delay: 0s; +.splash-text { + animation: splash-pulse 1s ease-in-out infinite; } -.dot:nth-child(2) { - animation-delay: 0.5s; +@media (prefers-reduced-motion: reduce) { + .splash-text { + animation: none; + transform: rotate(-12deg); + } } -.dot:nth-child(3) { - animation-delay: 1s; +@layer utilities { + /* Subtle scanlines overlay for in-game imagery. */ + .scanlines { + background-image: repeating-linear-gradient( + 0deg, + rgb(0 0 0 / 0.18) 0 1px, + transparent 1px 3px + ); + } + + /* Uppercase monospace microcopy: small labels, table headers, metadata. */ + .type-label { + font-family: var(--font-mono), ui-monospace, monospace; + font-size: 0.6875rem; + letter-spacing: 0.14em; + text-transform: uppercase; + } + + /* Dark halo behind text that sits directly over the starfield (outside + panels), so it stays legible against the stars. Sized to the type it + backs: lg for headings, md for ledes, sm for labels. */ + .text-halo-lg { + text-shadow: 0 2px 24px rgb(var(--c-void) / 0.9); + } + + .text-halo-md { + text-shadow: 0 1px 12px rgb(var(--c-void) / 0.9); + } + + .text-halo-sm { + text-shadow: 0 1px 8px rgb(var(--c-void) / 0.9); + } } diff --git a/app/layout.tsx b/app/layout.tsx index 327b353..be418e4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,62 +1,90 @@ import "./globals.css"; import React from "react"; -import Clown from "./clown/clown"; -import {Metadata} from "next"; -import DefaultNavbar from "./common/defaultNavbar"; -import {Analytics} from '@vercel/analytics/react'; -import type {Viewport} from 'next' +import { Metadata, Viewport } from "next"; +import { Chakra_Petch, IBM_Plex_Mono, IBM_Plex_Sans } from "next/font/google"; +import { Analytics } from "@vercel/analytics/react"; import Providers from "../context/providers"; +import Navbar from "../components/site/Navbar"; +import Footer from "../components/site/Footer"; +import Clown from "../components/site/Clown"; +import ParallaxSpace from "../components/site/ParallaxSpace"; + +const display = Chakra_Petch({ + subsets: ["latin"], + weight: ["500", "600", "700"], + variable: "--font-display", +}); + +const mono = IBM_Plex_Mono({ + subsets: ["latin"], + weight: ["400", "600"], + variable: "--font-mono", + // Only used for `.type-label` microcopy, absent from many routes (e.g. the + // account pages). Preloading it everywhere triggers "preloaded resource not + // used" warnings; load it on demand instead (swap avoids invisible text). + preload: false, +}); + +const body = IBM_Plex_Sans({ + subsets: ["latin"], + weight: ["400", "500", "600"], + variable: "--font-body", +}); export const metadata: Metadata = { - title: 'Unitystation - The Space Station 13 Remake Made in Unity', + title: "Unitystation - The Space Station 13 Remake Made in Unity", keywords: [ - 'unitystation', - 'unity', - 'space station 13', - 'ss13', - 'spacestation 13', - 'spacestation13', - 'space station', - 'station', - 'rpg', - 'roleplaying game', + "unitystation", + "unity", + "space station 13", + "ss13", + "spacestation 13", + "spacestation13", + "space station", + "station", + "rpg", + "roleplaying game", ], - description: 'Unitystation is a free and open-source chaotic multiplayer role-playing and simulation game made in Unity. Remake of the cult classic Space Station 13.', - authors: {name: 'Unitystation Team', url: 'https://github.com/unitystation'}, - robots: {follow: true, index: true}, + description: + "Unitystation is a free and open-source chaotic multiplayer role-playing and simulation game made in Unity. Remake of the cult classic Space Station 13.", + authors: { name: "Unitystation Team", url: "https://github.com/unitystation" }, + robots: { follow: true, index: true }, openGraph: { - type: 'website', - locale: 'en_US', - url: 'https://unitystation.org/', - title: 'Unitystation - The Space Station 13 Remake Made in Unity', - description: 'Unitystation is a free and open-source chaotic multiplayer role-playing and simulation game made in Unity. Remake of the cult classic Space Station 13.', + type: "website", + locale: "en_US", + url: "https://unitystation.org/", + title: "Unitystation - The Space Station 13 Remake Made in Unity", + description: + "Unitystation is a free and open-source chaotic multiplayer role-playing and simulation game made in Unity. Remake of the cult classic Space Station 13.", images: [ { - url: 'https://cdn.unitystation.org/Branding/US13_OG_image_preview_1.png', + url: "https://cdn.unitystation.org/Branding/US13_OG_image_preview_1.png", }, - ] - } -} + ], + }, +}; export const viewport: Viewport = { - themeColor: 'black', - width: 'device-width', + themeColor: "#06080b", + width: "device-width", initialScale: 1, -} - -export default function RootLayout({children,}: { children: React.ReactNode; }) { +}; +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - - - - - - {children} - - - + + + + + +
    + +
    {children}
    +
    +
    +
    + + - ) + ); } - diff --git a/app/ledger/page.tsx b/app/ledger/page.tsx index 00960cd..d125daf 100644 --- a/app/ledger/page.tsx +++ b/app/ledger/page.tsx @@ -1,6 +1,6 @@ -import {LedgerApiProvider} from "../../context/ledger/LedgerApiProvider"; -import LedgerPresentation from "./presentation"; -import {LedgerTableProvider} from "../../context/ledger/LedgerDataTableProvider"; +import { LedgerApiProvider } from "../../context/ledger/LedgerApiProvider"; +import { LedgerTableProvider } from "../../context/ledger/LedgerDataTableProvider"; +import LedgerPresentation from "../../components/ledger/LedgerPresentation"; const LedgerPage = () => { return ( @@ -9,7 +9,7 @@ const LedgerPage = () => { - ) -} + ); +}; -export default LedgerPage; \ No newline at end of file +export default LedgerPage; diff --git a/app/ledger/presentation.tsx b/app/ledger/presentation.tsx deleted file mode 100644 index 0eb2cd8..0000000 --- a/app/ledger/presentation.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client'; - -import DataTable from "../../components/organisms/DataTable"; -import {useLedgerTableContext} from "../../context/ledger/LedgerDataTableProvider"; -import Container from "../common/uiLibrary/container"; -import PageHeading from "../common/uiLibrary/PageHeading"; -import {useLedgerApiProvider} from "../../context/ledger/LedgerApiProvider"; -import Panel from "../common/uiLibrary/panel"; -import {RiPatreonFill} from "react-icons/ri"; -import {FaPaypal} from "react-icons/fa"; -import {PATREON_URL, PAYPAL_DONATION_URL} from "../../utils/urlContants"; - -export default function LedgerPresentation() { - const content = useLedgerTableContext(); - const {hasNextPage, hasPreviousPage, goToPreviousPage, goToNextPage, currentBalance} = useLedgerApiProvider(); - - return ( - - Funding Ledger -
    - -
    Current Balance
    -
    - ${currentBalance} -
    -

    - This is the amount currently available in Unitystation’s project fund. - It updates manually after we receive a donation or withdraw from Patreon. -

    -

    - If your donation is not listed yet, it will appear soon once we update the ledger. -

    -
    - -
    - Where does our funding come from? -
    - -

    - Unitystation is sustained entirely through community support; whether by backing us on Patreon or sending direct donations. Every contribution helps cover hosting, development, and infrastructure. -

    - - -
    -
    - - - - {/*TODO: make this shit a generic component and stylise it*/} -
    -
    - {hasPreviousPage && ( - - )} -
    - -
    - {hasNextPage && ( - - )} -
    -
    -
    - ); -} \ No newline at end of file diff --git a/app/not-found.tsx b/app/not-found.tsx index 9edc324..7917764 100644 --- a/app/not-found.tsx +++ b/app/not-found.tsx @@ -1,21 +1,20 @@ -import PageSection from "./common/uiLibrary/pageSection"; -import Panel from "./common/uiLibrary/panel"; +import Container from "../components/ui/Container"; +import LinkButton from "../components/ui/LinkButton"; -const NotFound = () => { +export default function NotFound() { return ( - - -
    -

    - 404 | Page Not Found -

    -

    - The page you are looking for does not exist or something is terribly wrong with the website. -

    -
    -
    -
    + +

    + 404 +

    +

    Page not found

    +

    + The page you are looking for does not exist or something is terribly wrong with the + website. +

    + + Back to home + +
    ); } - -export default NotFound; \ No newline at end of file diff --git a/commitlint.config.mjs b/commitlint.config.mjs new file mode 100644 index 0000000..244f1cc --- /dev/null +++ b/commitlint.config.mjs @@ -0,0 +1,3 @@ +export default { + extends: ["@commitlint/config-conventional"], +}; diff --git a/components/atoms/AltDownloadLink.tsx b/components/atoms/AltDownloadLink.tsx deleted file mode 100644 index f9b3e80..0000000 --- a/components/atoms/AltDownloadLink.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { DownloadVariant } from '../../types/launcherRelease'; - -// Outline Button tokens for secondary downloads, so alternatives read as real -// buttons (not decorative cards) while staying quieter than the primary action. -function AltDownloadLink({ variant }: { variant: DownloadVariant }) { - return ( - - {variant.label} · {variant.sizeMB} MB - - ); -} - -export default AltDownloadLink; diff --git a/components/atoms/CopyableCommand.tsx b/components/atoms/CopyableCommand.tsx deleted file mode 100644 index 44dfd20..0000000 --- a/components/atoms/CopyableCommand.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; -import { useState } from 'react'; -import { FiCopy, FiCheck } from 'react-icons/fi'; - -function CopyableCommand({ command }: { command: string }) { - const [copied, setCopied] = useState(false); - - const onCopy = async () => { - try { - await navigator.clipboard.writeText(command); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } catch { - // Clipboard unavailable (e.g. insecure context); the command stays selectable. - } - }; - - return ( -
    - {command} - -
    - ); -} - -export default CopyableCommand; diff --git a/components/atoms/CornerBadge.tsx b/components/atoms/CornerBadge.tsx deleted file mode 100644 index 98e018a..0000000 --- a/components/atoms/CornerBadge.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import Capsule from '../../app/common/uiLibrary/capsule'; - -// The parent must be positioned (`relative`) for the absolute corner placement. -function CornerBadge({ text }: { text: string }) { - return ( - - - - ); -} - -export default CornerBadge; diff --git a/components/atoms/HeroDownloadLink.tsx b/components/atoms/HeroDownloadLink.tsx deleted file mode 100644 index 190aad4..0000000 --- a/components/atoms/HeroDownloadLink.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { BiSolidDownload } from 'react-icons/bi'; -import { DownloadVariant } from '../../types/launcherRelease'; - -// Mirrors the filled Button/LinkButton tokens (gray-800, square, uppercase) so the -// primary download reads as part of the site rather than a one-off blue CTA. -function HeroDownloadLink({ variant }: { variant: DownloadVariant }) { - return ( - - - Download · {variant.label} - - ); -} - -export default HeroDownloadLink; diff --git a/components/atoms/QuietExternalLink.tsx b/components/atoms/QuietExternalLink.tsx deleted file mode 100644 index b457278..0000000 --- a/components/atoms/QuietExternalLink.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { ReactNode } from 'react'; - -type Props = { - href: string; - children: ReactNode; - className?: string; -}; - -// Opens in a new tab so it never pulls the user away from what they were doing. -function QuietExternalLink({ href, children, className = '' }: Props) { - return ( - - {children} - - ); -} - -export default QuietExternalLink; diff --git a/components/atoms/TableCell.tsx b/components/atoms/TableCell.tsx deleted file mode 100644 index 9d488d8..0000000 --- a/components/atoms/TableCell.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import {ReactNode} from "react"; - -const TableCell: React.FC<{ children: ReactNode }> = ({ children }) => ( - {children} -); - -export default TableCell; \ No newline at end of file diff --git a/components/atoms/TableHeaderCell.tsx b/components/atoms/TableHeaderCell.tsx deleted file mode 100644 index 2b77236..0000000 --- a/components/atoms/TableHeaderCell.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import {ReactNode} from "react"; -import classNames from "classnames"; - -export type SortDirection = 'asc' | 'desc'; - -const TableHeaderCell: React.FC<{ - children: ReactNode; - sortable: boolean; - active: boolean; - dir: SortDirection; - onClick?: () => void; -}> = ({ children, sortable, active, dir, onClick }) => { - - const classes = classNames( - "p-2 bg-gray-800 text-left select-none", - { - "cursor-pointer": sortable, - } - ) - - return ( - - {children} - {sortable && ( - {active ? (dir === 'asc' ? '▲' : '▼') : '⇅'} - )} - - ) -} - -export default TableHeaderCell; \ No newline at end of file diff --git a/components/blog/BlogFeed.tsx b/components/blog/BlogFeed.tsx new file mode 100644 index 0000000..9161445 --- /dev/null +++ b/components/blog/BlogFeed.tsx @@ -0,0 +1,25 @@ +"use client"; + +import useInfiniteFeed from "../../hooks/useInfiniteFeed"; +import LoadingPanel from "../ui/LoadingPanel"; +import { BlogPost } from "../../types/blogPost"; +import PostCard from "./PostCard"; + +const INITIAL_PAGE = "https://changelog.unitystation.org/posts/?page=1"; + +/** Infinite-scrolling feed of every published post. */ +export default function BlogFeed() { + const { items: posts, isLoading, sentinelRef } = useInfiniteFeed(INITIAL_PAGE); + + return ( +
    +
    + {posts.map((post) => ( + + ))} +
    + {isLoading && } +
    +
    + ); +} diff --git a/components/blog/PostArticle.tsx b/components/blog/PostArticle.tsx new file mode 100644 index 0000000..d03c33c --- /dev/null +++ b/components/blog/PostArticle.tsx @@ -0,0 +1,37 @@ +import Badge from "../ui/Badge"; +import { BlogPost } from "../../types/blogPost"; +import { toAgoTime } from "../../utils/timeUtils"; +import { postTypeLabel, postTypeTone } from "../../utils/postMeta"; +import Section from "./PostSection"; + +export default function PostArticle({ post }: { post: BlogPost }) { + const { title, author, date_created, type, sections } = post; + + return ( +
    +
    +
    +
    + {postTypeLabel(type)} + +
    +

    + {title} +

    +

    by {author}

    +
    + + {!!sections && + sections.map((section, index) => ( +
    + ))} +
    +
    + ); +} diff --git a/components/blog/PostCard.tsx b/components/blog/PostCard.tsx new file mode 100644 index 0000000..edde997 --- /dev/null +++ b/components/blog/PostCard.tsx @@ -0,0 +1,68 @@ +import classNames from "classnames"; +import Badge from "../../components/ui/Badge"; +import CardLink from "../../components/ui/CardLink"; +import { BlogPost } from "../../types/blogPost"; +import { toAgoTime, toHumanTime } from "../../utils/timeUtils"; +import { postTypeLabel, postTypeTone } from "../../utils/postMeta"; + +/** Cover image with scanlines and the type stamp. Shared with the home + * news section's featured card. The image is absolutely positioned so the + * box is sized by the caller (aspect ratio, min-height or grid stretch), + * never by the image's intrinsic size. */ +export function PostMedia({ post, className }: { post: BlogPost; className?: string }) { + return ( +
    + {/* oxlint-disable-next-line nextjs/no-img-element */} + +
    + + {postTypeLabel(post.type)} + +
    + ); +} + +/** "3 days ago · by Author" metadata line. */ +export function PostMeta({ post }: { post: BlogPost }) { + return ( +

    + {" "} + · by {post.author} +

    + ); +} + +type Props = { + post: BlogPost; + /** Heading element for the title, so the card slots into any page's + * heading hierarchy (h2 on /blog under the page h1; h3 on the home + * page under the "Latest news" h2). */ + titleAs?: "h2" | "h3"; +}; + +/** Feed card: cover image, type stamp, title, summary. */ +export default function PostCard({ post, titleAs: Title = "h2" }: Props) { + return ( + + +
    + + + {post.title} + +

    {post.summary}

    +
    +
    + ); +} diff --git a/components/blog/PostSection.tsx b/components/blog/PostSection.tsx new file mode 100644 index 0000000..0346ce7 --- /dev/null +++ b/components/blog/PostSection.tsx @@ -0,0 +1,36 @@ +import { BlogPostSection } from "../../types/blogPost"; + +/* Posts come from the CMS with raw CKEditor HTML; YouTube embeds arrive as + * tags that browsers ignore, so rewrite them into iframes. */ +const handleOembed = (heading: string, body: string): string => { + const pattern = + /<\/oembed>/g; + return body.replace( + pattern, + (_match: string, videoId: string) => ` +
    + +
    + `, + ); +}; + +export default function Section({ heading, body }: BlogPostSection) { + return ( +
    + {heading && ( +

    + {heading} +

    + )} +
    +
    + ); +} diff --git a/components/changelog/BuildPanel.tsx b/components/changelog/BuildPanel.tsx new file mode 100644 index 0000000..3f6f93f --- /dev/null +++ b/components/changelog/BuildPanel.tsx @@ -0,0 +1,54 @@ +"use client"; + +import { BiSolidDownload } from "react-icons/bi"; +import Dropdown from "../../components/ui/Dropdown"; +import Panel from "../../components/ui/Panel"; +import Build from "../../types/build"; +import ChangeRow from "./ChangeRow"; + +/* Game builds are published per platform on the CDN under the same version. */ +const BUILD_PLATFORMS = [ + { key: "StandaloneWindows64", label: "Windows" }, + { key: "StandaloneOSX", label: "macOS" }, + { key: "StandaloneLinux64", label: "Linux" }, + { key: "linuxserver", label: "Linux server" }, +]; + +const buildDownloadUrl = (platform: string, version: string) => + `https://cdn.unitystation.org/UnityStationDevelop/${platform}/${version}.zip`; + +export default function BuildPanel({ build }: { build: Build }) { + const { version_number, date_created, changes } = build; + + return ( + +
    + {changes?.length > 0 ? ( +
      + {changes.map((change, index) => ( + + ))} +
    + ) : ( +

    + This build has no registered changes :( +

    + )} +
    +
    + + + Download build + + } + items={BUILD_PLATFORMS.map(({ key, label }) => ({ + label, + href: buildDownloadUrl(key, version_number), + }))} + /> +
    +
    + ); +} diff --git a/components/changelog/ChangeRow.tsx b/components/changelog/ChangeRow.tsx new file mode 100644 index 0000000..7cfc904 --- /dev/null +++ b/components/changelog/ChangeRow.tsx @@ -0,0 +1,40 @@ +import type { IconType } from "react-icons"; +import { FaBalanceScale, FaQuestion, FaWrench } from "react-icons/fa"; +import { FaArrowUp, FaCirclePlus } from "react-icons/fa6"; +import type { Tone } from "../../components/ui/tones"; +import { toneText } from "../../components/ui/tones"; +import Change from "../../types/change"; + +const CATEGORY_META: Record = { + NEW: { icon: FaCirclePlus, tone: "success" }, + FIX: { icon: FaWrench, tone: "warning" }, + IMPROVEMENT: { icon: FaArrowUp, tone: "info" }, + BALANCE: { icon: FaBalanceScale, tone: "primary" }, +}; + +export default function ChangeRow({ change }: { change: Change }) { + const { author_username, author_url, description, pr_url, pr_number, category } = change; + const { icon: Icon, tone } = CATEGORY_META[category] ?? { + icon: FaQuestion, + tone: "neutral" as Tone, + }; + + return ( +
  • + +
    +

    {description}

    +

    + contributed by{" "} + + {author_username} + {" "} + in{" "} + + PR #{pr_number} + +

    +
    +
  • + ); +} diff --git a/components/changelog/ChangelogFeed.tsx b/components/changelog/ChangelogFeed.tsx new file mode 100644 index 0000000..a3d41a1 --- /dev/null +++ b/components/changelog/ChangelogFeed.tsx @@ -0,0 +1,23 @@ +"use client"; + +import useInfiniteFeed from "../../hooks/useInfiniteFeed"; +import LoadingPanel from "../ui/LoadingPanel"; +import Build from "../../types/build"; +import BuildPanel from "./BuildPanel"; + +const INITIAL_PAGE = "https://changelog.unitystation.org/all-changes?limit=5"; + +/** Infinite-scrolling list of game builds and their changes. */ +export default function ChangelogFeed() { + const { items: builds, isLoading, sentinelRef } = useInfiniteFeed(INITIAL_PAGE); + + return ( +
    + {builds.map((build, index) => ( + + ))} + {isLoading && } +
    +
    + ); +} diff --git a/components/download/DownloadExperience.tsx b/components/download/DownloadExperience.tsx new file mode 100644 index 0000000..7fc9b25 --- /dev/null +++ b/components/download/DownloadExperience.tsx @@ -0,0 +1,241 @@ +"use client"; + +import classNames from "classnames"; +import { useEffect, useState } from "react"; +import { BiSolidDownload } from "react-icons/bi"; +import Badge from "../../components/ui/Badge"; +import CopyCommand from "../../components/ui/CopyCommand"; +import LinkButton from "../../components/ui/LinkButton"; +import Notice from "../../components/ui/Notice"; +import Panel from "../../components/ui/Panel"; +import TextLink from "../../components/ui/TextLink"; +import { DownloadVariant, LauncherRelease, OsKey } from "../../types/launcherRelease"; +import { detectPlatform, LinuxFamily, recommendedLinuxFormat } from "../../utils/detectPlatform"; +import { OS_META, OS_ORDER } from "../../utils/osMeta"; + +type Props = { + release: LauncherRelease | null; + fallbackUrl: string; + initialOs?: OsKey; // server-detected platform; the client re-detects only when omitted + initialLinuxFamily?: LinuxFamily; +}; + +function OsTabs({ + selected, + detected, + onSelect, +}: { + selected: OsKey; + detected: OsKey | null; + onSelect: (os: OsKey) => void; +}) { + return ( +
    + {OS_ORDER.map((os) => { + const { label, Icon } = OS_META[os]; + const active = os === selected; + return ( + + ); + })} +
    + ); +} + +function HeroDownload({ variant }: { variant: DownloadVariant }) { + return ( +
    + + {variant.label} + +

    {variant.sizeMB} MB

    +
    + ); +} + +function PackageRow({ + recommended, + href, + children, +}: { + recommended?: boolean; + href?: string; + children: React.ReactNode; +}) { + const base = + "relative flex w-full flex-col items-center gap-2 rounded-lg border px-4 py-3 text-sm text-crew transition-colors"; + const border = recommended ? "border-accent/60 bg-primary/10" : "border-seam bg-hull/60"; + const badge = recommended && ( + + Recommended + + ); + + if (href) { + return ( + + {children} + {badge} + + ); + } + + return ( +
    + {children} + {badge} +
    + ); +} + +function Variants({ + os, + release, + linuxRecommended, +}: { + os: OsKey; + release: LauncherRelease; + linuxRecommended?: "aur" | "deb" | "rpm"; +}) { + if (os === "win") { + const { recommended, alternatives } = release.platforms.windows; + return ( +
    + {recommended && } + {alternatives.map((v) => ( + + {v.label} · {v.sizeMB} MB + + ))} +
    + ); + } + + if (os === "mac") { + const { recommended, note } = release.platforms.mac; + return ( +
    + {recommended && } +

    {note}

    +
    + ); + } + + const { deb, rpm, aur } = release.platforms.linux; + return ( +
    +

    Choose your package

    + + {deb && ( + + + {deb.label} · {deb.sizeMB} MB + + + )} + + {rpm && ( + + + {rpm.label} · {rpm.sizeMB} MB + + + )} + + + Arch Linux (AUR) + + + View on AUR + + +
    + ); +} + +export default function DownloadExperience({ + release, + fallbackUrl, + initialOs, + initialLinuxFamily, +}: Props) { + const [selectedOs, setSelectedOs] = useState(initialOs ?? "win"); + const [linuxFamily, setLinuxFamily] = useState(initialLinuxFamily); + const [detected, setDetected] = useState(initialOs ?? null); + + // Platform detection needs `navigator`, so it must run after hydration; the + // setState-in-effect is deliberate (SSR markup must match the first render). + /* oxlint-disable react/react-compiler */ + useEffect(() => { + if (initialOs) return; + const info = detectPlatform(); + if (info.os !== "unknown") { + setSelectedOs(info.os); + setDetected(info.os); + } + setLinuxFamily(info.linuxFamily); + }, [initialOs]); + /* oxlint-enable react/react-compiler */ + + if (!release) { + return ( +
    + +

    + We couldn't fetch the latest release. You can get it directly from + GitHub instead. +

    +
    + + All downloads on GitHub + +
    + ); + } + + return ( + + Release notes + + } + flush + className="mx-auto w-full max-w-2xl" + > + +
    + +
    +
    + ); +} diff --git a/components/home/AboutSection.tsx b/components/home/AboutSection.tsx new file mode 100644 index 0000000..b48b3bf --- /dev/null +++ b/components/home/AboutSection.tsx @@ -0,0 +1,17 @@ +import Container from "../../components/ui/Container"; +import SectionIntro from "../../components/ui/SectionIntro"; + +export default function AboutSection() { + return ( + + + + ); +} diff --git a/components/home/CommunitySection.tsx b/components/home/CommunitySection.tsx new file mode 100644 index 0000000..cda3144 --- /dev/null +++ b/components/home/CommunitySection.tsx @@ -0,0 +1,41 @@ +import { BiSolidDownload } from "react-icons/bi"; +import { FaDiscord } from "react-icons/fa6"; +import Container from "../../components/ui/Container"; +import LinkButton from "../../components/ui/LinkButton"; +import SectionIntro from "../../components/ui/SectionIntro"; +import { DISCORD_INVITE_URL } from "../../utils/urlContants"; + +export default function CommunitySection() { + return ( + +
    + +
    + + Join the Discord + + + Get the game + +
    +
    +
    + ); +} diff --git a/components/home/CommunityToolbar.tsx b/components/home/CommunityToolbar.tsx new file mode 100644 index 0000000..f8305ea --- /dev/null +++ b/components/home/CommunityToolbar.tsx @@ -0,0 +1,24 @@ +import { FaDiscord, FaGithub, FaPatreon } from "react-icons/fa6"; +import type { IconType } from "react-icons"; +import ButtonGroup from "../ui/ButtonGroup"; +import LinkButton from "../ui/LinkButton"; +import { DISCORD_INVITE_URL, GITHUB_URL, PATREON_URL } from "../../utils/urlContants"; + +const COMMUNITY: { label: string; href: string; Icon: IconType }[] = [ + { label: "GitHub", href: GITHUB_URL, Icon: FaGithub }, + { label: "Discord", href: DISCORD_INVITE_URL, Icon: FaDiscord }, + { label: "Patreon", href: PATREON_URL, Icon: FaPatreon }, +]; + +/** The community links as one steel segmented toolbar, clearly secondary to the CTA. */ +export default function CommunityToolbar() { + return ( + + {COMMUNITY.map(({ label, href, Icon }) => ( + + {label} + + ))} + + ); +} diff --git a/components/home/Hero.tsx b/components/home/Hero.tsx new file mode 100644 index 0000000..79fe451 --- /dev/null +++ b/components/home/Hero.tsx @@ -0,0 +1,50 @@ +import { BiSolidDownload } from "react-icons/bi"; +import LinkButton from "../ui/LinkButton"; +import CommunityToolbar from "./CommunityToolbar"; +import RotatingTagline from "./RotatingTagline"; +import ScreenshotFeed from "./ScreenshotFeed"; + +export default function Hero() { + return ( +
    +
    + {/* Title column */} +
    +
    +

    + + Welcome to + + + Unitystation! + +

    + +
    + +

    + Free and open-source remake of the cult classic Space Station 13, made in + Unity Engine. +

    + +
    + + Download + + +
    +
    + + {/* screenshot feed */} +
    + +
    +
    +
    + ); +} diff --git a/components/home/JobsTicker.tsx b/components/home/JobsTicker.tsx new file mode 100644 index 0000000..c87d588 --- /dev/null +++ b/components/home/JobsTicker.tsx @@ -0,0 +1,53 @@ +const JOBS = [ + "Captain", + "Head of Personnel", + "Clown", + "Mime", + "Chef", + "Bartender", + "Botanist", + "Chemist", + "Medical Doctor", + "Engineer", + "Atmospheric Technician", + "Security Officer", + "Detective", + "Warden", + "Janitor", + "Cargo Technician", + "Scientist", + "Chaplain", + "Assistant", + "AI", + "Cyborg", +]; + +function TickerRow({ hidden }: { hidden?: boolean }) { + return ( +
      + {JOBS.map((job) => ( +
    • + + {job} +
    • + ))} +
    + ); +} + +export default function JobsTicker() { + return ( +
    +
    + +
    + + Play as + +
    + ); +} diff --git a/components/home/NewsSection.tsx b/components/home/NewsSection.tsx new file mode 100644 index 0000000..5ece793 --- /dev/null +++ b/components/home/NewsSection.tsx @@ -0,0 +1,75 @@ +import { BlogPost } from "../../types/blogPost"; +import CardLink from "../../components/ui/CardLink"; +import Container from "../../components/ui/Container"; +import LinkButton from "../../components/ui/LinkButton"; +import SectionIntro from "../../components/ui/SectionIntro"; +import PostCard, { PostMedia, PostMeta } from "../blog/PostCard"; + +/* The featured card has room for real prose, so show the post's opening + * text instead of the one-line summary. Bodies are raw CKEditor HTML + * (see PostSection), so strip tags and decode the common entities; the + * CSS line clamp does the trimming. */ +function postExcerpt(post: BlogPost): string { + const text = (post.sections ?? []) + .map((section) => section.body) + .join(" ") + .replace(/<[^>]+>/g, " ") + .replace(/ /g, " ") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/&/g, "&") + .replace(/\s+/g, " ") + .replace(/ ([.,!?;:])/g, "$1") + .trim(); + return text || post.summary; +} + +function FeaturedPost({ post }: { post: BlogPost }) { + return ( + + +
    + +

    + {post.title} +

    +

    + {postExcerpt(post)} +

    +
    +
    + ); +} + +export default function NewsSection({ posts }: { posts: BlogPost[] }) { + if (posts.length === 0) return null; + + const [featured, ...rest] = posts; + const gridCount = rest.length < 3 ? rest.length : Math.min(6, Math.floor(rest.length / 3) * 3); + + return ( + +
    + + + All posts + +
    + + + + {gridCount > 0 && ( +
    + {rest.slice(0, gridCount).map((post) => ( + + ))} +
    + )} +
    + ); +} diff --git a/components/home/RotatingTagline.tsx b/components/home/RotatingTagline.tsx new file mode 100644 index 0000000..429bab2 --- /dev/null +++ b/components/home/RotatingTagline.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { useEffect, useState } from "react"; + +const TAGLINES = [ + "Join our Discord server to get involved!", + "Yeah, we have some bugs but at least they are funny!", + "We are not dead yet!", + "Surviving the curse one PR at a time!", + "Thank you patreons for keeping the lights on!", + "Check our Github if you want to contribute!", + "Devlog might release any time now!", + "[object Object]", + "Playtest every Saturday!", +]; + +const ROTATE_MS = 5_000; + +/** + * Minecraft-style splash text: a random community one-liner hanging + * diagonally off the top-left of the title, pulsing. Absolutely + * positioned, render it inside a `relative` wrapper around the headline. + */ +export default function RotatingTagline() { + const [tagline, setTagline] = useState(TAGLINES[0]); + + useEffect(() => { + const interval = setInterval(() => { + setTagline(TAGLINES[Math.floor(Math.random() * TAGLINES.length)]); + }, ROTATE_MS); + return () => clearInterval(interval); + }, []); + + return ( +

    + {tagline} +

    + ); +} diff --git a/components/home/ScreenshotFeed.tsx b/components/home/ScreenshotFeed.tsx new file mode 100644 index 0000000..50898ec --- /dev/null +++ b/components/home/ScreenshotFeed.tsx @@ -0,0 +1,115 @@ +"use client"; + +import classNames from "classnames"; +import { useEffect, useState } from "react"; +import PanelBar from "../ui/PanelBar"; +import StatusLight from "../ui/StatusLight"; + +const HERO_IMAGES: string[] = [ + "https://cdn.unitystation.org/Website-Statics/heroImages/bar-engine.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/clowns.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/conveyor.jpg", + "https://cdn.unitystation.org/Website-Statics/heroImages/df.jpg", + "https://cdn.unitystation.org/Website-Statics/heroImages/go-outsid.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/honk.jpg", + "https://cdn.unitystation.org/Website-Statics/heroImages/hugger.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/lemons.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/shuttlecrash.png", + "https://cdn.unitystation.org/Website-Statics/heroImages/chairs.jpg", +]; + +const ROTATE_INTERVAL_MS = 10_000; + +/** + * The hero's launcher window: in-game screenshots on a slow crossfade, a + * frame picker in the bottom bar, and an offset back plate for depth. + * + * Frames mount lazily only the current frame and the next one are in the + * DOM so a visit doesn't download all ten full-size screenshots up front. + * Once a frame has loaded it stays mounted, keeping the crossfade smooth. + */ +export default function ScreenshotFeed() { + const [frame, setFrame] = useState(0); + const [loaded, setLoaded] = useState(() => new Set([0, 1])); + + /** Mount a frame (and the one after it, as preload) and fade to it. */ + const showFrame = (i: number) => { + setFrame(i); + setLoaded((prev) => new Set(prev).add(i).add((i + 1) % HERO_IMAGES.length)); + }; + + // Auto-advance; re-arms whenever the frame changes, so picking a frame + // also restarts the timer. Inlines showFrame so the dependency list stays + // primitive (oxlint's exhaustive-deps isn't React Compiler-aware yet). + useEffect(() => { + const timeout = setTimeout(() => { + const next = (frame + 1) % HERO_IMAGES.length; + setFrame(next); + setLoaded((prev) => new Set(prev).add(next).add((next + 1) % HERO_IMAGES.length)); + }, ROTATE_INTERVAL_MS); + return () => clearTimeout(timeout); + }, [frame]); + + return ( +
    +
    +
    + + +

    In-game screenshots

    +
    + +
    + {HERO_IMAGES.map((src, i) => + loaded.has(i) ? ( +
    + ) : null, + )} +
    +
    + + {/* Status bar: frame picker + counter */} + +
    + {HERO_IMAGES.map((src, i) => ( +
    +

    + {String(frame + 1).padStart(2, "0")} /{" "} + {String(HERO_IMAGES.length).padStart(2, "0")} +

    +
    +
    +
    + ); +} diff --git a/components/ledger/LedgerPresentation.tsx b/components/ledger/LedgerPresentation.tsx new file mode 100644 index 0000000..3c2c66e --- /dev/null +++ b/components/ledger/LedgerPresentation.tsx @@ -0,0 +1,122 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { FaPaypal } from "react-icons/fa"; +import { RiPatreonFill } from "react-icons/ri"; +import Container from "../../components/ui/Container"; +import DataTable from "../../components/ui/DataTable"; +import LinkButton from "../../components/ui/LinkButton"; +import PageHeader from "../../components/ui/PageHeader"; +import Pagination from "../../components/ui/Pagination"; +import Panel from "../../components/ui/Panel"; +import { useLedgerApiProvider } from "../../context/ledger/LedgerApiProvider"; +import { useLedgerTableContext } from "../../context/ledger/LedgerDataTableProvider"; +import { PATREON_URL, PAYPAL_DONATION_URL } from "../../utils/urlContants"; + +const BALANCE_COUNT_UP_MS = 1200; + +const usd = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, +}); + +/** + * The balance figure, counting up from zero once the real number arrives. + * Jumps straight to the target under prefers-reduced-motion. + */ +function AnimatedBalance({ balance, ready }: { balance: string; ready: boolean }) { + const target = Number.parseFloat(balance) || 0; + const [value, setValue] = useState(0); + + useEffect(() => { + if (!ready) return; + + // Reduced motion collapses the count-up into a single frame. + const duration = window.matchMedia("(prefers-reduced-motion: reduce)").matches + ? 0 + : BALANCE_COUNT_UP_MS; + + let raf: number; + const t0 = performance.now(); + const tick = (now: number) => { + const progress = duration > 0 ? Math.min((now - t0) / duration, 1) : 1; + const eased = 1 - Math.pow(1 - progress, 4); + setValue(target * eased); + if (progress < 1) raf = requestAnimationFrame(tick); + }; + raf = requestAnimationFrame(tick); + return () => cancelAnimationFrame(raf); + }, [ready, target]); + + return

    {usd.format(value)}

    ; +} + +export default function LedgerPresentation() { + const content = useLedgerTableContext(); + const { + hasNextPage, + hasPreviousPage, + goToPreviousPage, + goToNextPage, + currentBalance, + isLoading, + } = useLedgerApiProvider(); + + return ( + + + +
    + + +

    + This is the amount currently available in Unitystation's project fund. + It updates manually after we receive a donation or withdraw from Patreon. +

    +

    + If your donation is not listed yet, it will appear soon once we update the + ledger. +

    +
    + + +

    + Unitystation is sustained entirely through community support; whether by + backing us on Patreon or sending direct donations. Every contribution helps + cover hosting, development, and infrastructure. +

    +
    + + Support us on Patreon + + + Donate via PayPal + +
    +
    +
    + +
    + + +
    +
    + ); +} diff --git a/components/molecules/OsSwitcher.tsx b/components/molecules/OsSwitcher.tsx deleted file mode 100644 index 7251bdb..0000000 --- a/components/molecules/OsSwitcher.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client'; -import { OsKey } from '../../types/launcherRelease'; -import Capsule from '../../app/common/uiLibrary/capsule'; -import { OS_META } from '../osMeta'; - -type Props = { - options: OsKey[]; - detected: OsKey | null; - onSelect: (os: OsKey) => void; -}; - -export default function OsSwitcher({ options, detected, onSelect }: Props) { - return ( -
    - On a different OS? - {options.map((os) => { - const { label, Icon } = OS_META[os]; - return ( - - ); - })} -
    - ); -} diff --git a/components/molecules/PackageOption.tsx b/components/molecules/PackageOption.tsx deleted file mode 100644 index bae576e..0000000 --- a/components/molecules/PackageOption.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { ReactNode } from 'react'; -import CornerBadge from '../atoms/CornerBadge'; - -// One shared row style so every option lines up at the same width and weight. -const BASE = - 'relative w-full flex flex-col items-center justify-center gap-2 py-3 px-4 text-sm uppercase ' + - 'border-2 border-gray-800 bg-gray-800 bg-opacity-30 text-white transition-colors'; - -// Added when the row is itself the action (a download link). -const LINK = - 'hover:bg-gray-800 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 ' + - 'focus-visible:ring-offset-2 focus-visible:ring-offset-gray-900'; - -type Props = { - recommended?: boolean; - /** When set, the whole row is the download link; otherwise it is a container. */ - href?: string; - children: ReactNode; -}; - -export default function PackageOption({ recommended, href, children }: Props) { - const badge = recommended ? : null; - - if (href) { - return ( - - {children} - {badge} - - ); - } - - return ( -
    - {children} - {badge} -
    - ); -} diff --git a/components/molecules/PlatformHeading.tsx b/components/molecules/PlatformHeading.tsx deleted file mode 100644 index 41bc4cf..0000000 --- a/components/molecules/PlatformHeading.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { OsKey } from '../../types/launcherRelease'; -import Capsule from '../../app/common/uiLibrary/capsule'; -import { OS_META } from '../osMeta'; - -type Props = { - os: OsKey; - version: string; - detected: boolean; -}; - -export default function PlatformHeading({ os, version, detected }: Props) { - const { label, Icon } = OS_META[os]; - return ( -
    - -
    - {label} - - Pudu Launcher · {version} - -
    - {detected && } -
    - ); -} diff --git a/components/molecules/TableHeaderRow.tsx b/components/molecules/TableHeaderRow.tsx deleted file mode 100644 index 7a0b3e4..0000000 --- a/components/molecules/TableHeaderRow.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import {Column} from "./TableRow"; -import TableHeaderCell, {SortDirection} from "../atoms/TableHeaderCell"; - -const TableHeaderRow = ({ - columns, - sortBy, - sortDir, - setSort, - }: { - columns: Column[]; - sortBy: number | null; - sortDir: SortDirection; - setSort: (col: number) => void; -}) => ( - - {columns.map((col, i) => ( - col.sortFn && setSort(i)} - > - {col.header} - - ))} - -); - -export default TableHeaderRow; \ No newline at end of file diff --git a/components/molecules/TableRow.tsx b/components/molecules/TableRow.tsx deleted file mode 100644 index d268d21..0000000 --- a/components/molecules/TableRow.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import {ReactNode} from "react"; -import TableCell from "../atoms/TableCell"; - -export interface Column { - header: string; - cell: (row: T) => ReactNode; - sortFn?: (a: T, b: T) => number; -} - -const TableRow = ({ columns, row }: { columns: Column[]; row: T }) => ( - - {columns.map((col, i) => ( - {col.cell(row)} - ))} - -); - -export default TableRow; \ No newline at end of file diff --git a/components/molecules/VariantsPanel.tsx b/components/molecules/VariantsPanel.tsx deleted file mode 100644 index eb34ee1..0000000 --- a/components/molecules/VariantsPanel.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { LauncherRelease, OsKey } from '../../types/launcherRelease'; -import HeroDownloadLink from '../atoms/HeroDownloadLink'; -import AltDownloadLink from '../atoms/AltDownloadLink'; -import CopyableCommand from '../atoms/CopyableCommand'; -import QuietExternalLink from '../atoms/QuietExternalLink'; -import PackageOption from './PackageOption'; - -type Props = { - os: OsKey; - release: LauncherRelease; - linuxRecommended?: 'aur' | 'deb' | 'rpm'; -}; - -export default function VariantsPanel({ os, release, linuxRecommended }: Props) { - if (os === 'win') { - const { recommended, alternatives } = release.platforms.windows; - return ( -
    - {recommended && } - {recommended &&

    {recommended.sizeMB} MB

    } -
    - {alternatives.map((v) => ( - - ))} -
    -
    - ); - } - - if (os === 'mac') { - const { recommended, note } = release.platforms.mac; - return ( -
    - {recommended && } - {recommended &&

    {recommended.sizeMB} MB

    } -

    {note}

    -
    - ); - } - - // linux: every option is an equal-width row so deb, rpm and AUR read as peers. - const { deb, rpm, aur } = release.platforms.linux; - return ( -
    -

    Choose your Linux package

    - - {deb && ( - - {deb.label} · {deb.sizeMB} MB - - )} - - {rpm && ( - - {rpm.label} · {rpm.sizeMB} MB - - )} - - - Arch Linux (AUR) - - - View on AUR - - -
    - ); -} diff --git a/components/organisms/DataTable.tsx b/components/organisms/DataTable.tsx deleted file mode 100644 index 500be77..0000000 --- a/components/organisms/DataTable.tsx +++ /dev/null @@ -1,65 +0,0 @@ -'use client'; - -import React, {useState} from "react"; -import {SortDirection} from "../atoms/TableHeaderCell"; -import TableRow, {Column} from "../molecules/TableRow"; -import TableHeaderRow from "../molecules/TableHeaderRow"; - -export interface DataTableProps { - columns: Column[]; - data: T[]; - /** initial column index and direction */ - defaultSort?: { column: number; direction: SortDirection }; - /** bubble sort changes upward if you need it */ - onSortChange?: (col: number, dir: SortDirection) => void; -} - -function DataTable({ - columns, - data, - defaultSort, - onSortChange, - }: DataTableProps) { - const [sortBy, setSortBy] = useState( - defaultSort ? defaultSort.column : null, - ); - const [sortDir, setSortDir] = useState( - defaultSort ? defaultSort.direction : 'asc', - ); - - const handleSort = (col: number) => { - const dir: SortDirection = - sortBy === col && sortDir === 'asc' ? 'desc' : 'asc'; - setSortBy(col); - setSortDir(dir); - onSortChange?.(col, dir); - }; - - const sorted = React.useMemo(() => { - if (sortBy === null) return data; - const col = columns[sortBy]; - if (!col.sortFn) return data; - const copied = [...data].sort(col.sortFn); - return sortDir === 'asc' ? copied : copied.reverse(); - }, [data, sortBy, sortDir, columns]); - - return ( - - - - - - {sorted.map((row, idx) => ( - - ))} - -
    - ); -} - -export default DataTable; \ No newline at end of file diff --git a/components/organisms/DownloadExperience.tsx b/components/organisms/DownloadExperience.tsx deleted file mode 100644 index 20ba537..0000000 --- a/components/organisms/DownloadExperience.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; -import { useEffect, useState } from 'react'; -import { BiSolidDownload } from 'react-icons/bi'; -import { LauncherRelease, OsKey } from '../../types/launcherRelease'; -import { - detectPlatform, - recommendedLinuxFormat, - LinuxFamily, -} from '../../utils/detectPlatform'; -import { OS_ORDER } from '../osMeta'; -import PlatformHeading from '../molecules/PlatformHeading'; -import VariantsPanel from '../molecules/VariantsPanel'; -import OsSwitcher from '../molecules/OsSwitcher'; -import QuietExternalLink from '../atoms/QuietExternalLink'; - -type Props = { - release: LauncherRelease | null; - fallbackUrl: string; - initialOs?: OsKey; // server-detected platform; the client re-detects only when omitted - initialLinuxFamily?: LinuxFamily; -}; - -export default function DownloadExperience({ - release, - fallbackUrl, - initialOs, - initialLinuxFamily, -}: Props) { - const [selectedOs, setSelectedOs] = useState(initialOs ?? 'win'); - const [linuxFamily, setLinuxFamily] = useState(initialLinuxFamily); - const [detected, setDetected] = useState(initialOs ?? null); - - useEffect(() => { - if (initialOs) return; - const info = detectPlatform(); - if (info.os !== 'unknown') { - setSelectedOs(info.os); - setDetected(info.os); - } - setLinuxFamily(info.linuxFamily); - }, [initialOs]); - - if (!release) { - return ( - - ); - } - - const linuxRecommended = recommendedLinuxFormat(linuxFamily); - const others = OS_ORDER.filter((os) => os !== selectedOs); - - return ( -
    -
    - - -
    - - - - - All versions & release notes on GitHub - -
    - ); -} diff --git a/components/osMeta.ts b/components/osMeta.ts deleted file mode 100644 index 5610226..0000000 --- a/components/osMeta.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { IconType } from 'react-icons'; -import { FaWindows, FaApple, FaLinux } from 'react-icons/fa'; -import { OsKey } from '../types/launcherRelease'; - -export const OS_META: Record = { - win: { label: 'Windows', Icon: FaWindows }, - mac: { label: 'macOS', Icon: FaApple }, - linux: { label: 'Linux', Icon: FaLinux }, -}; - -export const OS_ORDER: OsKey[] = ['win', 'mac', 'linux']; diff --git a/components/site/Clown.tsx b/components/site/Clown.tsx new file mode 100644 index 0000000..7868309 --- /dev/null +++ b/components/site/Clown.tsx @@ -0,0 +1,137 @@ +"use client"; + +import "./clown.css"; +import { useEffect, useRef, useState } from "react"; + +const MS_PER_FRAME = 30; +const CLOWN_SIZE = 64; +const CLOWN_DEATH_CLICKS = 500; + +/* Escalating responses to people who keep clicking the clown. */ +function tauntFor(timesClicked: number): string | null { + if (timesClicked > 499) return "Ok, You killed the clown. I hope you are happy now."; + if (timesClicked > 300) + return "What are you trying to do? You want to post how many times you clicked the clown and get a medal or something?"; + if (timesClicked > 200) return "Seriously?"; + if (timesClicked > 100) return "Don't you have anything better to do?"; + if (timesClicked > 50) return "Erm, aren't you getting bored?"; + if (timesClicked > 20) return "Haha, clicking the clown is so funny!"; + return null; +} + +/** A honk sends the clown flying in a random direction at a random speed. */ +function randomVelocity() { + const angle = Math.random() * Math.PI * 2; + const speed = 1.5 + Math.random() * 3.5; + return { x: Math.cos(angle) * speed, y: Math.sin(angle) * speed }; +} + +/** + * The clown. It bounces around the screen, it honks when clicked, and if you + * click it 500 times it dies. This is load-bearing website infrastructure, + * do not remove. + */ +export default function Clown() { + const [timesClicked, setTimesClicked] = useState(0); + const audioRef = useRef(null); + const clownRef = useRef(null); + const posRef = useRef({ x: -CLOWN_SIZE, y: -CLOWN_SIZE }); + const velRef = useRef({ x: 1, y: 1 }); + + const alive = timesClicked < CLOWN_DEATH_CLICKS; + + const handleClick = () => { + void audioRef.current?.play(); + setTimesClicked((n) => n + 1); + velRef.current = randomVelocity(); + }; + + useEffect(() => { + const el = clownRef.current; + if (!alive || !el) return; + + const place = () => { + el.style.transform = `translate3d(${posRef.current.x}px, ${posRef.current.y}px, 0)`; + }; + + if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) { + // No roaming: sit in the bottom-left corner instead. + posRef.current = { + x: CLOWN_SIZE / 2, + y: window.innerHeight - CLOWN_SIZE * 1.5, + }; + place(); + return; + } + + let raf: number; + let last = performance.now(); + + const tick = (now: number) => { + // Cap long gaps (background tabs) so the clown doesn't teleport. + const frames = Math.min((now - last) / MS_PER_FRAME, 3); + last = now; + + const pos = posRef.current; + const vel = velRef.current; + const stepX = vel.x * frames; + const stepY = vel.y * frames; + if ( + pos.x + stepX > window.innerWidth + CLOWN_SIZE / 4 || + pos.x + stepX < -CLOWN_SIZE * 2 + ) { + vel.x = -vel.x; + } + if ( + pos.y + stepY > window.innerHeight + CLOWN_SIZE / 4 || + pos.y + stepY < -CLOWN_SIZE * 2 + ) { + vel.y = -vel.y; + } + pos.x += vel.x * frames; + pos.y += vel.y * frames; + place(); + raf = requestAnimationFrame(tick); + }; + + raf = requestAnimationFrame(tick); + return () => cancelAnimationFrame(raf); + }, [alive]); + + const taunt = tauntFor(timesClicked); + + // The fixed, self-clipping cage means the clown can wander past the screen + // edges without ever widening the page or spawning a horizontal scrollbar. + return ( +
    + {timesClicked > 5 && ( +
    +

    Times you have clicked the clown: {timesClicked}

    + {taunt &&

    {taunt}

    } +
    + )} + {/* A bike horn has no dialogue to caption. */} + {/* oxlint-disable-next-line jsx-a11y/media-has-caption */} +
    + ); +} diff --git a/components/site/Footer.tsx b/components/site/Footer.tsx new file mode 100644 index 0000000..9896016 --- /dev/null +++ b/components/site/Footer.tsx @@ -0,0 +1,72 @@ +import { BsDiscord, BsGithub } from "react-icons/bs"; +import { MdEmail } from "react-icons/md"; +import { RiPatreonFill } from "react-icons/ri"; +import { DISCORD_INVITE_URL, GITHUB_URL, PATREON_URL } from "../../utils/urlContants"; + +const CONTACT_EMAIL = "info@unitystation.org"; + +type ChannelProps = { + href: string; + icon: React.ReactNode; + kicker: string; + label: string; +}; + +function Channel({ href, icon, kicker, label }: ChannelProps) { + return ( + + {icon} + + {kicker} + {label} + + + ); +} + +export default function Footer() { + return ( +
    +
    +
    +

    Let's chat!

    +

    + We'd love to hear from you! The quickest way to reach us is by joining + our Discord server and dropping us a message. But, if you'd rather, + feel free to shoot us an email. +

    +
    + +
    + } + kicker="Join our" + label="Discord server" + /> + } + kicker="Email us at" + label={CONTACT_EMAIL} + /> + } + kicker="Contribute on" + label="GitHub" + /> + } + kicker="Support us on" + label="Patreon" + /> +
    +
    +
    + ); +} diff --git a/components/site/Navbar.tsx b/components/site/Navbar.tsx new file mode 100644 index 0000000..2b7a4a0 --- /dev/null +++ b/components/site/Navbar.tsx @@ -0,0 +1,118 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { useContext, useState } from "react"; +import classNames from "classnames"; +import { GoLinkExternal } from "react-icons/go"; +import { FiMenu, FiX } from "react-icons/fi"; +import { AuthorizerContext } from "../../context/AuthorizerContextProvider"; +import Dropdown from "../ui/Dropdown"; + +const PLAYER_WIKI = "https://wiki.unitystation.org"; +const DEV_WIKI = "https://unitystation.github.io/unitystation/"; + +const NAV_LINKS = [ + { href: "/", label: "Home" }, + { href: "/download", label: "Download" }, + { href: "/blog", label: "Blog" }, + { href: "/changelog", label: "Changelog" }, + { href: "/ledger", label: "Ledger" }, +]; + +const EXTERNAL_LINKS = [ + { href: PLAYER_WIKI, label: "Player's wiki" }, + { href: DEV_WIKI, label: "Dev's wiki" }, +]; + +/** Every nav link, internal then external. Rendered once per breakpoint layout. */ +function NavItems({ onItemClick }: { onItemClick?: () => void }) { + const pathname = usePathname(); + + return ( + <> + {NAV_LINKS.map(({ href, label }) => ( + + {label} + + ))} + {EXTERNAL_LINKS.map(({ href, label }) => ( + + {label} + + + ))} + + ); +} + +export default function Navbar() { + const { state } = useContext(AuthorizerContext); + const [menuOpen, setMenuOpen] = useState(false); + + const username = state.authContext?.account.username; + const accountItems = state.isLoggedIn + ? [{ label: "Logout", href: "/logout" }] + : [ + { label: "Login / Register", href: "/login" }, + { label: "Reset password", href: "/reset-password" }, + ]; + + return ( +
    +
    + {/* Brand */} + setMenuOpen(false)} + > + + Unitystation + + + + {/* Desktop nav */} + + +
    + + +
    +
    + + {/* Mobile nav */} + {menuOpen && ( + + )} +
    + ); +} diff --git a/components/site/ParallaxSpace.tsx b/components/site/ParallaxSpace.tsx new file mode 100644 index 0000000..e359d6e --- /dev/null +++ b/components/site/ParallaxSpace.tsx @@ -0,0 +1,135 @@ +"use client"; + +import { useEffect, useRef } from "react"; + +/* + * The game's own main-menu space backdrop, rebuilt for the browser. + * Textures come straight from the unitystation repo + * (Assets/Textures/background/space/parallax). Three tiling layers move at + * different speeds while scrolling; the star layers sit on black and are + * composited with `screen` blending. A slow horizontal drift (pure CSS, + * composited) keeps space alive even when the page is idle, like in game. + */ + +const TILE = 480; + +type StarLayer = { + src: string; + /** Fraction of the scroll distance this layer moves. Farther = slower. */ + speed: number; + /** Idle horizontal drift in px/s, same depth ordering as `speed`. */ + driftPxPerSecond: number; + /** Upscale factor for the 480px tile. */ + scale: number; + blend?: "screen"; +}; + +const STAR_LAYERS: StarLayer[] = [ + { + src: "/background/parallax/parallax_layer1.png", + speed: 0.05, + driftPxPerSecond: 2, + scale: 2.5, + }, + { + src: "/background/parallax/parallax_layer2.png", + speed: 0.15, + driftPxPerSecond: 6, + scale: 1.75, + blend: "screen", + }, + { + src: "/background/parallax/parallax_layer3.png", + speed: 0.3, + driftPxPerSecond: 13, + scale: 1.25, + blend: "screen", + }, +]; + +export default function ParallaxSpace() { + const layerRefs = useRef<(HTMLDivElement | null)[]>([]); + + useEffect(() => { + if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; + + let ticking = false; + + const update = () => { + ticking = false; + const scrollY = window.scrollY; + + STAR_LAYERS.forEach((layer, i) => { + const el = layerRefs.current[i]; + if (!el) return; + const tile = TILE * layer.scale; + el.style.transform = `translate3d(0, ${-((scrollY * layer.speed) % tile)}px, 0)`; + }); + }; + + const onScroll = () => { + if (!ticking) { + ticking = true; + requestAnimationFrame(update); + } + }; + + update(); + window.addEventListener("scroll", onScroll, { passive: true }); + window.addEventListener("resize", onScroll, { passive: true }); + return () => { + window.removeEventListener("scroll", onScroll); + window.removeEventListener("resize", onScroll); + }; + }, []); + + const renderLayer = (layer: StarLayer, i: number) => { + const tile = TILE * layer.scale; + return ( + // Blend mode sits on the outer div: the inner drift/transform layers + // create their own stacking contexts, which would isolate the blend + // from the sibling layers underneath. +
    { + layerRefs.current[i] = el; + }} + className="absolute inset-0 will-change-transform" + style={{ mixBlendMode: layer.blend }} + > +
    +
    + ); + }; + + return ( +
    + {/* Nebula base sits behind everything. */} + {renderLayer(STAR_LAYERS[0], 0)} + + {/* The planet stays put: pinned to the viewport, indifferent to + scroll, with the star layers screen-blended over it. */} +
    + {/* oxlint-disable-next-line nextjs/no-img-element */} + +
    + + {STAR_LAYERS.slice(1).map((layer, i) => renderLayer(layer, i + 1))} +
    + ); +} diff --git a/app/clown/clown.css b/components/site/clown.css similarity index 76% rename from app/clown/clown.css rename to components/site/clown.css index d19b357..68d64df 100644 --- a/app/clown/clown.css +++ b/components/site/clown.css @@ -1,5 +1,5 @@ .clown-img { - position: absolute; + display: block; image-rendering: pixelated; animation: speeeen 5s linear infinite; } @@ -12,7 +12,3 @@ transform: rotate(360deg); } } - -.timesClicked { - position: fixed; -} diff --git a/components/ui/Badge.tsx b/components/ui/Badge.tsx new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/components/ui/Badge.tsx @@ -0,0 +1,25 @@ +import classNames from "classnames"; +import type { Tone } from "./tones"; +import { toneBg, toneBorder, toneText } from "./tones"; + +type Props = { + children: React.ReactNode; + tone?: Tone; + className?: string; +}; + +export default function Badge({ children, tone = "neutral", className }: Props) { + return ( + + {children} + + ); +} diff --git a/components/ui/Button.tsx b/components/ui/Button.tsx new file mode 100644 index 0000000..85d7aec --- /dev/null +++ b/components/ui/Button.tsx @@ -0,0 +1,32 @@ +"use client"; + +import type { IconType } from "react-icons"; +import { buttonClasses, type ButtonSize, type ButtonVariant } from "./buttonStyles"; + +export type { ButtonSize, ButtonVariant } from "./buttonStyles"; + +type ButtonProps = React.ButtonHTMLAttributes & { + variant?: ButtonVariant; + size?: ButtonSize; + iconLeft?: IconType; + iconRight?: IconType; +}; + +export default function Button({ + variant = "primary", + size = "md", + iconLeft: IconLeft, + iconRight: IconRight, + className, + children, + type = "button", + ...rest +}: ButtonProps) { + return ( + + ); +} diff --git a/components/ui/ButtonGroup.tsx b/components/ui/ButtonGroup.tsx new file mode 100644 index 0000000..83e0642 --- /dev/null +++ b/components/ui/ButtonGroup.tsx @@ -0,0 +1,30 @@ +import classNames from "classnames"; + +type Props = { + "aria-label": string; + className?: string; + children: React.ReactNode; +}; + +/** + * Fuses Buttons/LinkButtons into one segmented launcher bar: the group owns + * the border, corners and bevel; children are flattened into equal segments. + */ +export default function ButtonGroup({ className, children, ...rest }: Props) { + return ( +
    *]:flex-1 [&>*]:rounded-none", + // keep focus rings visible inside the clipped container + "[&>*:focus-visible]:ring-inset [&>*:focus-visible]:ring-offset-0", + className, + )} + {...rest} + > + {children} +
    + ); +} diff --git a/components/ui/CardLink.tsx b/components/ui/CardLink.tsx new file mode 100644 index 0000000..23cce17 --- /dev/null +++ b/components/ui/CardLink.tsx @@ -0,0 +1,31 @@ +import Link from "next/link"; +import classNames from "classnames"; + +type Props = { + href: string; + /** Inner layout of the card (e.g. `flex flex-col` or a grid). */ + className?: string; + children: React.ReactNode; +}; + +/** + * A whole card as one link: the Panel surface with an accent border on + * hover and the standard focus ring. It sets `group`, so children can + * react to hover (title tint, PostMedia's slow zoom). + */ +export default function CardLink({ href, className, children }: Props) { + return ( + + {children} + + ); +} diff --git a/components/ui/Container.tsx b/components/ui/Container.tsx new file mode 100644 index 0000000..031cb27 --- /dev/null +++ b/components/ui/Container.tsx @@ -0,0 +1,27 @@ +import classNames from "classnames"; + +type Props = { + children: React.ReactNode; + /** narrow = forms & articles, default = page content, wide = tables/grids */ + width?: "narrow" | "default" | "wide"; + className?: string; +}; + +/** Horizontal page rhythm. All routed pages wrap their content in one. */ +export default function Container({ children, width = "default", className }: Props) { + return ( +
    + {children} +
    + ); +} diff --git a/components/ui/CopyCommand.tsx b/components/ui/CopyCommand.tsx new file mode 100644 index 0000000..33a89a1 --- /dev/null +++ b/components/ui/CopyCommand.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { useState } from "react"; +import { FiCheck, FiCopy } from "react-icons/fi"; + +/** One-line shell command with a copy button. */ +export default function CopyCommand({ command }: { command: string }) { + const [copied, setCopied] = useState(false); + + const onCopy = async () => { + try { + await navigator.clipboard.writeText(command); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + // Clipboard unavailable (e.g. insecure context); the command stays selectable. + } + }; + + return ( + + + {command} + + + + ); +} diff --git a/components/ui/DataTable.tsx b/components/ui/DataTable.tsx new file mode 100644 index 0000000..db436fd --- /dev/null +++ b/components/ui/DataTable.tsx @@ -0,0 +1,94 @@ +import type { ReactNode } from "react"; + +export interface Column { + header: string; + cell: (row: T) => ReactNode; + /** Optional cell alignment; headers follow. */ + align?: "left" | "right"; +} + +export interface DataTableProps { + columns: Column[]; + data: T[]; + /** Shown when data is empty. */ + emptyMessage?: string; + /** Render pulsing placeholder rows instead of data. */ + loading?: boolean; + /** How many placeholder rows to sketch, sized to match real rows so the + * table keeps its height while the data arrives. */ + skeletonRows?: number; +} + +/** Data table: small mono headers, hairline rows, hover highlight. */ +export default function DataTable({ + columns, + data, + emptyMessage = "No records.", + loading = false, + skeletonRows = 10, +}: DataTableProps) { + return ( +
    + + + + {columns.map((col) => ( + + ))} + + + + {loading ? ( + Array.from({ length: skeletonRows }).map((_, i) => ( + + {columns.map((col) => ( + + ))} + + )) + ) : data.length === 0 ? ( + + + + ) : ( + data.map((row, i) => ( + + {columns.map((col) => ( + + ))} + + )) + )} + +
    + {col.header} +
    + {/* h-5 matches the text-sm line height of a data cell */} + +
    + {emptyMessage} +
    + {col.cell(row)} +
    +
    + ); +} diff --git a/components/ui/Dropdown.tsx b/components/ui/Dropdown.tsx new file mode 100644 index 0000000..59678ad --- /dev/null +++ b/components/ui/Dropdown.tsx @@ -0,0 +1,110 @@ +"use client"; + +import classNames from "classnames"; +import { useEffect, useRef, useState } from "react"; +import { BiSolidChevronDown } from "react-icons/bi"; +import { buttonClasses, type ButtonVariant } from "./buttonStyles"; + +export type DropdownItem = { + label: React.ReactNode; + /** Renders an when set… */ + href?: string; + /** …or a button when set instead. */ + onClick?: () => void; +}; + +type Props = { + label: React.ReactNode; + items: DropdownItem[]; + variant?: ButtonVariant; + align?: "left" | "right"; + className?: string; +}; + +/** Click-to-open menu. Closes on outside click and Escape. */ +export default function Dropdown({ + label, + items, + variant = "secondary", + align = "right", + className, +}: Props) { + const [open, setOpen] = useState(false); + const rootRef = useRef(null); + + useEffect(() => { + if (!open) return; + const onPointerDown = (e: MouseEvent) => { + if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false); + }; + const onKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }; + document.addEventListener("mousedown", onPointerDown); + document.addEventListener("keydown", onKeyDown); + return () => { + document.removeEventListener("mousedown", onPointerDown); + document.removeEventListener("keydown", onKeyDown); + }; + }, [open]); + + const itemClasses = + "block w-full px-4 py-2.5 text-left text-sm text-dim transition-colors hover:bg-raised hover:text-crew"; + + return ( + + ); +} diff --git a/components/ui/FormShell.tsx b/components/ui/FormShell.tsx new file mode 100644 index 0000000..05e96c3 --- /dev/null +++ b/components/ui/FormShell.tsx @@ -0,0 +1,56 @@ +import Spinner from "./Spinner"; + +type Props = { + title: string; + /** Server action or submit handler, passed straight to
    . */ + action?: ((formData: FormData) => void) | string; + /** Dim the form and show the spinner while a request is in flight. */ + busy?: boolean; + children: React.ReactNode; +}; + +/** + * Centered card for the account flows: title, then fields. + * Pair with for the "already have an account?" row. + */ +export default function FormShell({ title, action, busy, children }: Props) { + return ( +
    +
    +
    +

    + {title} +

    + + {children} + +
    + + {busy && ( +
    + +

    Loading…

    +
    + )} +
    +
    + ); +} + +type FooterLink = { href: string; label: string }; + +export function FormFooterLinks({ links }: { links: FooterLink[] }) { + return ( +
    + {links.map(({ href, label }) => ( + + {label} + + ))} +
    + ); +} diff --git a/components/ui/LinkButton.tsx b/components/ui/LinkButton.tsx new file mode 100644 index 0000000..a0b000c --- /dev/null +++ b/components/ui/LinkButton.tsx @@ -0,0 +1,50 @@ +import Link from "next/link"; +import type { IconType } from "react-icons"; +import { buttonClasses, type ButtonSize, type ButtonVariant } from "./buttonStyles"; + +type Props = { + href: string; + variant?: ButtonVariant; + size?: ButtonSize; + iconLeft?: IconType; + iconRight?: IconType; + /** External links get target=_blank + rel automatically. */ + external?: boolean; + className?: string; + children: React.ReactNode; +}; + +/** The Button, as a link. Same variants, same sizes */ +export default function LinkButton({ + href, + variant = "primary", + size = "md", + iconLeft: IconLeft, + iconRight: IconRight, + external, + className, + children, +}: Props) { + const classes = buttonClasses(variant, size, className); + const content = ( + <> + {IconLeft && } + {children} + {IconRight && } + + ); + + if (external) { + return ( + + {content} + + ); + } + + return ( + + {content} + + ); +} diff --git a/components/ui/LoadingPanel.tsx b/components/ui/LoadingPanel.tsx new file mode 100644 index 0000000..7d2507a --- /dev/null +++ b/components/ui/LoadingPanel.tsx @@ -0,0 +1,11 @@ +import Spinner from "./Spinner"; + +/** Full-width placeholder panel while a list or page section loads. */ +export default function LoadingPanel({ label = "Loading" }: { label?: string }) { + return ( +
    + +

    {label}…

    +
    + ); +} diff --git a/components/ui/Notice.tsx b/components/ui/Notice.tsx new file mode 100644 index 0000000..2525877 --- /dev/null +++ b/components/ui/Notice.tsx @@ -0,0 +1,35 @@ +import StatusLight from "./StatusLight"; +import type { Tone } from "./tones"; +import { toneBg, toneBorder, toneText } from "./tones"; + +const DEFAULT_HEADINGS: Partial> = { + success: "Success", + danger: "Error", + info: "Notice", + warning: "Warning", +}; + +type Props = { + tone?: Tone; + /** Short heading; defaults per tone (Success / Error / Notice / Warning). */ + heading?: string; + children: React.ReactNode; + className?: string; +}; + +/** Inline status block for form results and warnings. */ +export default function Notice({ tone = "info", heading, children, className = "" }: Props) { + const resolvedHeading = heading ?? DEFAULT_HEADINGS[tone] ?? "Notice"; + return ( +
    +

    + + {resolvedHeading} +

    +
    {children}
    +
    + ); +} diff --git a/components/ui/PageHeader.tsx b/components/ui/PageHeader.tsx new file mode 100644 index 0000000..6d4bf0e --- /dev/null +++ b/components/ui/PageHeader.tsx @@ -0,0 +1,19 @@ +type Props = { + title: string; + lede?: React.ReactNode; + centered?: boolean; +}; + +/** Standard page opening: display title and an optional short description. */ +export default function PageHeader({ title, lede, centered }: Props) { + return ( +
    +

    + {title} +

    + {lede && ( +

    {lede}

    + )} +
    + ); +} diff --git a/components/ui/Pagination.tsx b/components/ui/Pagination.tsx new file mode 100644 index 0000000..a02cb76 --- /dev/null +++ b/components/ui/Pagination.tsx @@ -0,0 +1,40 @@ +"use client"; + +import { BiChevronLeft, BiChevronRight } from "react-icons/bi"; +import Button from "./Button"; + +type Props = { + hasPrevious: boolean; + hasNext: boolean; + onPrevious: () => void; + onNext: () => void; + /** Optional centre label, e.g. "Page 2". */ + label?: string; +}; + +/** Prev/next pager for API-paginated lists. */ +export default function Pagination({ hasPrevious, hasNext, onPrevious, onNext, label }: Props) { + return ( + + ); +} diff --git a/components/ui/Panel.tsx b/components/ui/Panel.tsx new file mode 100644 index 0000000..b096e3b --- /dev/null +++ b/components/ui/Panel.tsx @@ -0,0 +1,57 @@ +import classNames from "classnames"; +import PanelBar from "./PanelBar"; +import StatusLight from "./StatusLight"; +import type { Tone } from "./tones"; + +type Props = { + children: React.ReactNode; + /** Optional launcher-style title bar. */ + title?: string; + /** Right-aligned meta text in the title bar (e.g. a date or version). */ + meta?: React.ReactNode; + /** + * Show a blinking LED in the title bar. Reserved for live panels (the + * hero screenshot feed, the launcher download); most panels have none. + */ + led?: boolean; + /** Colour of the LED; only meaningful together with `led`. */ + tone?: Tone; + /** Remove inner padding when the content manages its own (tables, images). */ + flush?: boolean; + className?: string; +}; + +/** + * The base surface of the system: a solid steel-blue plate floating over + * space, with an optional lighter title bar (the launcher-window look). + * + * No `overflow-hidden` here: it would clip popovers (e.g. the download + * Dropdown in BuildPanel). The title bar rounds its own top corners; flush + * content must not paint a background into the bottom corners. + */ +export default function Panel({ + children, + title, + meta, + led = false, + tone = "success", + flush = false, + className, +}: Props) { + return ( +
    + {title && ( + +

    + {led && } + {title} +

    + {meta &&
    {meta}
    } +
    + )} +
    {children}
    +
    + ); +} diff --git a/components/ui/PanelBar.tsx b/components/ui/PanelBar.tsx new file mode 100644 index 0000000..81daf42 --- /dev/null +++ b/components/ui/PanelBar.tsx @@ -0,0 +1,31 @@ +import classNames from "classnames"; + +type Props = { + children: React.ReactNode; + /** Which edge of the panel the strip sits on; sets its border and corner rounding. */ + edge?: "top" | "bottom"; + /** Render as a
    when the strip titles its panel. */ + as?: "div" | "header"; + className?: string; +}; + +/** + * The raised strip of a launcher window: title bars and status bars. Sits + * flush against a Panel edge (or any bg-panel frame) and rounds the outer + * corners so it never paints over the panel's radius. + */ +export default function PanelBar({ children, edge = "top", as: Tag = "div", className }: Props) { + return ( + + {children} + + ); +} diff --git a/components/ui/SectionIntro.tsx b/components/ui/SectionIntro.tsx new file mode 100644 index 0000000..f9ca58a --- /dev/null +++ b/components/ui/SectionIntro.tsx @@ -0,0 +1,53 @@ +import classNames from "classnames"; + +type Props = { + /** The small mono line above the heading ("From the blog"). */ + kicker: string; + title: string; + /** Optional lead paragraph under the heading. */ + lead?: React.ReactNode; + /** `lg` opens a full section; `md` for headers that share the row with an action. */ + size?: "md" | "lg"; + centered?: boolean; + className?: string; +}; + +/** + * Opens a section that sits directly on the starfield: kicker line, display + * heading and optional lead, all with text halos. For content inside a + * Panel use PageHeader instead, panels never need halos. + */ +export default function SectionIntro({ + kicker, + title, + lead, + size = "lg", + centered, + className, +}: Props) { + return ( +
    +

    {kicker}

    +

    + {title} +

    + {lead && ( +

    + {lead} +

    + )} +
    + ); +} diff --git a/components/ui/Spinner.tsx b/components/ui/Spinner.tsx new file mode 100644 index 0000000..9d7fcd7 --- /dev/null +++ b/components/ui/Spinner.tsx @@ -0,0 +1,10 @@ +/** Three staggered dots, the system's only loading indicator. */ +export default function Spinner({ label = "Loading" }: { label?: string }) { + return ( +
    + + + +
    + ); +} diff --git a/components/ui/StatusLight.tsx b/components/ui/StatusLight.tsx new file mode 100644 index 0000000..dc1a7f3 --- /dev/null +++ b/components/ui/StatusLight.tsx @@ -0,0 +1,19 @@ +import type { Tone } from "./tones"; +import { toneSolidBg } from "./tones"; + +type Props = { + tone?: Tone; + /** Blinking draws the eye, reserve it for live/important indicators. */ + blink?: boolean; + className?: string; +}; + +/** Tiny indicator LED used in panel titles and loading states. */ +export default function StatusLight({ tone = "success", blink = false, className = "" }: Props) { + return ( + + ); +} diff --git a/components/ui/TextField.tsx b/components/ui/TextField.tsx new file mode 100644 index 0000000..b71cb64 --- /dev/null +++ b/components/ui/TextField.tsx @@ -0,0 +1,46 @@ +"use client"; + +import classNames from "classnames"; +import { useId } from "react"; + +type Props = React.InputHTMLAttributes & { + label: string; + /** Neutral guidance shown under the field. Replaced by `error` when set. */ + helper?: React.ReactNode; + /** Validation message; paints the field red. */ + error?: React.ReactNode; +}; + +/** Form input: small label on top, rounded field, helper or error below. */ +export default function TextField({ label, helper, error, id, className, ...rest }: Props) { + const autoId = useId(); + const fieldId = id ?? autoId; + const describedBy = error || helper ? `${fieldId}-note` : undefined; + + return ( +
    + + + {(error || helper) && ( +

    + {error ?? helper} +

    + )} +
    + ); +} diff --git a/components/ui/TextLink.tsx b/components/ui/TextLink.tsx new file mode 100644 index 0000000..c0f45aa --- /dev/null +++ b/components/ui/TextLink.tsx @@ -0,0 +1,29 @@ +import Link from "next/link"; +import { GoLinkExternal } from "react-icons/go"; + +type Props = { + href: string; + children: React.ReactNode; + external?: boolean; + className?: string; +}; + +/** Inline text link. Light blue, underlined on hover; external ones get the icon. */ +export default function TextLink({ href, children, external, className = "" }: Props) { + const classes = `inline-flex items-center gap-1 text-accent transition-colors hover:text-crew hover:underline ${className}`; + + if (external) { + return ( + + {children} + + + ); + } + + return ( + + {children} + + ); +} diff --git a/components/ui/buttonStyles.ts b/components/ui/buttonStyles.ts new file mode 100644 index 0000000..be6b78b --- /dev/null +++ b/components/ui/buttonStyles.ts @@ -0,0 +1,32 @@ +import classNames from "classnames"; + +export type ButtonVariant = "primary" | "secondary" | "ghost" | "danger"; +export type ButtonSize = "sm" | "md" | "lg"; + +/* Shared look between Button and LinkButton. Solid launcher-style controls: + * teal for the main action, steel blue for everything else. */ +export function buttonClasses( + variant: ButtonVariant = "primary", + size: ButtonSize = "md", + className?: string, +) { + return classNames( + "inline-flex items-center justify-center gap-2 select-none rounded-md", + "font-display font-semibold uppercase tracking-label", + "transition-colors duration-150 focus:outline-none focus-visible:ring-2", + "focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-void", + "disabled:opacity-40 disabled:pointer-events-none", + { + "px-3 py-1.5 text-xs": size === "sm", + "px-5 py-2.5 text-sm": size === "md", + "px-7 py-3.5 text-base": size === "lg", + }, + { + "bg-primary text-white hover:bg-primary-hot": variant === "primary", + "bg-steel text-crew hover:bg-seam-bright": variant === "secondary", + "text-dim hover:text-crew": variant === "ghost", + "bg-danger-fill text-white hover:bg-danger-fill/80": variant === "danger", + }, + className, + ); +} diff --git a/components/ui/tones.ts b/components/ui/tones.ts new file mode 100644 index 0000000..4489071 --- /dev/null +++ b/components/ui/tones.ts @@ -0,0 +1,42 @@ +/* + * Accent tones: the one accent scale of the design system, built on the + * classic StationHub palette. Components accept a `tone` and resolve it + * here so colour usage stays consistent everywhere. + */ +export type Tone = "primary" | "info" | "success" | "warning" | "danger" | "neutral"; + +export const toneText: Record = { + primary: "text-accent", + info: "text-info", + success: "text-success", + warning: "text-warning", + danger: "text-danger", + neutral: "text-dim", +}; + +export const toneBorder: Record = { + primary: "border-accent/40", + info: "border-info/40", + success: "border-success/40", + warning: "border-warning/40", + danger: "border-danger/40", + neutral: "border-seam-bright", +}; + +export const toneBg: Record = { + primary: "bg-primary/15", + info: "bg-info/10", + success: "bg-success/10", + warning: "bg-warning/10", + danger: "bg-danger/10", + neutral: "bg-raised/50", +}; + +export const toneSolidBg: Record = { + primary: "bg-accent", + info: "bg-info", + success: "bg-success", + warning: "bg-warning", + danger: "bg-danger", + neutral: "bg-seam-bright", +}; diff --git a/context/AuthorizerContextProvider.tsx b/context/AuthorizerContextProvider.tsx index 6001a3e..dc2e65d 100644 --- a/context/AuthorizerContextProvider.tsx +++ b/context/AuthorizerContextProvider.tsx @@ -1,9 +1,9 @@ -"use client" +"use client"; -import {createContext} from "react"; -import {AuthContext} from "../lib/auth/types"; +import { createContext } from "react"; +import { AuthContext } from "../lib/auth/types"; import LayoutChildren from "../types/layoutChildren"; -import {useAuth} from "../lib/auth/useAuth"; +import { useAuth } from "../lib/auth/useAuth"; export const AuthorizerContext = createContext({ state: { @@ -11,18 +11,20 @@ export const AuthorizerContext = createContext({ authContext: undefined, error: undefined, }, - credentialsLogin: async (email: string, password: string) => {throw new Error("Credentials Login was not served.")}, - logout: async () => {throw new Error("Logout was not served.")} -}) + credentialsLogin: async (_email: string, _password: string) => { + throw new Error("Credentials Login was not served."); + }, + logout: async () => { + throw new Error("Logout was not served."); + }, +}); const AuthorizerContextProvider = (props: LayoutChildren) => { const context: AuthContext = useAuth(); return ( - - {props.children} - - ) -} + {props.children} + ); +}; -export default AuthorizerContextProvider; \ No newline at end of file +export default AuthorizerContextProvider; diff --git a/context/ledger/LedgerApiProvider.tsx b/context/ledger/LedgerApiProvider.tsx index ef4ffba..48b1126 100644 --- a/context/ledger/LedgerApiProvider.tsx +++ b/context/ledger/LedgerApiProvider.tsx @@ -1,10 +1,8 @@ -'use client'; +"use client"; -import React, { - createContext, useContext, useEffect, useState, ReactNode, -} from 'react'; -import { LedgerData, LedgerResponse } from '../../types/ledger/ledgerResponse'; -import fetchOfType from '../../utils/fetchOfType'; +import { createContext, useContext, useEffect, useState, ReactNode } from "react"; +import { LedgerData, LedgerResponse } from "../../types/ledger/ledgerResponse"; +import fetchOfType from "../../utils/fetchOfType"; export interface LedgerApiResults { goToNextPage: () => void; @@ -13,6 +11,8 @@ export interface LedgerApiResults { hasPreviousPage: boolean; results: LedgerData[]; currentBalance: string; + /** True until the first page has arrived; drives the loading skeletons. */ + isLoading: boolean; } const LedgerApiContext = createContext(undefined); @@ -43,6 +43,8 @@ export const LedgerApiProvider = ({ children }: { children: ReactNode }) => { }; void fetchData(); + // isInitialLoad is intentionally read once; adding it would re-fetch on every load toggle. + // oxlint-disable-next-line react/exhaustive-deps }, [pageUrl]); return ( @@ -54,6 +56,7 @@ export const LedgerApiProvider = ({ children }: { children: ReactNode }) => { hasPreviousPage, results: fetchResult?.results ?? [], currentBalance, + isLoading: isInitialLoad, }} > {children} @@ -63,6 +66,6 @@ export const LedgerApiProvider = ({ children }: { children: ReactNode }) => { export const useLedgerApiProvider = (): LedgerApiResults => { const ctx = useContext(LedgerApiContext); - if (!ctx) throw new Error('useLedger must be used within a LedgerProvider'); + if (!ctx) throw new Error("useLedger must be used within a LedgerProvider"); return ctx; }; diff --git a/context/ledger/LedgerDataTableProvider.tsx b/context/ledger/LedgerDataTableProvider.tsx index d964654..d0f0557 100644 --- a/context/ledger/LedgerDataTableProvider.tsx +++ b/context/ledger/LedgerDataTableProvider.tsx @@ -1,95 +1,92 @@ -'use client'; - -import {createContext, ReactNode, useContext} from "react"; -import {DataTableProps} from "../../components/organisms/DataTable"; -import {LedgerData} from "../../types/ledger/ledgerResponse"; -import {useLedgerApiProvider} from "./LedgerApiProvider"; -import {GoInfo, GoLinkExternal} from "react-icons/go"; +"use client"; +import { createContext, ReactNode, useContext } from "react"; +import { GoInfo } from "react-icons/go"; +import { DataTableProps } from "../../components/ui/DataTable"; +import TextLink from "../../components/ui/TextLink"; +import { LedgerData } from "../../types/ledger/ledgerResponse"; +import { useLedgerApiProvider } from "./LedgerApiProvider"; const LedgerTableContext = createContext | undefined>(undefined); export const LedgerTableProvider = ({ children }: { children: ReactNode }) => { - const {results} = useLedgerApiProvider(); + const { results } = useLedgerApiProvider(); const processDate = (date: string): ReactNode => { - return Intl.DateTimeFormat('en-GB', { - day: '2-digit', - month: 'long', - year: 'numeric', + return Intl.DateTimeFormat("en-GB", { + day: "2-digit", + month: "long", + year: "numeric", }).format(new Date(date)); - } + }; const processDescription = (description: string, notes: string): ReactNode => { return ( -
    - - {description} - - {notes && ( - - )} +
    + {description} + {notes && }
    - ); - } + }; - const processAmount = (amount: string, type: 'income' | 'expense'): ReactNode => { - const usd = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', + const processAmount = (amount: string, type: "income" | "expense"): ReactNode => { + const usd = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 2, }); - const numeric = Number.parseFloat(amount); - const formatted = usd.format(numeric); - - const colour = type === 'income' ? 'text-green-500' : 'text-red-500'; - return {formatted}; - } + const formatted = usd.format(Number.parseFloat(amount)); + const colour = type === "income" ? "text-success" : "text-danger"; + return ( + + {type === "income" ? "+" : "−"} + {formatted} + + ); + }; const processLink = (link: string): ReactNode => { - if (link) { - return - } else { - return <> - } - } + if (!link) return null; + return ( + + View + + ); + }; const data: DataTableProps = { columns: [ { header: "Date", - cell: row => processDate(row.created_at) + cell: (row) => processDate(row.created_at), }, { header: "Description", - cell: row => processDescription(row.description, row.notes || "") + cell: (row) => processDescription(row.description, row.notes || ""), }, { header: "Amount (USD)", - cell: row => processAmount(row.amount_usd, row.type) + cell: (row) => processAmount(row.amount_usd, row.type), + align: "right", }, { header: "Link", - cell: row => processLink(row.link || "") - } + cell: (row) => processLink(row.link || ""), + align: "right", + }, ], - data: results + data: results, }; - return ( - - {children} - - ); -} + return {children}; +}; export const useLedgerTableContext = () => { const context = useContext(LedgerTableContext); if (!context) { - throw new Error('useLedgerTableContext must be used within a LedgerTableProvider'); + throw new Error("useLedgerTableContext must be used within a LedgerTableProvider"); } return context; -} \ No newline at end of file +}; diff --git a/context/providers.tsx b/context/providers.tsx index 5df7105..1d17e84 100644 --- a/context/providers.tsx +++ b/context/providers.tsx @@ -1,14 +1,8 @@ import LayoutChildren from "../types/layoutChildren"; import AuthorizerContextProvider from "./AuthorizerContextProvider"; - const Providers = (props: LayoutChildren) => { + return {props.children}; +}; - return ( - - {props.children} - - ) -} - -export default Providers; \ No newline at end of file +export default Providers; diff --git a/cypress.config.ts b/cypress.config.ts index 23b5d04..85309a6 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,17 +1,16 @@ import { defineConfig } from "cypress"; export default defineConfig({ - e2e: { - baseUrl: 'http://localhost:3000', - setupNodeEvents(on, config) { - // implement node event listeners here + e2e: { + baseUrl: "http://localhost:3000", + setupNodeEvents(_on, _config) {}, }, - }, - component: { - devServer: { - framework: "next", - bundler: "webpack", + component: { + devServer: { + framework: "next", + bundler: "webpack", + }, + specPattern: "cypress/component/**/*.cy.{ts,tsx}", }, - }, }); diff --git a/cypress/component/CopyCommand.cy.tsx b/cypress/component/CopyCommand.cy.tsx new file mode 100644 index 0000000..24b8d78 --- /dev/null +++ b/cypress/component/CopyCommand.cy.tsx @@ -0,0 +1,17 @@ +import CopyCommand from "../../components/ui/CopyCommand"; + +describe("", () => { + it("shows the command and copies it to the clipboard", () => { + cy.mount(); + + cy.contains("code", "yay -S pudu-launcher-git").should("be.visible"); + + cy.window().then((win) => { + cy.stub(win.navigator.clipboard, "writeText").as("writeText").resolves(); + }); + + cy.get('button[aria-label="Copy install command"]').click(); + cy.get("@writeText").should("have.been.calledOnceWith", "yay -S pudu-launcher-git"); + cy.get('button[aria-label="Command copied"]').should("exist"); + }); +}); diff --git a/cypress/component/DownloadExperience.cy.tsx b/cypress/component/DownloadExperience.cy.tsx new file mode 100644 index 0000000..ffb3409 --- /dev/null +++ b/cypress/component/DownloadExperience.cy.tsx @@ -0,0 +1,108 @@ +import DownloadExperience from "../../components/download/DownloadExperience"; +import GithubReleaseResponse from "../../types/githubReleaseResponse"; +import mapLauncherRelease from "../../utils/launcherRelease"; +import rawRelease from "../../utils/__fixtures__/puduRelease.json"; + +const FALLBACK_URL = "https://github.com/unitystation/PuduLauncher/releases/latest"; +const release = mapLauncherRelease(rawRelease as unknown as GithubReleaseResponse); + +describe("", () => { + it("falls back to the GitHub releases page when no release is available", () => { + cy.mount(); + + cy.contains("fetch the latest release").should("be.visible"); + cy.contains("a", "All downloads on GitHub").should("have.attr", "href", FALLBACK_URL); + cy.get('[role="tablist"]').should("not.exist"); + }); + + it("shows the release version and notes link", () => { + cy.mount( + , + ); + + cy.contains("Pudu Launcher - v2.0.0").should("be.visible"); + cy.contains("a", "Release notes").should( + "have.attr", + "href", + "https://github.com/unitystation/PuduLauncher/releases/tag/v2.0.0", + ); + }); + + it("preselects the server-detected OS and marks it as detected", () => { + cy.mount( + , + ); + + cy.contains('[role="tab"]', "Windows") + .should("have.attr", "aria-selected", "true") + .and("contain.text", "Detected"); + + cy.contains("a", "Installer (.exe)").should( + "have.attr", + "href", + "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/windows-pudu-launcher-setup2.0.0-x64.exe", + ); + cy.contains("18 MB").should("be.visible"); + cy.contains("a", "Portable (.zip) · 20 MB").should("exist"); + }); + + it("switches to the macOS build with the Intel note", () => { + cy.mount( + , + ); + + cy.contains('[role="tab"]', "macOS").click(); + cy.contains("a", "Apple Silicon (.dmg)").should( + "have.attr", + "href", + "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/darwin-pudu-launcher2.0.0-aarch64.dmg", + ); + cy.contains("12 MB").should("be.visible"); + cy.contains("This build is for Apple Silicon (M-series) Macs").should("be.visible"); + }); + + it("lists every Linux package with the AUR command", () => { + cy.mount( + , + ); + + cy.contains("Choose your package").should("be.visible"); + cy.contains("a", "Debian / Ubuntu (.deb) · 15 MB").should("exist"); + cy.contains("a", "Fedora / SUSE (.rpm) · 16 MB").should("exist"); + cy.contains("code", "yay -S pudu-launcher-git").should("exist"); + cy.contains("a", "View on AUR").should( + "have.attr", + "href", + "https://aur.archlinux.org/packages/pudu-launcher-git", + ); + }); + + it("recommends the package matching the detected Linux family", () => { + cy.mount( + , + ); + + cy.contains("a", "Debian / Ubuntu (.deb) · 15 MB") + .parent() + .contains("Recommended") + .should("exist"); + }); + + it("recommends the AUR package for Arch-family systems", () => { + cy.mount( + , + ); + + cy.contains("Arch Linux (AUR)").parent().contains("Recommended").should("exist"); + }); +}); diff --git a/cypress/component/Dropdown.cy.tsx b/cypress/component/Dropdown.cy.tsx new file mode 100644 index 0000000..00f4d5c --- /dev/null +++ b/cypress/component/Dropdown.cy.tsx @@ -0,0 +1,50 @@ +import Dropdown from "../../components/ui/Dropdown"; + +describe("", () => { + it("opens on click and renders link items", () => { + cy.mount( + , + ); + + cy.contains("button", "Account").should("have.attr", "aria-expanded", "false"); + cy.get('[role="menu"]').should("have.class", "pointer-events-none"); + + cy.contains("button", "Account").click(); + cy.contains("button", "Account").should("have.attr", "aria-expanded", "true"); + cy.get('[role="menu"]').should("not.have.class", "pointer-events-none"); + cy.contains('[role="menuitem"]', "Login / Register").should("have.attr", "href", "/login"); + }); + + it("runs onClick items and closes the menu", () => { + const onSelect = cy.stub().as("onSelect"); + cy.mount(); + + cy.contains("button", "Actions").click(); + cy.contains('[role="menuitem"]', "Do it").click(); + + cy.get("@onSelect").should("have.been.calledOnce"); + cy.contains("button", "Actions").should("have.attr", "aria-expanded", "false"); + }); + + it("closes on Escape", () => { + cy.mount(); + + cy.contains("button", "Menu").click(); + cy.contains("button", "Menu").should("have.attr", "aria-expanded", "true"); + cy.get("body").type("{esc}"); + cy.contains("button", "Menu").should("have.attr", "aria-expanded", "false"); + }); + + it("closes when clicking outside", () => { + cy.mount( +
    + +

    outside

    +
    , + ); + + cy.contains("button", "Menu").click(); + cy.contains("p", "outside").trigger("mousedown"); + cy.contains("button", "Menu").should("have.attr", "aria-expanded", "false"); + }); +}); diff --git a/cypress/component/Pagination.cy.tsx b/cypress/component/Pagination.cy.tsx new file mode 100644 index 0000000..1f1455e --- /dev/null +++ b/cypress/component/Pagination.cy.tsx @@ -0,0 +1,37 @@ +import Pagination from "../../components/ui/Pagination"; + +describe("", () => { + it("disables buttons at the edges", () => { + cy.mount( + , + ); + + cy.contains("button", "Prev").should("be.disabled"); + cy.contains("button", "Next").should("be.disabled"); + }); + + it("fires callbacks when pages are available", () => { + const onPrevious = cy.stub().as("onPrevious"); + const onNext = cy.stub().as("onNext"); + cy.mount( + , + ); + + cy.contains("Page 2").should("be.visible"); + cy.contains("button", "Prev").click(); + cy.contains("button", "Next").click(); + cy.get("@onPrevious").should("have.been.calledOnce"); + cy.get("@onNext").should("have.been.calledOnce"); + }); +}); diff --git a/cypress/component/dummy.cy.ts b/cypress/component/dummy.cy.ts deleted file mode 100644 index d4a38f4..0000000 --- a/cypress/component/dummy.cy.ts +++ /dev/null @@ -1,7 +0,0 @@ -describe("Just a dummy test", () => { - it("Should pass", () => { - expect(true).to.be.true; - }) -}); - -export {}; diff --git a/cypress/component/utils.cy.ts b/cypress/component/utils.cy.ts new file mode 100644 index 0000000..ca39a5b --- /dev/null +++ b/cypress/component/utils.cy.ts @@ -0,0 +1,121 @@ +import { detectPlatform, recommendedLinuxFormat } from "../../utils/detectPlatform"; +import mapLauncherRelease from "../../utils/launcherRelease"; +import { postTypeLabel, postTypeTone } from "../../utils/postMeta"; +import { toAgoTime } from "../../utils/timeUtils"; +import GithubReleaseResponse from "../../types/githubReleaseResponse"; +import rawRelease from "../../utils/__fixtures__/puduRelease.json"; + +const WINDOWS_UA = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"; +const MAC_UA = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15"; +const UBUNTU_UA = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0"; +const FEDORA_UA = "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0"; +const GENERIC_LINUX_UA = + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"; + +describe("detectPlatform", () => { + it("detects Windows", () => { + expect(detectPlatform(WINDOWS_UA)).to.deep.equal({ os: "win" }); + }); + + it("detects macOS", () => { + expect(detectPlatform(MAC_UA)).to.deep.equal({ os: "mac" }); + }); + + it("detects Debian-family Linux", () => { + expect(detectPlatform(UBUNTU_UA)).to.deep.equal({ os: "linux", linuxFamily: "debian" }); + }); + + it("detects RPM-family Linux", () => { + expect(detectPlatform(FEDORA_UA)).to.deep.equal({ os: "linux", linuxFamily: "rpm" }); + }); + + it("detects generic Linux without a family", () => { + expect(detectPlatform(GENERIC_LINUX_UA)).to.deep.equal({ + os: "linux", + linuxFamily: undefined, + }); + }); + + it("returns unknown for unrecognised agents", () => { + expect(detectPlatform("curl/8.0.1").os).to.equal("unknown"); + }); +}); + +describe("recommendedLinuxFormat", () => { + it("maps each family to its package format", () => { + expect(recommendedLinuxFormat("arch")).to.equal("aur"); + expect(recommendedLinuxFormat("debian")).to.equal("deb"); + expect(recommendedLinuxFormat("rpm")).to.equal("rpm"); + expect(recommendedLinuxFormat(undefined)).to.equal(undefined); + }); +}); + +describe("mapLauncherRelease", () => { + const release = mapLauncherRelease(rawRelease as unknown as GithubReleaseResponse); + + it("maps the version and releases page", () => { + expect(release.version).to.equal("v2.0.0"); + expect(release.releasesPageUrl).to.equal( + "https://github.com/unitystation/PuduLauncher/releases/tag/v2.0.0", + ); + }); + + it("picks the Windows installer, not its .sig file", () => { + const { recommended, alternatives } = release.platforms.windows; + expect(recommended?.url).to.match(/setup2\.0\.0-x64\.exe$/); + expect(recommended?.label).to.equal("Installer (.exe)"); + expect(recommended?.sizeMB).to.equal(18); + expect(alternatives).to.have.length(1); + expect(alternatives[0].url).to.match(/portable-x64\.zip$/); + expect(alternatives[0].sizeMB).to.equal(20); + }); + + it("picks the macOS dmg over the tar.gz", () => { + const { recommended, note } = release.platforms.mac; + expect(recommended?.url).to.match(/\.dmg$/); + expect(recommended?.sizeMB).to.equal(12); + expect(note).to.contain("Apple Silicon"); + }); + + it("maps the Linux packages and AUR command", () => { + const { deb, rpm, aur } = release.platforms.linux; + expect(deb?.url).to.match(/\.deb$/); + expect(deb?.sizeMB).to.equal(15); + expect(rpm?.url).to.match(/\.rpm$/); + expect(rpm?.sizeMB).to.equal(16); + expect(aur.cmd).to.equal("yay -S pudu-launcher-git"); + expect(aur.pageUrl).to.equal("https://aur.archlinux.org/packages/pudu-launcher-git"); + }); +}); + +describe("postMeta", () => { + it("maps known post types to labels and tones", () => { + expect(postTypeLabel("announcement")).to.equal("Announcement"); + expect(postTypeLabel("weekly")).to.equal("Progress Update"); + expect(postTypeLabel("community")).to.equal("Community Highlight"); + expect(postTypeTone("weekly")).to.equal("primary"); + }); + + it("passes unknown types through with a neutral tone", () => { + expect(postTypeLabel("mystery")).to.equal("mystery"); + expect(postTypeTone("mystery")).to.equal("neutral"); + }); +}); + +describe("toAgoTime", () => { + const secondsAgo = (s: number) => new Date(Date.now() - s * 1000); + + it("formats each magnitude with correct pluralisation", () => { + expect(toAgoTime(secondsAgo(0))).to.equal("just now"); + expect(toAgoTime(secondsAgo(5))).to.equal("5 seconds ago"); + expect(toAgoTime(secondsAgo(90))).to.equal("1 minute ago"); + expect(toAgoTime(secondsAgo(2 * 3600))).to.equal("2 hours ago"); + expect(toAgoTime(secondsAgo(3 * 86400))).to.equal("3 days ago"); + expect(toAgoTime(secondsAgo(65 * 86400))).to.equal("2 months ago"); + expect(toAgoTime(secondsAgo(400 * 86400))).to.equal("1 year ago"); + }); +}); + +export {}; diff --git a/cypress/e2e/account.cy.ts b/cypress/e2e/account.cy.ts new file mode 100644 index 0000000..92ad64f --- /dev/null +++ b/cypress/e2e/account.cy.ts @@ -0,0 +1,75 @@ +describe("Account pages", () => { + describe("login", () => { + beforeEach(() => { + cy.visit("/login"); + }); + + it("renders the login form", () => { + cy.contains("h1", "Login").should("be.visible"); + cy.contains("label", "Your email").should("be.visible"); + cy.contains("label", "Your password").should("be.visible"); + cy.contains("button", "Log in").should("be.visible"); + }); + + it("links to register, reset password and resend confirmation", () => { + cy.contains("a", "Don't have an account?").should("have.attr", "href", "/register"); + cy.contains("a", "Forgot your password?").should( + "have.attr", + "href", + "/reset-password", + ); + cy.contains("a", "Haven't received confirmation email yet?").should( + "have.attr", + "href", + "/resend-confirm-email", + ); + }); + + it("validates the email client-side before calling the server", () => { + // "test@localhost" passes native input validation but fails zod's email rule, + // so the error must come from the client-side schema, not the API. + cy.get('input[type="email"]').type("test@localhost"); + cy.get("#password").type("longenoughpassword"); + cy.contains("button", "Log in").click(); + + cy.contains("Invalid email").should("be.visible"); + }); + + it("validates the password length client-side", () => { + cy.get('input[type="email"]').type("valid@example.com"); + cy.get("#password").type("123"); + cy.contains("button", "Log in").click(); + + cy.contains("String must contain at least 6 character(s)").should("be.visible"); + }); + }); + + describe("register", () => { + it("renders every registration field", () => { + cy.visit("/register"); + cy.contains("h1", "Create a new account").should("be.visible"); + + cy.get("input#email").should("have.attr", "required"); + cy.get("input#unique_identifier").should("have.attr", "required"); + cy.get("input#username").should("have.attr", "required"); + cy.get("input#password").should("have.attr", "required"); + cy.get("input#password2").should("have.attr", "required"); + + cy.contains("This identifier is permanent and cannot be changed later").should("exist"); + cy.contains("button", "Register").should("be.visible"); + cy.contains("a", "Already have an account?").should("have.attr", "href", "/login"); + }); + }); + + describe("reset password", () => { + it("renders the reset request form", () => { + cy.visit("/reset-password"); + cy.contains("h1", "Reset password").should("be.visible"); + cy.get("input#email").should("have.attr", "required"); + cy.contains("button", "Submit").should("be.visible"); + cy.contains("a", "Back to login").should("have.attr", "href", "/login"); + }); + }); +}); + +export {}; diff --git a/cypress/e2e/blog.cy.ts b/cypress/e2e/blog.cy.ts new file mode 100644 index 0000000..32d8280 --- /dev/null +++ b/cypress/e2e/blog.cy.ts @@ -0,0 +1,43 @@ +describe("Blog feed", () => { + beforeEach(() => { + cy.intercept("GET", /changelog\.unitystation\.org\/posts\/\?page=1$/, { + fixture: "blogPosts-page1.json", + }).as("postsPage1"); + cy.intercept("GET", /changelog\.unitystation\.org\/posts\/\?page=2$/, { + fixture: "blogPosts-page2.json", + }).as("postsPage2"); + }); + + it("renders the first page of posts as cards", () => { + cy.visit("/blog"); + cy.wait("@postsPage1"); + + cy.contains("h2", "Station reactor now explodes properly") + .closest("a") + .should("have.attr", "href", "/blog/reactor-explodes-properly"); + + cy.contains("by TestAuthor").should("exist"); + cy.contains("The reactor finally detonates with the dignity it deserves.").should("exist"); + }); + + it("maps post types to their display labels", () => { + cy.visit("/blog"); + cy.wait("@postsPage1"); + + cy.contains("Announcement").should("exist"); + cy.contains("Progress Update").should("exist"); + cy.contains("Community Highlight").should("exist"); + }); + + it("loads the next page when scrolling to the bottom", () => { + cy.visit("/blog"); + cy.wait("@postsPage1"); + cy.contains("h2", "Station reactor now explodes properly").should("be.visible"); + + cy.scrollTo("bottom"); + cy.wait("@postsPage2"); + cy.contains("h2", "Archived post from page two").should("exist"); + }); +}); + +export {}; diff --git a/cypress/e2e/changelog.cy.ts b/cypress/e2e/changelog.cy.ts new file mode 100644 index 0000000..e0ae567 --- /dev/null +++ b/cypress/e2e/changelog.cy.ts @@ -0,0 +1,60 @@ +describe("Changelog", () => { + beforeEach(() => { + cy.intercept("GET", /changelog\.unitystation\.org\/all-changes/, { + fixture: "changelog-page1.json", + }).as("changelog"); + cy.visit("/changelog"); + cy.wait("@changelog"); + }); + + it("renders a panel per build with its changes", () => { + cy.contains("Build 9999").should("be.visible"); + cy.contains("Added a bikehorn that honks in stereo").should("be.visible"); + cy.contains("Fixed atmos leaking through solid walls").should("be.visible"); + }); + + it("credits the author and links the pull request", () => { + cy.contains("a", "coder1").should("have.attr", "href", "https://github.com/coder1"); + cy.contains("a", "PR #4321").should( + "have.attr", + "href", + "https://github.com/unitystation/unitystation/pull/4321", + ); + }); + + it("shows an empty message for builds without changes", () => { + cy.contains("Build 9998").should("exist"); + cy.contains("This build has no registered changes").should("exist"); + }); + + it("offers build downloads per platform from the CDN", () => { + // The first panel footer belongs to build 9999; the navbar Account + // dropdown also has a [role="menu"], so scope to the opened one. + cy.hydratedClick( + 'footer button[aria-haspopup="menu"]', + 'footer button[aria-haspopup="menu"][aria-expanded="true"]', + ); + cy.get('footer button[aria-haspopup="menu"][aria-expanded="true"]') + .parent() + .find('[role="menu"]') + .within(() => { + cy.contains('[role="menuitem"]', "Windows").should( + "have.attr", + "href", + "https://cdn.unitystation.org/UnityStationDevelop/StandaloneWindows64/9999.zip", + ); + cy.contains('[role="menuitem"]', "macOS").should( + "have.attr", + "href", + "https://cdn.unitystation.org/UnityStationDevelop/StandaloneOSX/9999.zip", + ); + cy.contains('[role="menuitem"]', "Linux server").should( + "have.attr", + "href", + "https://cdn.unitystation.org/UnityStationDevelop/linuxserver/9999.zip", + ); + }); + }); +}); + +export {}; diff --git a/cypress/e2e/download.cy.ts b/cypress/e2e/download.cy.ts new file mode 100644 index 0000000..98577fa --- /dev/null +++ b/cypress/e2e/download.cy.ts @@ -0,0 +1,55 @@ +/** + * The release is fetched on the server from the GitHub API, so it can't be + * stubbed from the browser. This spec smoke-tests the page in both states it + * can legitimately render in; the full download UI logic is covered by the + * DownloadExperience component tests. + */ +describe("Download page", () => { + beforeEach(() => { + cy.visit("/download"); + }); + + it("renders the page header and source link", () => { + cy.contains("Download Pudu Launcher").should("be.visible"); + cy.contains("a", "View the launcher source on GitHub").should( + "have.attr", + "href", + "https://github.com/unitystation/PuduLauncher", + ); + }); + + it("shows either the release panel or the GitHub fallback", () => { + cy.get("body").then(($body) => { + if ($body.find('[role="tablist"][aria-label="Operating system"]').length > 0) { + // Release fetched: OS tabs are present and switchable. + cy.get('[role="tab"]').should("have.length", 3); + cy.hydratedClick( + '[role="tab"]:contains("macOS")', + '[role="tab"][aria-selected="true"]:contains("macOS")', + ); + cy.contains("Apple Silicon").should("exist"); + cy.hydratedClick( + '[role="tab"]:contains("Linux")', + '[role="tab"][aria-selected="true"]:contains("Linux")', + ); + cy.contains("Choose your package").should("be.visible"); + cy.contains("code", "yay -S pudu-launcher-git").should("exist"); + cy.contains("a", "View on AUR").should( + "have.attr", + "href", + "https://aur.archlinux.org/packages/pudu-launcher-git", + ); + } else { + // GitHub API unavailable: the page must still offer a way to download. + cy.contains("fetch the latest release").should("be.visible"); + cy.contains("a", "All downloads on GitHub").should( + "have.attr", + "href", + "https://github.com/unitystation/PuduLauncher/releases/latest", + ); + } + }); + }); +}); + +export {}; diff --git a/cypress/e2e/home.cy.ts b/cypress/e2e/home.cy.ts index 2ca9589..75ddac2 100644 --- a/cypress/e2e/home.cy.ts +++ b/cypress/e2e/home.cy.ts @@ -1,7 +1,62 @@ -describe("Home page test", () => { - it("Should visit home page", () => { +describe("Home page", () => { + beforeEach(() => { cy.visit("/"); }); -}) + + it("renders the hero with title and tagline", () => { + cy.contains("h1", "Welcome to").should("be.visible"); + cy.contains("h1", "Unitystation!").should("be.visible"); + cy.contains("Free and open-source remake of the cult classic Space Station 13").should( + "be.visible", + ); + }); + + it("has a download CTA pointing at /download", () => { + cy.contains("h1", "Unitystation!") + .closest("section") + .find('a[href="/download"]') + .should("be.visible") + .and("contain.text", "Download"); + }); + + it("links to the community platforms", () => { + cy.get('[role="group"][aria-label="Community links"]').within(() => { + cy.contains("a", "GitHub") + .should("have.attr", "href", "https://github.com/unitystation/unitystation") + .and("have.attr", "target", "_blank"); + cy.contains("a", "Discord").should( + "have.attr", + "href", + "https://discord.com/invite/tFcTpBp", + ); + cy.contains("a", "Patreon").should( + "have.attr", + "href", + "https://www.patreon.com/unitystation", + ); + }); + }); + + it("lets the user pick a hero screenshot", () => { + cy.contains("p", "01 / 10").should("exist"); + cy.hydratedClick( + 'button[aria-label="Show screenshot 3"]', + 'button[aria-label="Show screenshot 3"][aria-current="true"]', + ); + cy.contains("p", "03 / 10").should("exist"); + }); + + it("renders the about and community sections", () => { + cy.contains("What is Unitystation?").should("exist"); + cy.contains("Pick a job and keep the station running.").should("exist"); + cy.contains("h2", "Join the community playtest!").scrollIntoView().should("be.visible"); + cy.contains("a", "Join the Discord").should( + "have.attr", + "href", + "https://discord.com/invite/tFcTpBp", + ); + cy.contains("a", "Get the game").should("have.attr", "href", "/download"); + }); +}); export {}; diff --git a/cypress/e2e/ledger.cy.ts b/cypress/e2e/ledger.cy.ts new file mode 100644 index 0000000..0bacc69 --- /dev/null +++ b/cypress/e2e/ledger.cy.ts @@ -0,0 +1,52 @@ +describe("Funding ledger", () => { + beforeEach(() => { + cy.intercept("GET", /ledger\.unitystation\.org\/movements\/$/, { + fixture: "ledger-page1.json", + }).as("ledgerPage1"); + cy.intercept("GET", /ledger\.unitystation\.org\/movements\/\?page=2$/, { + fixture: "ledger-page2.json", + }).as("ledgerPage2"); + cy.visit("/ledger"); + cy.wait("@ledgerPage1"); + }); + + it("shows the current balance from the latest movement", () => { + // The balance counts up from $0.00; wait for the final formatted figure. + cy.contains("$1,234.56").should("be.visible"); + }); + + it("renders movements with formatted date and signed amount", () => { + cy.contains("td", "15 June 2026").should("exist"); + cy.contains("Patreon payout June").should("exist"); + cy.contains("+$500.00").should("exist"); + cy.contains("Server hosting").should("exist"); + cy.contains("−$120.00").should("exist"); + cy.contains("a", "View").should("have.attr", "href", "https://example.com/receipt/4"); + }); + + it("paginates forward and back", () => { + cy.get('nav[aria-label="Pagination"]').within(() => { + cy.contains("button", "Prev").should("be.disabled"); + cy.contains("button", "Next").should("be.enabled").click(); + }); + + cy.wait("@ledgerPage2"); + cy.contains("PayPal donation").should("exist"); + cy.contains("Domain renewal").should("exist"); + + cy.get('nav[aria-label="Pagination"]').within(() => { + cy.contains("button", "Next").should("be.disabled"); + cy.contains("button", "Prev").should("be.enabled").click(); + }); + + cy.contains("Patreon payout June").should("exist"); + }); + + it("keeps the balance pinned to the initial load while paginating", () => { + cy.get('nav[aria-label="Pagination"]').contains("button", "Next").click(); + cy.wait("@ledgerPage2"); + cy.contains("$1,234.56").should("be.visible"); + }); +}); + +export {}; diff --git a/cypress/e2e/navigation.cy.ts b/cypress/e2e/navigation.cy.ts new file mode 100644 index 0000000..20b969d --- /dev/null +++ b/cypress/e2e/navigation.cy.ts @@ -0,0 +1,88 @@ +describe("Site navigation", () => { + describe("desktop", () => { + beforeEach(() => { + cy.viewport("macbook-15"); + cy.visit("/"); + }); + + it("shows all main nav links", () => { + cy.get('nav[aria-label="Main"]').within(() => { + cy.contains("a", "Home").should("have.attr", "href", "/"); + cy.contains("a", "Download").should("have.attr", "href", "/download"); + cy.contains("a", "Blog").should("have.attr", "href", "/blog"); + cy.contains("a", "Changelog").should("have.attr", "href", "/changelog"); + cy.contains("a", "Ledger").should("have.attr", "href", "/ledger"); + }); + }); + + it("links to the external wikis in a new tab", () => { + cy.get('nav[aria-label="Main"]').within(() => { + cy.contains("a", "Player's wiki") + .should("have.attr", "href", "https://wiki.unitystation.org") + .and("have.attr", "target", "_blank"); + cy.contains("a", "Dev's wiki") + .should("have.attr", "href", "https://unitystation.github.io/unitystation/") + .and("have.attr", "target", "_blank"); + }); + }); + + it("navigates to the download page", () => { + cy.get('nav[aria-label="Main"]').contains("a", "Download").click(); + cy.location("pathname").should("eq", "/download"); + cy.contains("Download Pudu Launcher").should("be.visible"); + }); + + it("offers login and password reset in the account menu when logged out", () => { + cy.contains("button", "Account").click(); + cy.get('[role="menu"]').within(() => { + cy.contains('[role="menuitem"]', "Login / Register").should( + "have.attr", + "href", + "/login", + ); + cy.contains('[role="menuitem"]', "Reset password").should( + "have.attr", + "href", + "/reset-password", + ); + }); + }); + }); + + describe("mobile", () => { + beforeEach(() => { + cy.viewport("iphone-x"); + cy.visit("/"); + }); + + it("toggles the mobile menu and navigates", () => { + cy.get('nav[aria-label="Main mobile"]').should("not.exist"); + + cy.hydratedClick('button[aria-label="Open menu"]', 'nav[aria-label="Main mobile"]'); + cy.get('nav[aria-label="Main mobile"]').should("be.visible"); + + cy.get('nav[aria-label="Main mobile"]').contains("a", "Changelog").click(); + cy.location("pathname").should("eq", "/changelog"); + cy.get('nav[aria-label="Main mobile"]').should("not.exist"); + }); + + it("closes the mobile menu with the close button", () => { + cy.hydratedClick('button[aria-label="Open menu"]', 'button[aria-label="Close menu"]'); + cy.get('button[aria-label="Close menu"]').should("have.attr", "aria-expanded", "true"); + cy.get('button[aria-label="Close menu"]').click(); + cy.get('nav[aria-label="Main mobile"]').should("not.exist"); + }); + }); + + describe("not found", () => { + it("shows the 404 page for unknown routes", () => { + cy.visit("/this-page-does-not-exist", { failOnStatusCode: false }); + cy.contains("h1", "404").should("be.visible"); + cy.contains("Page not found").should("be.visible"); + cy.contains("a", "Back to home").should("have.attr", "href", "/").click(); + cy.location("pathname").should("eq", "/"); + }); + }); +}); + +export {}; diff --git a/cypress/fixtures/blogPosts-page1.json b/cypress/fixtures/blogPosts-page1.json new file mode 100644 index 0000000..1b0f73b --- /dev/null +++ b/cypress/fixtures/blogPosts-page1.json @@ -0,0 +1,40 @@ +{ + "count": 4, + "next": "https://changelog.unitystation.org/posts/?page=2", + "previous": null, + "results": [ + { + "title": "Station reactor now explodes properly", + "slug": "reactor-explodes-properly", + "author": "TestAuthor", + "date_created": "2026-06-30T12:00:00Z", + "type": "announcement", + "state": "published", + "socials_image": "/favicon.ico", + "summary": "The reactor finally detonates with the dignity it deserves.", + "sections": [{ "heading": "Boom", "body": "It explodes now." }] + }, + { + "title": "Weekly progress report 42", + "slug": "weekly-progress-42", + "author": "DevCrew", + "date_created": "2026-06-25T12:00:00Z", + "type": "weekly", + "state": "published", + "socials_image": "/favicon.ico", + "summary": "Atmospherics got faster and the clown got slower.", + "sections": [{ "body": "Lots of work this week." }] + }, + { + "title": "Community spotlight: chef mains", + "slug": "community-chef-mains", + "author": "CommunityTeam", + "date_created": "2026-06-20T12:00:00Z", + "type": "community", + "state": "published", + "socials_image": "/favicon.ico", + "summary": "Celebrating the people who keep the crew fed.", + "sections": [{ "body": "Great cooks all around." }] + } + ] +} diff --git a/cypress/fixtures/blogPosts-page2.json b/cypress/fixtures/blogPosts-page2.json new file mode 100644 index 0000000..be1c53d --- /dev/null +++ b/cypress/fixtures/blogPosts-page2.json @@ -0,0 +1,18 @@ +{ + "count": 4, + "next": null, + "previous": "https://changelog.unitystation.org/posts/?page=1", + "results": [ + { + "title": "Archived post from page two", + "slug": "archived-post-page-two", + "author": "OldTimer", + "date_created": "2026-05-01T12:00:00Z", + "type": "announcement", + "state": "published", + "socials_image": "/favicon.ico", + "summary": "An older announcement that lives on the second page.", + "sections": [{ "body": "Old news." }] + } + ] +} diff --git a/cypress/fixtures/changelog-page1.json b/cypress/fixtures/changelog-page1.json new file mode 100644 index 0000000..ab415fb --- /dev/null +++ b/cypress/fixtures/changelog-page1.json @@ -0,0 +1,38 @@ +{ + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "version_number": "9999", + "date_created": "2026-06-30", + "changes": [ + { + "author_username": "coder1", + "author_url": "https://github.com/coder1", + "description": "Added a bikehorn that honks in stereo", + "pr_url": "https://github.com/unitystation/unitystation/pull/4321", + "pr_number": 4321, + "category": "NEW", + "build": "9999", + "date_added": "2026-06-30" + }, + { + "author_username": "coder2", + "author_url": "https://github.com/coder2", + "description": "Fixed atmos leaking through solid walls", + "pr_url": "https://github.com/unitystation/unitystation/pull/4322", + "pr_number": 4322, + "category": "FIX", + "build": "9999", + "date_added": "2026-06-30" + } + ] + }, + { + "version_number": "9998", + "date_created": "2026-06-28", + "changes": [] + } + ] +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json index 02e4254..519902d 100644 --- a/cypress/fixtures/example.json +++ b/cypress/fixtures/example.json @@ -1,5 +1,5 @@ { - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" } diff --git a/cypress/fixtures/ledger-page1.json b/cypress/fixtures/ledger-page1.json new file mode 100644 index 0000000..a4d781e --- /dev/null +++ b/cypress/fixtures/ledger-page1.json @@ -0,0 +1,27 @@ +{ + "count": 4, + "next": "https://ledger.unitystation.org/movements/?page=2", + "previous": null, + "results": [ + { + "id": 4, + "type": "income", + "description": "Patreon payout June", + "notes": "Monthly withdrawal", + "amount_usd": "500.00", + "created_at": "2026-06-15T12:00:00Z", + "balance_after": "1234.56", + "link": "https://example.com/receipt/4" + }, + { + "id": 3, + "type": "expense", + "description": "Server hosting", + "notes": null, + "amount_usd": "120.00", + "created_at": "2026-06-10T12:00:00Z", + "balance_after": "734.56", + "link": null + } + ] +} diff --git a/cypress/fixtures/ledger-page2.json b/cypress/fixtures/ledger-page2.json new file mode 100644 index 0000000..e5a41fa --- /dev/null +++ b/cypress/fixtures/ledger-page2.json @@ -0,0 +1,27 @@ +{ + "count": 4, + "next": null, + "previous": "https://ledger.unitystation.org/movements/", + "results": [ + { + "id": 2, + "type": "income", + "description": "PayPal donation", + "notes": null, + "amount_usd": "25.00", + "created_at": "2026-05-20T12:00:00Z", + "balance_after": "854.56", + "link": null + }, + { + "id": 1, + "type": "expense", + "description": "Domain renewal", + "notes": "unitystation.org", + "amount_usd": "15.00", + "created_at": "2026-05-05T12:00:00Z", + "balance_after": "829.56", + "link": "https://example.com/receipt/1" + } + ] +} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 698b01a..f1dc8b6 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -1,37 +1,32 @@ /// -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -// declare global { -// namespace Cypress { -// interface Chainable { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } \ No newline at end of file + +declare global { + namespace Cypress { + interface Chainable { + /** + * Click the first element matching `selector`, retrying until + * `expectSelector` appears in the DOM. Next.js pages hydrate after + * first paint, so an immediate click can land before React has + * attached event handlers and silently do nothing. + */ + hydratedClick(selector: string, expectSelector: string): void; + } + } +} + +const hydratedClick = (selector: string, expectSelector: string, attempts = 5) => { + cy.get(selector).first().click(); + cy.get("body").then(($body) => { + if ($body.find(expectSelector).length === 0 && attempts > 0) { + cy.wait(200); + hydratedClick(selector, expectSelector, attempts - 1); + } + }); + cy.get(expectSelector).should("exist"); +}; + +Cypress.Commands.add("hydratedClick", (selector: string, expectSelector: string) => + hydratedClick(selector, expectSelector), +); + +export {}; diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html index 3e16e9b..ade919f 100644 --- a/cypress/support/component-index.html +++ b/cypress/support/component-index.html @@ -1,14 +1,14 @@ - + - - - - - Components App - -
    - - -
    - - \ No newline at end of file + + + + + Components App + +
    + + +
    + + diff --git a/cypress/support/component.ts b/cypress/support/component.ts index 37f59ed..055a752 100644 --- a/cypress/support/component.ts +++ b/cypress/support/component.ts @@ -1,39 +1,14 @@ -// *********************************************************** -// This example support/component.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** +import "./commands"; +import "../../app/globals.css"; -// Import commands.js using ES2015 syntax: -import './commands' +import { mount } from "cypress/react"; -// Alternatively you can use CommonJS syntax: -// require('./commands') - -import { mount } from 'cypress/react18' - -// Augment the Cypress namespace to include type definitions for -// your custom command. -// Alternatively, can be defined in cypress/support/component.d.ts -// with a at the top of your spec. declare global { - namespace Cypress { - interface Chainable { - mount: typeof mount + namespace Cypress { + interface Chainable { + mount: typeof mount; + } } - } } -Cypress.Commands.add('mount', mount) - -// Example use: -// cy.mount() \ No newline at end of file +Cypress.Commands.add("mount", mount); diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index f80f74f..f887c29 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -1,20 +1 @@ -// *********************************************************** -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') \ No newline at end of file +import "./commands"; diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json new file mode 100644 index 0000000..e0ada9d --- /dev/null +++ b/cypress/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["cypress", "node"] + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": [] +} diff --git a/hooks/useInfiniteFeed.ts b/hooks/useInfiniteFeed.ts new file mode 100644 index 0000000..c18b630 --- /dev/null +++ b/hooks/useInfiniteFeed.ts @@ -0,0 +1,53 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + +/** The changelog API's pagination envelope: one page of results plus the next page's URL. */ +type FeedPage = { results: T[]; next: string | null }; + +/** + * Pages through a paginated JSON feed for an infinite-scrolling list: loads + * the first page on mount, then the next page whenever the returned sentinel + * element scrolls within reach. Render the sentinel (an empty div is fine) + * below the list. + */ +export default function useInfiniteFeed(initialUrl: string) { + const [items, setItems] = useState([]); + const [nextPage, setNextPage] = useState(initialUrl); + const [isLoading, setIsLoading] = useState(true); + const sentinelRef = useRef(null); + const loadingRef = useRef(false); + + const loadMore = useCallback(async (url: string) => { + if (loadingRef.current) return; + loadingRef.current = true; + setIsLoading(true); + try { + const response = await fetch(url); + const page = (await response.json()) as FeedPage; + setItems((prev) => [...prev, ...page.results]); + setNextPage(page.next); + } finally { + loadingRef.current = false; + setIsLoading(false); + } + }, []); + + useEffect(() => { + void loadMore(initialUrl); + }, [initialUrl, loadMore]); + + useEffect(() => { + const sentinel = sentinelRef.current; + if (!sentinel || !nextPage) return; + + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting) void loadMore(nextPage); + }, + { rootMargin: "400px" }, + ); + observer.observe(sentinel); + return () => observer.disconnect(); + }, [nextPage, loadMore]); + + return { items, isLoading, sentinelRef }; +} diff --git a/hooks/useWindowSize.ts b/hooks/useWindowSize.ts deleted file mode 100644 index 2837ff4..0000000 --- a/hooks/useWindowSize.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {useEffect, useState} from "react"; - -const useWindowSize = () => { - const [windowSize, setWindowSize] = useState({ - width: 0, - height: 0, - }); - - useEffect(() => { - setWindowSize({width: window.innerWidth, height: window.innerHeight}); - function handleResize() { - setWindowSize({ - width: window.innerWidth, - height: window.innerHeight, - }); - } - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, []); - - return windowSize; -} - -export default useWindowSize; diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 1d9e599..0000000 --- a/jest.config.js +++ /dev/null @@ -1,19 +0,0 @@ -const nextJest = require('next/jest') - -const createJestConfig = nextJest({ - // Provide the path to your Next.js app to load next.config.js and .env files in your test environment - dir: './', -}) - -// Add any custom config to be passed to Jest -/** @type {import('jest').Config} */ -const customJestConfig = { - // Add more setup options before each test is run - // setupFilesAfterEnv: ['/jest.setup.js'], - // if using TypeScript with a baseUrl set to the root directory then you need the below for alias' to work - moduleDirectories: ['node_modules', '/'], - testEnvironment: 'jest-environment-jsdom', -} - -// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async -module.exports = createJestConfig(customJestConfig) diff --git a/lib/auth/authorization.ts b/lib/auth/authorization.ts index b4b64fd..63ce890 100644 --- a/lib/auth/authorization.ts +++ b/lib/auth/authorization.ts @@ -1,16 +1,15 @@ -'use server' +"use server"; -import {LoginResponse} from "./types"; -import {EncryptJWT, jwtDecrypt, jwtVerify, SignJWT} from "jose"; -import {isLoginResponse, parseError} from "./guards"; -import { cookies, type UnsafeUnwrappedCookies } from "next/headers"; -import {redirect} from "next/navigation"; +import { LoginResponse } from "./types"; +import { EncryptJWT, jwtDecrypt } from "jose"; +import { isLoginResponse, parseError } from "./guards"; +import { cookies } from "next/headers"; const secretText = `${process.env.SECRET}`; -const secretKey = Uint8Array.from(Buffer.from(secretText, 'base64')); +const secretKey = Uint8Array.from(Buffer.from(secretText, "base64")); -export const tryGetSessionCookie = async (): Promise<{ success: boolean, value?: string }> => { - const cookiesManager = await cookies(); +export const tryGetSessionCookie = async (): Promise<{ success: boolean; value?: string }> => { + const cookiesManager = await cookies(); const sessionCookie = cookiesManager.get("session")?.value; if (sessionCookie) { @@ -18,70 +17,66 @@ export const tryGetSessionCookie = async (): Promise<{ success: boolean, value?: } return { success: false }; -} +}; export const setSessionCookie = async (payload: LoginResponse) => { const cookiesManager = await cookies(); cookiesManager.set("session", await encryptSessionData(payload), { httpOnly: true, - expires: new Date(Date.now() + 1000 * 60 * 60 * 24) + expires: new Date(Date.now() + 1000 * 60 * 60 * 24), }); -} +}; export const destroySessionCookie = async () => { const cookiesManager = await cookies(); cookiesManager.set("session", "", { httpOnly: true, - expires: new Date(0) - }) -} + expires: new Date(0), + }); +}; export const encryptSessionData = async (payload: LoginResponse) => { - console.log(secretText, secretText.length); - console.log(secretKey, secretKey.length); - - return await new EncryptJWT(payload as any) - .setProtectedHeader({alg: 'dir', enc: 'A256GCM'}) + return await new EncryptJWT({ ...payload }) + .setProtectedHeader({ alg: "dir", enc: "A256GCM" }) .setIssuedAt() - .setExpirationTime('1d') + .setExpirationTime("1d") .encrypt(secretKey); -} +}; export const decryptSessionData = async (token: string) => { - const {payload} = await jwtDecrypt(token, secretKey); + const { payload } = await jwtDecrypt(token, secretKey); if (isLoginResponse(payload)) { return payload; } else { throw new Error("Invalid token payload structure."); } -} - +}; export const serverRequestLoginWithCredentials = async (email: string, password: string) => { const response = await fetch(`${process.env.CC_API_URL}/accounts/login-credentials`, { method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", }, - body: JSON.stringify({email, password}) + body: JSON.stringify({ email, password }), }); const parsed = await evaluateResponse(response); if (isLoginResponse(parsed)) { - await setSessionCookie(parsed) + await setSessionCookie(parsed); } return parsed; -} +}; export const serverRequestLoginWithToken = async (token: string) => { const response = await fetch(`${process.env.CC_API_URL}/accounts/login-token`, { method: "POST", headers: { "Content-Type": "application/json", - "Authorization": `Token ${token}` + Authorization: `Token ${token}`, }, credentials: "include", }); @@ -93,35 +88,32 @@ export const serverRequestLoginWithToken = async (token: string) => { } return parsed; -} +}; export const serverTrySessionLogin = async () => { const sessionCookie = await tryGetSessionCookie(); if (sessionCookie.success) { const payload = await decryptSessionData(sessionCookie.value!); if (isLoginResponse(payload)) { - - //update the session cookie with a new expiration await setSessionCookie(payload); return await serverRequestLoginWithToken(payload.token); } - return {IsLoggedIn: false, authContext: undefined, error: parseError(payload)}; + return { isLoggedIn: false, authContext: undefined, error: parseError(payload) }; } - return {IsLoggedIn: false, authContext: undefined, error: undefined}; -} + return { isLoggedIn: false, authContext: undefined, error: undefined }; +}; export const serverLogout = async () => { - destroySessionCookie(); - redirect("login"); -} + await destroySessionCookie(); +}; const evaluateResponse = async (response: Response) => { if (response.ok) { - return await response.json() as LoginResponse; + return (await response.json()) as LoginResponse; } else { const errorData = await response.json(); return parseError(errorData); } -} \ No newline at end of file +}; diff --git a/lib/auth/fieldError.ts b/lib/auth/fieldError.ts new file mode 100644 index 0000000..6f134da --- /dev/null +++ b/lib/auth/fieldError.ts @@ -0,0 +1,12 @@ +import { FieldError, GeneralError, isFieldError } from "../../lib/auth/guards"; + +/** Pull one field's validation message out of an API error, if present. */ +export function fieldErrorFor( + error: GeneralError | FieldError | undefined, + field: string, +): string | undefined { + if (!error || !isFieldError(error)) return undefined; + const value = error.error[field]; + if (!value) return undefined; + return Array.isArray(value) ? value.join(" ") : String(value); +} diff --git a/lib/auth/guards.ts b/lib/auth/guards.ts index 543128c..2ae334d 100644 --- a/lib/auth/guards.ts +++ b/lib/auth/guards.ts @@ -1,10 +1,10 @@ -import {LoginResponse} from "./types"; +import { LoginResponse } from "./types"; interface ErrorBase { status: number; } -export interface GeneralError extends ErrorBase{ +export interface GeneralError extends ErrorBase { error: string; } @@ -14,24 +14,24 @@ export interface FieldError extends ErrorBase { }; } -export const isLoginResponse = (response: any): response is LoginResponse => - response && response.account && typeof response.token === 'string'; - -export const isGeneralError = (error: any): error is GeneralError => - typeof error.error === 'string'; - -export const isFieldError = (error: any): error is FieldError => - typeof error.error === 'object' && !Array.isArray(error.error) && error.error !== null - -export const parseError = (error: any) => { - if (isGeneralError(error)) { - return error as GeneralError; - } else if (isFieldError(error)) { - return error as FieldError; - } else { - return { - status: 500, - error: 'Unknown error structure' - } as GeneralError; +const isRecord = (value: unknown): value is Record => + typeof value === "object" && value !== null; + +export const isLoginResponse = (response: unknown): response is LoginResponse => + isRecord(response) && isRecord(response.account) && typeof response.token === "string"; + +export const isGeneralError = (error: unknown): error is GeneralError => + isRecord(error) && typeof error.error === "string"; + +export const isFieldError = (error: unknown): error is FieldError => + isRecord(error) && isRecord(error.error) && !Array.isArray(error.error); + +export const parseError = (error: unknown): GeneralError | FieldError => { + if (isGeneralError(error) || isFieldError(error)) { + return error; } -}; \ No newline at end of file + return { + status: 500, + error: "Unknown error structure", + }; +}; diff --git a/lib/auth/types.ts b/lib/auth/types.ts index 8605898..247cadd 100644 --- a/lib/auth/types.ts +++ b/lib/auth/types.ts @@ -1,4 +1,4 @@ -import {FieldError, GeneralError} from "./guards"; +import { FieldError, GeneralError } from "./guards"; export interface AccountPublicData { unique_identifier: string; @@ -22,4 +22,4 @@ export interface AuthContext { state: AuthState; credentialsLogin: (email: string, password: string) => Promise; logout: () => Promise; -} \ No newline at end of file +} diff --git a/lib/auth/useAuth.ts b/lib/auth/useAuth.ts index 855d957..6298749 100644 --- a/lib/auth/useAuth.ts +++ b/lib/auth/useAuth.ts @@ -1,28 +1,29 @@ -"use client" - -import {useEffect, useState} from "react"; -import {AuthContext} from "./types"; -import {isFieldError, isGeneralError, isLoginResponse} from "./guards"; -import {serverRequestLoginWithCredentials, serverTrySessionLogin, serverLogout} from "./authorization"; -import {z} from "zod"; - -export const useAuth = () : AuthContext => { - - const [state, setState] = useState( - { - state: { - isLoggedIn: false, - authContext: undefined, - error: undefined, - }, - credentialsLogin: async (email: string, password: string) => { - throw new Error("Credentials Login was not served.") - }, - logout: async () => { - throw new Error("Logout was not served.") - } - } - ); +"use client"; + +import { useEffect, useState } from "react"; +import { AuthContext } from "./types"; +import { isFieldError, isGeneralError, isLoginResponse } from "./guards"; +import { + serverRequestLoginWithCredentials, + serverTrySessionLogin, + serverLogout, +} from "./authorization"; +import { z } from "zod"; + +export const useAuth = (): AuthContext => { + const [state, setState] = useState({ + state: { + isLoggedIn: false, + authContext: undefined, + error: undefined, + }, + credentialsLogin: async (_email: string, _password: string) => { + throw new Error("Credentials Login was not served."); + }, + logout: async () => { + throw new Error("Logout was not served."); + }, + }); const clientRequestLoginWithCredentials = async (email: string, password: string) => { const schema = z.object({ @@ -30,68 +31,108 @@ export const useAuth = () : AuthContext => { password: z.string().min(6), }); - const parsed = schema.safeParse( - { email, password} - ); + const parsed = schema.safeParse({ email, password }); if (!parsed.success) { - const fieldErrors = parsed.error.errors.reduce((acc, curr) => ({...acc, [curr.path[0]]: curr.message}), {}) - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: {error: fieldErrors, status: 400}}}) + const fieldErrors = parsed.error.errors.reduce( + (acc, curr) => ({ ...acc, [curr.path[0]]: curr.message }), + {}, + ); + setState({ + ...state, + state: { + isLoggedIn: false, + authContext: undefined, + error: { error: fieldErrors, status: 400 }, + }, + }); return; } - const response = await serverRequestLoginWithCredentials(parsed.data.email, parsed.data.password); + const response = await serverRequestLoginWithCredentials( + parsed.data.email, + parsed.data.password, + ); if (isLoginResponse(response)) { - - setState({...state, state: {isLoggedIn: true, authContext: response, error: undefined}}) + setState({ + ...state, + state: { isLoggedIn: true, authContext: response, error: undefined }, + }); return; } else { if (isGeneralError(response)) { - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: response}}) + setState({ + ...state, + state: { isLoggedIn: false, authContext: undefined, error: response }, + }); return; } if (isFieldError(response)) { - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: response}}) + setState({ + ...state, + state: { isLoggedIn: false, authContext: undefined, error: response }, + }); return; } } - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: {error: "Unexpected error happened", status: 500}}}) - } + setState({ + ...state, + state: { + isLoggedIn: false, + authContext: undefined, + error: { error: "Unexpected error happened", status: 500 }, + }, + }); + }; const clientRequestLogout = async () => { - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: undefined}}) + setState({ + ...state, + state: { isLoggedIn: false, authContext: undefined, error: undefined }, + }); await serverLogout(); - } + }; useEffect(() => { const trySessionLogin = async () => { const response = await serverTrySessionLogin(); if (isLoginResponse(response)) { - setState({...state, state: {isLoggedIn: true, authContext: response, error: undefined}}); + setState({ + ...state, + state: { isLoggedIn: true, authContext: response, error: undefined }, + }); return; } if (isGeneralError(response)) { - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: response}}); + setState({ + ...state, + state: { isLoggedIn: false, authContext: undefined, error: response }, + }); return; } if (isFieldError(response)) { - setState({...state, state: {isLoggedIn: false, authContext: undefined, error: response}}); + setState({ + ...state, + state: { isLoggedIn: false, authContext: undefined, error: response }, + }); return; } - setState({...state, state: {isLoggedIn: false, authContext: undefined}}); - } + setState({ ...state, state: { isLoggedIn: false, authContext: undefined } }); + }; trySessionLogin().then(); + // Mount-only session check; state is intentionally excluded to run this exactly once. + // oxlint-disable-next-line react/exhaustive-deps }, []); return { ...state, credentialsLogin: clientRequestLoginWithCredentials, - logout: clientRequestLogout + logout: clientRequestLogout, }; }; diff --git a/next.config.js b/next.config.js index 4576a7e..a365f31 100644 --- a/next.config.js +++ b/next.config.js @@ -1,26 +1,27 @@ /** @type {import('next').NextConfig} */ module.exports = { + reactCompiler: true, images: { remotePatterns: [ { - protocol: 'https', - hostname: 'cdn.unitystation.org', - port: '', - pathname: '/**/**', + protocol: "https", + hostname: "cdn.unitystation.org", + port: "", + pathname: "/**/**", }, { - protocol: 'https', - hostname: 'cdn.discordapp.com', - port: '', - pathname: '/attachments/**', + protocol: "https", + hostname: "cdn.discordapp.com", + port: "", + pathname: "/attachments/**", }, { - protocol: 'https', - hostname: 'user-images.githubusercontent.com', - port: '', - pathname: '/**/**', - } + protocol: "https", + hostname: "user-images.githubusercontent.com", + port: "", + pathname: "/**/**", + }, ], }, -} \ No newline at end of file +}; diff --git a/package-lock.json b/package-lock.json index d45c8d1..686ad37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13008 +1,6666 @@ { - "name": "unitystation.org", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "unitystation.org", - "version": "0.1.0", - "dependencies": { - "@types/ua-parser-js": "^0.7.39", - "@vercel/analytics": "^1.6.1", - "classnames": "^2.5.1", - "flowbite": "^2.5.2", - "flowbite-react": "^0.7.8", - "jose": "^5.10.0", - "next": "^15.5.7", - "react": "^19.2.1", - "react-dom": "^19.2.1", - "react-icons": "^5.0.1", - "ua-parser-js": "^2.0.7", - "zod": "^3.25.76" - }, - "devDependencies": { - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", - "@types/jest": "^30.0.0", - "@types/node": "^20.19.26", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "autoprefixer": "^10.4.22", - "cypress": "^15.16.0", - "eslint": "^9.19.0", - "eslint-config-next": "^15.5.7", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "postcss": "^8.5.6", - "start-server-and-test": "^2.1.3", - "tailwindcss": "^3.4.18", - "typescript": "^5.9.3" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", - "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", - "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cypress/request": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-4.0.1.tgz", - "integrity": "sha512-y20e+e6dFYkOUUJLVUZTsJRuTiXZaUQ32WD+R/ux/HBybbTx4ge7cNINcua0pU8+SNkKuRbOF12mBmzuzM8n5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.4", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "^6.15.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">= 14.17.0" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom/node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.26.10", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.10.tgz", - "integrity": "sha512-sh6f9gVvWQdEzLObrWbJ97c0clJObiALsFe0LiR/kb3tDRKwEhObASEH2QyfdoO/ZBPzwxa9j+nYFo+sqgbioA==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@floating-ui/utils": "^0.2.0", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" - }, - "node_modules/@hapi/address": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", - "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@hapi/formula": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", - "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/hoek": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/pinpoint": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", - "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/tlds": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", - "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@hapi/topo": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", - "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/diff-sequences": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", - "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", - "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern/node_modules/jest-regex-util": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", - "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@next/env": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.19.tgz", - "integrity": "sha512-sWWluFvcv5v3Fxznmf2ZfjyoVQt/64oCnYqS90inQWGzMPK1VjvekPiz3OPHKmFT30EnHrjlbyaHLt3M0vWabw==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.19.tgz", - "integrity": "sha512-Ctwb4qYuMbHN/1oXLlTdMchwG8h8Xzwq+wGZZMgF3o6+uwyBKAI2c96bdOsl+C62PaUD0Jkh+QpNkhUeDlam0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.19.tgz", - "integrity": "sha512-jx9wWlTKueHKPvVOndyr7WuaevWCkuYqsQ8gC0TMPKAVWG3MhcdMrjfo9tvIZNXd0QOUYXXvAcZ325y8Uq7uzg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.19.tgz", - "integrity": "sha512-291KFcsIQ3OenRdiUDFOR6W3wezzH4auENXm1gbm1Bjd4ANMMRgxPrWTUztQN43BnVoVuMnHCrLeECIMwgFKbA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.19.tgz", - "integrity": "sha512-WeH+nelQyyMeE2f8FxBRZNrGipya5zHZV2vjzfCOAYyiI6am+NbnWAAldOBFQBB2w0DjJcsvrKqoFT2b7+5YoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.19.tgz", - "integrity": "sha512-5xTOE0lDlDCSSfp+BAif7j17VRRCjWp//ZPZy6NI0QpdrhxtQnsZguSx0xAAZ0c9XZLrLLwCe/XVe5YPrRilKw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.19.tgz", - "integrity": "sha512-LTxRmMgqqMv05Had879W00Fm53quiJd3Zuz8h1JSNJ3nGSlbZ/7Tjs1tKyScgN3Au3t3MyPsjPlq60fMmSHLsg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.19.tgz", - "integrity": "sha512-eoNQSpA5PQfB9wBO4RA47MTDXWz1fizy9Y3Z6e4DetYIF3dvjuu8sj7aIGn/bFCU6lnFzTK34NtCaffP4NsQ7Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.19.tgz", - "integrity": "sha512-6UNt2dFuCHOe446sm/Kp69nUe8/wIhnh9bm6Xcqw4qEWCOppLMOvhTBVgvM7invVUNr4SPpP6NOQsACtn2IN9Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.19.tgz", - "integrity": "sha512-PhmojAHyqMne56HBLGu9dhDnHPuFmEjrXSQMM/nW0J6j849lk3ESrVtqNJcCk8CKOV7brpTTbaYAjwKPzKM69w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", - "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/expect-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", - "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", - "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", - "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.4.0", - "@jest/schemas": "30.4.1", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/@sinclair/typebox": { - "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/expect": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", - "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", - "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.4.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", - "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.4.1", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-message-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", - "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.4.1", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-util": "30.4.1", - "picomatch": "^4.0.3", - "pretty-format": "30.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-mock": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", - "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "jest-util": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", - "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", - "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.4.1", - "ansi-styles": "^5.2.0", - "react-is-18": "npm:react-is@^18.3.1", - "react-is-19": "npm:react-is@^19.2.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.42.tgz", - "integrity": "sha512-5L7SUaFC1RyDraj2yRhyBzHTobyXHmohD100CChNtyPyleoq37Mqab5Gn8XEKI04dfN/oqPdpHk38MgcQWHbZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "license": "MIT" - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sizzle": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", - "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ua-parser-js": { - "version": "0.7.39", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz", - "integrity": "sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", - "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/type-utils": "8.60.1", - "@typescript-eslint/utils": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.60.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", - "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", - "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.1", - "@typescript-eslint/types": "^8.60.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", - "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", - "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", - "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/utils": "8.60.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", - "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", - "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.60.1", - "@typescript-eslint/tsconfig-utils": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", - "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", - "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.60.1", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-openharmony-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vercel/analytics": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz", - "integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==", - "license": "MPL-2.0", - "peerDependencies": { - "@remix-run/react": "^2", - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@remix-run/react": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-router": { - "optional": true - } - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.0.tgz", - "integrity": "sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/axios/node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.34", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", - "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-truncate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^8.0.0", - "string-width": "^8.2.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cypress": { - "version": "15.16.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.16.0.tgz", - "integrity": "sha512-fy0M0c9xDLEp4v9y7LLKFeAQhIdDsobxDSKpD3JcZpqQefjy9TSzEyVV3HA0zu7hUi0bGHlSYlI7ASub8wgR9A==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@cypress/request": "^4.0.0", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "@types/tmp": "^0.2.3", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.4.0", - "chalk": "^4.1.0", - "ci-info": "^4.1.0", - "cli-table3": "0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "fs-extra": "^9.1.0", - "hasha": "5.2.2", - "is-installed-globally": "~0.4.0", - "listr2": "^9.0.5", - "lodash": "^4.17.23", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "supports-color": "^8.1.1", - "systeminformation": "^5.31.1", - "tmp": "~0.2.4", - "tree-kill": "1.2.2", - "tslib": "1.14.1", - "untildify": "^4.0.0", - "yauzl": "^3.3.1" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^20.1.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/cypress/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dayjs": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", - "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", - "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-europe-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", - "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.368", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", - "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", - "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.19.tgz", - "integrity": "sha512-UZwkuhBCNxVZfo93MSHRDOVNWXooJJGcAUyTAVIp0+9QFhH4SqJxWY0s6Mk9C2kMi777HPMn3dseOrZshWpG9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.5.19", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", - "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/flowbite": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.5.2.tgz", - "integrity": "sha512-kwFD3n8/YW4EG8GlY3Od9IoKND97kitO+/ejISHSqpn3vw2i5K/+ZI8Jm2V+KC4fGdnfi0XZ+TzYqQb4Q1LshA==", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.3", - "flowbite-datepicker": "^1.3.0", - "mini-svg-data-uri": "^1.4.3" - } - }, - "node_modules/flowbite-datepicker": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/flowbite-datepicker/-/flowbite-datepicker-1.3.2.tgz", - "integrity": "sha512-6Nfm0MCVX3mpaR7YSCjmEO2GO8CDt6CX8ZpQnGdeu03WUCWtEPQ/uy0PUiNtIJjJZWnX0Cm3H55MOhbD1g+E/g==", - "license": "MIT", - "dependencies": { - "@rollup/plugin-node-resolve": "^15.2.3", - "flowbite": "^2.0.0" - } - }, - "node_modules/flowbite-react": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.7.8.tgz", - "integrity": "sha512-hYYPvIixokNgAlPbmxNAYFLlLi61z492v8hj1jQHykhuesPGTifDFeQcDxKgQvENqc4bRdBdjrKOvnq7D+pm7g==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "1.6.0", - "@floating-ui/react": "0.26.10", - "classnames": "2.5.1", - "debounce": "2.0.0", - "flowbite": "2.3.0", - "react-icons": "5.0.1", - "tailwind-merge": "2.2.2" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18", - "tailwindcss": "^3" - } - }, - "node_modules/flowbite-react/node_modules/flowbite": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.3.0.tgz", - "integrity": "sha512-pm3JRo8OIJHGfFYWgaGpPv8E+UdWy0Z3gEAGufw+G/1dusaU/P1zoBLiQpf2/+bYAi+GBQtPVG86KYlV0W+AFQ==", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.3", - "mini-svg-data-uri": "^1.4.3" - } - }, - "node_modules/flowbite-react/node_modules/react-icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", - "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", - "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-standalone-pwa": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz", - "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.1.tgz", - "integrity": "sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/address": "^5.1.1", - "@hapi/formula": "^3.0.2", - "@hapi/hoek": "^11.0.7", - "@hapi/pinpoint": "^2.0.1", - "@hapi/tlds": "^1.1.1", - "@hapi/topo": "^6.0.2", - "@standard-schema/spec": "^1.1.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/listr2": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^5.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/next": { - "version": "15.5.19", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.19.tgz", - "integrity": "sha512-xNOW6tYshGX1/Oi3F8uuk4gpDeWsSUE/1Z0G5uUMekIxaQ0xc03UXd9II0VQHYMWviMeA0OHpJFAKsHf8bTYVg==", - "license": "MIT", - "dependencies": { - "@next/env": "15.5.19", - "@swc/helpers": "0.5.15", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.19", - "@next/swc-darwin-x64": "15.5.19", - "@next/swc-linux-arm64-gnu": "15.5.19", - "@next/swc-linux-arm64-musl": "15.5.19", - "@next/swc-linux-x64-gnu": "15.5.19", - "@next/swc-linux-x64-musl": "15.5.19", - "@next/swc-win32-arm64-msvc": "15.5.19", - "@next/swc-win32-x64-msvc": "15.5.19", - "sharp": "^0.34.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", - "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.7" - } - }, - "node_modules/react-icons": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", - "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/react-is-18": { - "name": "react-is", - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-is-19": { - "name": "react-is", - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", - "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", - "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.3", - "is-fullwidth-code-point": "^5.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/start-server-and-test": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.5.tgz", - "integrity": "sha512-A/SbXpgXE25ScSkpLLqvGvVZT0ykN6+AzS8tVqMBCTxbJy2Nwuen59opT+afalK5aS+AuQmZs0EsLwjnuDN+/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "bluebird": "3.7.2", - "check-more-types": "2.24.0", - "debug": "4.4.3", - "execa": "5.1.1", - "lazy-ass": "1.6.0", - "ps-tree": "1.2.0", - "wait-on": "9.0.4" - }, - "bin": { - "server-test": "src/bin/start.js", - "start-server-and-test": "src/bin/start.js", - "start-test": "src/bin/start.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/start-server-and-test/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/start-server-and-test/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/start-server-and-test/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/systeminformation": { - "version": "5.31.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.7.tgz", - "integrity": "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==", - "dev": true, - "license": "MIT", - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos", - "android" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "license": "MIT" - }, - "node_modules/tailwind-merge": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.2.tgz", - "integrity": "sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tailwindcss/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throttleit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-is-frozen": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz", - "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT" - }, - "node_modules/ua-parser-js": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.10.tgz", - "integrity": "sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "AGPL-3.0-or-later", - "dependencies": { - "detect-europe-js": "^0.1.2", - "is-standalone-pwa": "^0.1.1", - "ua-is-frozen": "^0.1.2" - }, - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unrs-resolver": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", - "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.4" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.12.2", - "@unrs/resolver-binding-android-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-x64": "1.12.2", - "@unrs/resolver-binding-freebsd-x64": "1.12.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", - "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-musl": "1.12.2", - "@unrs/resolver-binding-openharmony-arm64": "1.12.2", - "@unrs/resolver-binding-wasm32-wasi": "1.12.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/wait-on": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.4.tgz", - "integrity": "sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "axios": "^1.13.5", - "joi": "^18.0.2", - "lodash": "^4.17.23", - "minimist": "^1.2.8", - "rxjs": "^7.8.2" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true + "name": "unitystation.org", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "unitystation.org", + "version": "0.1.0", + "dependencies": { + "@types/ua-parser-js": "^0.7.39", + "@vercel/analytics": "^1.6.1", + "classnames": "^2.5.1", + "jose": "^5.10.0", + "next": "^16.2.10", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-icons": "^5.0.1", + "ua-parser-js": "^2.0.7", + "zod": "^3.25.76" + }, + "devDependencies": { + "@commitlint/cli": "^21.2.0", + "@commitlint/config-conventional": "^21.2.0", + "@types/node": "^20.19.26", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "autoprefixer": "^10.4.22", + "babel-plugin-react-compiler": "^1.0.0", + "cypress": "^15.16.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", + "oxfmt": "0.58.0", + "oxlint": "1.73.0", + "postcss": "^8.5.6", + "start-server-and-test": "^2.1.3", + "tailwindcss": "^3.4.18", + "typescript": "^5.9.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.2.0.tgz", + "integrity": "sha512-4GLVIhUaT3c3GBlQ0GB80/5H3xXdn/Tgw4lrsuoOQVDu2wl4Xw0GuzSar8xZKSMv4H3xaKaQXmvH91GmdyYBZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-conventional": "^21.2.0", + "@commitlint/format": "^21.2.0", + "@commitlint/lint": "^21.2.0", + "@commitlint/load": "^21.2.0", + "@commitlint/read": "^21.2.0", + "@commitlint/types": "^21.2.0", + "tinyexec": "^1.0.0", + "yargs": "^18.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.2.0.tgz", + "integrity": "sha512-Qf8WRDVcyVd14if6VTWenebxFbKnVnbzPUJjlzjkyJGeHK2xCGd63Dr1XZzj0plXKQb9P0BfOxoc1HVeCo2BWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "conventional-changelog-conventionalcommits": "^10.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.0.tgz", + "integrity": "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/ensure": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.0.tgz", + "integrity": "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "es-toolkit": "^1.46.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", + "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/format": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.0.tgz", + "integrity": "sha512-c4q64xaav2U83t7k7RyzJerBZurPer7FxUOY0RL5L/6CZijZ7K+s6HIBGIghj0ey1P2+seRX0J9XQYtDued6tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.0.tgz", + "integrity": "sha512-4/eB0vBN7L88O/oC4ajAEqi7j2ZfNgxl/+11RfAV9YosejZgDXhY2C9VcHnHJhOzPLoSy5P3Mg/46kqeyJfXKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/lint": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.0.tgz", + "integrity": "sha512-ceO5dp9pLjEZ6y6qbq/uXWXDPykqqlTsyzoQ0NzecpisSJhK3kTy9qzQoPeJuWG/IMNdV1lO0RgmzqoAlSi1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^21.2.0", + "@commitlint/parse": "^21.2.0", + "@commitlint/rules": "^21.2.0", + "@commitlint/types": "^21.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/load": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.0.tgz", + "integrity": "sha512-RjlzWQqruRwIenJEfZtq7kG97co97nKoHpflE5YnF61tDLXxHPrdWImgzw6VL6MlFyaOcVlk74eBV8ZQmc3oIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.2.0", + "@commitlint/execute-rule": "^21.0.1", + "@commitlint/resolve-extends": "^21.2.0", + "@commitlint/types": "^21.2.0", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "es-toolkit": "^1.46.0", + "is-plain-obj": "^4.1.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/message": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.2.0.tgz", + "integrity": "sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/parse": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.0.tgz", + "integrity": "sha512-QHWxG4d0PLTF634/AdyZ0MQS+CLn5YOuJlCFhMMlSGKFxzYGUetkHBj18xgBD+6fVzUrA2lrCdi/vlS2f/oYXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.2.0", + "conventional-changelog-angular": "^9.0.0", + "conventional-commits-parser": "^7.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/read": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.0.tgz", + "integrity": "sha512-ELx8Ovh/JoAw5lpvDgxc6Y0We9skf2IPI2RFN+gnYgDGjRdMSF8zeodxhZmcclLWzfUIF7hXLOa8gOlllYcvBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^21.2.0", + "@commitlint/types": "^21.2.0", + "git-raw-commits": "^5.0.0", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.0.tgz", + "integrity": "sha512-4O/1j51+79Wth9s/MGxt/5gs0XYLDgNlYpltQfhAvLE0itusLKs9zruxbiNg1oOkmkb9L9L4USYGjEj7n87NxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.2.0", + "@commitlint/types": "^21.2.0", + "es-toolkit": "^1.46.0", + "global-directory": "^5.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/rules": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.0.tgz", + "integrity": "sha512-C2yXMNpiB8ETZKfx5JD8+ExgF8vTU1VQMKPSUUYwqKpw9oJWQBrlXBpdU038mj2WPjof7o9UzFpmTyBeGMZwZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^21.2.0", + "@commitlint/message": "^21.2.0", + "@commitlint/to-lines": "^21.0.1", + "@commitlint/types": "^21.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", + "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/top-level": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.2.0.tgz", + "integrity": "sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/types": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.0.tgz", + "integrity": "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^7.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@conventional-changelog/template": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/template/-/template-1.2.1.tgz", + "integrity": "sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@cypress/request": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-4.0.1.tgz", + "integrity": "sha512-y20e+e6dFYkOUUJLVUZTsJRuTiXZaUQ32WD+R/ux/HBybbTx4ge7cNINcua0pU8+SNkKuRbOF12mBmzuzM8n5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.4", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "^6.15.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">= 14.17.0" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.7.tgz", + "integrity": "sha512-MgNjRwy9Ti92yVAixLmDc8dd1bJIKwO9qlWCfFQRwRmUEDPQHYn4G6hwPFvFGUTzAa0FsS+inMjLin7GnyBRhA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", + "integrity": "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", + "integrity": "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz", + "integrity": "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz", + "integrity": "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz", + "integrity": "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz", + "integrity": "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz", + "integrity": "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz", + "integrity": "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz", + "integrity": "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.58.0.tgz", + "integrity": "sha512-Uz62sHduGGPftXtILGyxdSW4PX82rUg+rfdNqhsgxe881g4rIoXlIqmZQ6HVKcF4f+F8qMhdD03Bx5u7gmeTdg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.58.0.tgz", + "integrity": "sha512-rD0lRaJp1b+9vw6X4A2dJWKukd6X8yxiicN4JxXcXayolmUypRZxk+lKR+fVOu5q/iYc0fh5fR4bgmfOfVlbaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.58.0.tgz", + "integrity": "sha512-uzbPPk7O6M+w2K65vcQ1woga3wgP8zghjL1KOG5b6qJ8dvYHZJ1VShaslg2KOK6yQIwCQtcMCXqLBM6sqXUNTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.58.0.tgz", + "integrity": "sha512-L0nKYDxU32oxeQqJj21W9SlIMnf81VZEhyah6iDvFhf5q0oynq498Fopth7blErUJVBpVtxQ98RMCfMPqpJX6w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.58.0.tgz", + "integrity": "sha512-woNwfD58dC5PGS9LSLSD5JYfo/EFK5iG9vhDWkcCg3q78ag7KC8bpDqgvPHrMoXpx83OLXxoSOhu6z8FsVTHlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.58.0.tgz", + "integrity": "sha512-Sqs8nMLxuQpY21NKJ1u4stPDmO5hskBCNNh2E3AdCfI1QqWtf4m+Qn4mGEIUO4KGmuq3SWc/SZ80uy5IiwTCDw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.58.0.tgz", + "integrity": "sha512-Vd4exzBI5B5hB9m22JiTQzIL23WvHo/Pe+sNXPNeBLXSP9swCBPKCEBRwKpmpQzYhlgYaCgfPcGXPKAJBRIiZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.58.0.tgz", + "integrity": "sha512-bUWi5mHV+4Vi56RLHE1h6q/HHfwAIT3XoB9vJAVeRzfu5NriXM8y6eeJu0vlKa0C9kq2rq1sOWRClhdLHPocrg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.58.0.tgz", + "integrity": "sha512-2ZHxemzgHcjtktAuVUwSoyXmGo/t+aF5tS1ciPpPei4rhSyrz3JOqDosXXrmhN/yLUSzJjtuW7ToTWqfQpCj2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.58.0.tgz", + "integrity": "sha512-AwKkVwjVmFQ3bcO7j0McGYAqCKH2a326fswfofng/E8VewCT/raeeGQr4huVhY704deK8AWASSTlxzMj0eZc6Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.58.0.tgz", + "integrity": "sha512-xsRpTxfUnJF8D3AUKko/qyWdjw4GZVHlCVFuGlzSCTeewLmykKINW8em1+wx+axsDVtJJcMtvsiaXggXxrlHgw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.58.0.tgz", + "integrity": "sha512-Z4AYOTcy7nYEIiXwD62PlerimyYRcfJOgUbQAEBjXz098kxKuERBlRntofGy69HHhe9E0TLVNMl1yspVNu+efw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.58.0.tgz", + "integrity": "sha512-A3nhhtZPC/TKVWOPj9q/H3p2znJDCcHWYlJBhWL8hGq/bFmBaNBHC8Np6E581yVq1w9Mi3rMDNzDalWvtUfJtQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.58.0.tgz", + "integrity": "sha512-2g+tVkgwqphw8R4hgo+kF4oz8+P5RwVOtr9+irsC7uwEp0e9j7Crw8kDGKL20uYlLPD7g02DqA61mC/UNYx98A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.58.0.tgz", + "integrity": "sha512-rc15P6AbyyB7426aN8AakLd02Trb3a6ML/mmfAQeVHJEfVofWLcWIrBdy6zDEY+DIaL/s8E4GGPboVw+oP3+EA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.58.0.tgz", + "integrity": "sha512-ZWoTM27/HYPOh9iq86DAbhPu9nXb8qKvvGU/h8OfliyVUFAMMNTLDkGsWDKKnDqIkqvZ9+dXlgUOsH1LYO3O7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.58.0.tgz", + "integrity": "sha512-LHZnqFXe2dEfkRI4XdZS/57nEOT/I4UCRX5IyM9v4GYW9XwQCjGe1IUK59SuKw3POwvcgWQ4pme2cYXmNqTNPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.58.0.tgz", + "integrity": "sha512-mZKpg20TpheCJym1rarcZCUJeW1sSruw8zAAaCYWvuVfwIUDN1CXdrPU/JgCWReXTCTrEfCB8Wyo3hh9jSZ2EA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.58.0.tgz", + "integrity": "sha512-N/wUU4N5PZ2orBtI+Ko7MnMfYLfE7K91UrGMY/c/pYyHR3lA9kwst1XugkZx+92YcRh/Eo+iv2eTESSWXfiZPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.73.0.tgz", + "integrity": "sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.73.0.tgz", + "integrity": "sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.73.0.tgz", + "integrity": "sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.73.0.tgz", + "integrity": "sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.73.0.tgz", + "integrity": "sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.73.0.tgz", + "integrity": "sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.73.0.tgz", + "integrity": "sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.73.0.tgz", + "integrity": "sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.73.0.tgz", + "integrity": "sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.73.0.tgz", + "integrity": "sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.73.0.tgz", + "integrity": "sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.73.0.tgz", + "integrity": "sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.73.0.tgz", + "integrity": "sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.73.0.tgz", + "integrity": "sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.73.0.tgz", + "integrity": "sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.73.0.tgz", + "integrity": "sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.73.0.tgz", + "integrity": "sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.73.0.tgz", + "integrity": "sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.73.0.tgz", + "integrity": "sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/child-process-utils/node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-2.0.0.tgz", + "integrity": "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==", + "license": "MIT" + }, + "node_modules/@vercel/analytics": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz", + "integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==", + "license": "MPL-2.0", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", + "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001800", + "electron-to-chromium": "^1.5.387", + "node-releases": "^2.0.50", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-9.2.1.tgz", + "integrity": "sha512-oWSL6ZhnXbYraOFTK3PgRAQJ8fADDAEv5K6AdeyQPLvjFmhG8+ejL0jZZp/R7vTmGJaBvZEE+sE7dB4bCv7sAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@conventional-changelog/template": "^1.2.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-10.2.1.tgz", + "integrity": "sha512-n4Kr1HFMTf3iMbES0TMxKIcYtUUv4rKqyQQp2JwfOEfFCOfGT3Tq4mCyJ8S9/YPyWhydjfKrrvnyl+gCjA+mJQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@conventional-changelog/template": "^1.2.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/conventional-commits-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-7.0.1.tgz", + "integrity": "sha512-6VtskFpPsNkGVk/TY2RnV/MEdKfvCPBtQZN9x8jh9+k5RWBQ+tiaWn5UFCzTr0Dd88iKx7xghxbjBRp5uIzp3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^2.0.0", + "meow": "^14.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/cosmiconfig-typescript-loader/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cypress": { + "version": "15.18.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.18.1.tgz", + "integrity": "sha512-JtkTVtUE2lvLYgZCaug+Uai0H9IqsJirlBO49c87QwG0bJUGvAUVBz1EJve0b0oaYP244Ew9M0BkrHpcqkYxmw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "^4.0.0", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "@types/tmp": "^0.2.3", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.4.0", + "chalk": "^4.1.0", + "ci-info": "^4.1.0", + "cli-table3": "0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "fs-extra": "^9.1.0", + "hasha": "5.2.2", + "is-installed-globally": "~0.4.0", + "listr2": "^9.0.5", + "lodash": "^4.17.23", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "systeminformation": "^5.31.1", + "tmp": "~0.2.4", + "tree-kill": "1.2.2", + "tslib": "1.14.1", + "untildify": "^4.0.0", + "yauzl": "^3.3.1" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^20.1.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-europe-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", + "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", + "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "dev": true, + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "deprecated": "Deprecated and no longer maintained. Use @conventional-changelog/git-client instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/git-raw-commits/node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/git-raw-commits/node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/git-raw-commits/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-standalone-pwa": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz", + "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "18.2.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.3.tgz", + "integrity": "sha512-N5A3KTWQpPWT4ExxxPlUx7WmykGXRzhNidWhV41d6Abu9YfI2NyWCJuxdPnslJCPWtbRpSVOWSnSS6GakLM/Rg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/lint-staged/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meow": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.10.tgz", + "integrity": "sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.10", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.10", + "@next/swc-darwin-x64": "16.2.10", + "@next/swc-linux-arm64-gnu": "16.2.10", + "@next/swc-linux-arm64-musl": "16.2.10", + "@next/swc-linux-x64-gnu": "16.2.10", + "@next/swc-linux-x64-musl": "16.2.10", + "@next/swc-win32-arm64-msvc": "16.2.10", + "@next/swc-win32-x64-msvc": "16.2.10", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/oxfmt": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.58.0.tgz", + "integrity": "sha512-8feG/7NVEHDVwc1OUpP6Pks+TnaDFUw2jLLFIMi5bcmmwxAX2wBQvjSzj62RRTYBf2Op1Wt8xbkmagmPTR5ETg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.58.0", + "@oxfmt/binding-android-arm64": "0.58.0", + "@oxfmt/binding-darwin-arm64": "0.58.0", + "@oxfmt/binding-darwin-x64": "0.58.0", + "@oxfmt/binding-freebsd-x64": "0.58.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.58.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.58.0", + "@oxfmt/binding-linux-arm64-gnu": "0.58.0", + "@oxfmt/binding-linux-arm64-musl": "0.58.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.58.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.58.0", + "@oxfmt/binding-linux-riscv64-musl": "0.58.0", + "@oxfmt/binding-linux-s390x-gnu": "0.58.0", + "@oxfmt/binding-linux-x64-gnu": "0.58.0", + "@oxfmt/binding-linux-x64-musl": "0.58.0", + "@oxfmt/binding-openharmony-arm64": "0.58.0", + "@oxfmt/binding-win32-arm64-msvc": "0.58.0", + "@oxfmt/binding-win32-ia32-msvc": "0.58.0", + "@oxfmt/binding-win32-x64-msvc": "0.58.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.73.0.tgz", + "integrity": "sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.73.0", + "@oxlint/binding-android-arm64": "1.73.0", + "@oxlint/binding-darwin-arm64": "1.73.0", + "@oxlint/binding-darwin-x64": "1.73.0", + "@oxlint/binding-freebsd-x64": "1.73.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.73.0", + "@oxlint/binding-linux-arm-musleabihf": "1.73.0", + "@oxlint/binding-linux-arm64-gnu": "1.73.0", + "@oxlint/binding-linux-arm64-musl": "1.73.0", + "@oxlint/binding-linux-ppc64-gnu": "1.73.0", + "@oxlint/binding-linux-riscv64-gnu": "1.73.0", + "@oxlint/binding-linux-riscv64-musl": "1.73.0", + "@oxlint/binding-linux-s390x-gnu": "1.73.0", + "@oxlint/binding-linux-x64-gnu": "1.73.0", + "@oxlint/binding-linux-x64-musl": "1.73.0", + "@oxlint/binding-openharmony-arm64": "1.73.0", + "@oxlint/binding-win32-arm64-msvc": "1.73.0", + "@oxlint/binding-win32-ia32-msvc": "1.73.0", + "@oxlint/binding-win32-x64-msvc": "1.73.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.24.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-icons": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", + "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/start-server-and-test": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.5.tgz", + "integrity": "sha512-A/SbXpgXE25ScSkpLLqvGvVZT0ykN6+AzS8tVqMBCTxbJy2Nwuen59opT+afalK5aS+AuQmZs0EsLwjnuDN+/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "arg": "^5.0.2", + "bluebird": "3.7.2", + "check-more-types": "2.24.0", + "debug": "4.4.3", + "execa": "5.1.1", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "9.0.4" + }, + "bin": { + "server-test": "src/bin/start.js", + "start-server-and-test": "src/bin/start.js", + "start-test": "src/bin/start.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/start-server-and-test/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/start-server-and-test/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/start-server-and-test/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/systeminformation": { + "version": "5.31.14", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.14.tgz", + "integrity": "sha512-nefRpMCsAI4m71/6JHH//KPaP/d5nTuRVxEtQ7N7SlBrX18DAcC+5Z1JKZYeN9Iw49qMx95BTo/gBMk3Y2H6+g==", + "dev": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-is-frozen": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz", + "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, + "node_modules/ua-parser-js": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.10.tgz", + "integrity": "sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "AGPL-3.0-or-later", + "dependencies": { + "detect-europe-js": "^0.1.2", + "is-standalone-pwa": "^0.1.1", + "ua-is-frozen": "^0.1.2" + }, + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wait-on": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.4.tgz", + "integrity": "sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.13.5", + "joi": "^18.0.2", + "lodash": "^4.17.23", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/yauzl": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", - "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } - } } diff --git a/package.json b/package.json index 8f4a6ae..7cee68c 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,58 @@ { - "name": "unitystation.org", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev --turbopack", - "build": "next build", - "start": "next start", - "lint": "next lint", - "cypress": "cypress open", - "cypress:headless:e2e": "cypress run --spec \"cypress/e2e/**/*.cy.ts\"", - "cypress:headless:unit": "cypress run --spec \"cypress/component/*.cy.ts\"", - "test:e2e": "start-server-and-test dev 3000 cypress:headless:e2e", - "test:unit": "start-server-and-test dev 3000 cypress:headless:unit " - }, - "dependencies": { - "@types/ua-parser-js": "^0.7.39", - "@vercel/analytics": "^1.6.1", - "classnames": "^2.5.1", - "flowbite": "^2.5.2", - "flowbite-react": "^0.7.8", - "jose": "^5.10.0", - "next": "^15.5.7", - "react": "^19.2.1", - "react-dom": "^19.2.1", - "react-icons": "^5.0.1", - "ua-parser-js": "^2.0.7", - "zod": "^3.25.76" - }, - "devDependencies": { - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", - "@types/jest": "^30.0.0", - "@types/node": "^20.19.26", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "autoprefixer": "^10.4.22", - "cypress": "^15.16.0", - "eslint": "^9.19.0", - "eslint-config-next": "^15.5.7", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "postcss": "^8.5.6", - "start-server-and-test": "^2.1.3", - "tailwindcss": "^3.4.18", - "typescript": "^5.9.3" - } + "name": "unitystation.org", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "oxlint", + "format": "oxfmt --write", + "format:check": "oxfmt --check", + "prepare": "husky", + "cypress": "cypress open", + "cypress:headless:e2e": "cypress run --spec \"cypress/e2e/**/*.cy.ts\"", + "cypress:headless:unit": "cypress run --component", + "test:e2e": "start-server-and-test dev 3000 cypress:headless:e2e", + "test:unit": "npm run cypress:headless:unit" + }, + "dependencies": { + "@types/ua-parser-js": "^0.7.39", + "@vercel/analytics": "^1.6.1", + "classnames": "^2.5.1", + "jose": "^5.10.0", + "next": "^16.2.10", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-icons": "^5.0.1", + "ua-parser-js": "^2.0.7", + "zod": "^3.25.76" + }, + "devDependencies": { + "@commitlint/cli": "^21.2.0", + "@commitlint/config-conventional": "^21.2.0", + "@types/node": "^20.19.26", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "autoprefixer": "^10.4.22", + "babel-plugin-react-compiler": "^1.0.0", + "cypress": "^15.16.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", + "oxfmt": "0.58.0", + "oxlint": "1.73.0", + "postcss": "^8.5.6", + "start-server-and-test": "^2.1.3", + "tailwindcss": "^3.4.18", + "typescript": "^5.9.3" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,cjs,mjs}": [ + "oxlint --fix", + "oxfmt --write" + ], + "*.{json,jsonc}": [ + "oxfmt --write" + ] + } } diff --git a/pages/README.md b/pages/README.md new file mode 100644 index 0000000..9318275 --- /dev/null +++ b/pages/README.md @@ -0,0 +1,10 @@ +# Why is this empty directory here? + +This project uses the App Router (`app/`) exclusively. This empty `pages/` +directory only exists as a workaround for Cypress component testing: without +it, the Cypress Next.js dev server treats the project root as the Pages Router +directory and applies page-only compiler rules to every module including +`node_modules` which makes component specs fail with +"Using `export * from '...'` in a page is disallowed" (from react-icons). + +Do not add pages here. diff --git a/postcss.config.js b/postcss.config.js index fef1b22..67cdf1a 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {}, }, -} +}; diff --git a/public/background/layer1.png b/public/background/layer1.png deleted file mode 100644 index 4a4d02f458258c54983db696b58fcae0fc577d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73148 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

    d2^yZeq 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 F{{f;#Be4Jg diff --git a/public/background/parallax/parallax_layer1.png b/public/background/parallax/parallax_layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..555a0da5d1a07b61f9eda80adbe46cb6f6ac1023 GIT binary patch literal 73045 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 literal 0 HcmV?d00001 diff --git a/public/background/parallax/parallax_layer2.png b/public/background/parallax/parallax_layer2.png new file mode 100644 index 0000000000000000000000000000000000000000..3029a33b62dca7c5322a8de995b7a6e4e3131ad8 GIT binary patch literal 47059 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

    Eq_<|20Tn>eiGd^ra%L+ZdvW(B5YV(-w~ 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/public/background/parallax/parallax_layer3.png b/public/background/parallax/parallax_layer3.png new file mode 100644 index 0000000000000000000000000000000000000000..140c692e721a84f413425d3b8e7b505f5b09c776 GIT binary patch literal 4553 zcmb_fdpOkT9{-I|R92B?+>1?;(5ev{?3PQZB(2*Dxvv>pBBREbQBQK8+M)|lW~Iq> zFi~mxwK2*itdt3jOocJbP8f{Ad8f{vbK16cpY3=a|GdxdnfLpCzn|MTdG{{IFBWSo zh9KyRZBASFKoFu&`Y*o_oDd%~Ga*Rn)V8hP?2XMC=_TQM@Wck;> z6HbZbsLIOAzxBQ%F*J&_jqfQG}U+H#6L%L7{?*lwt0 zG79Ag)fgR$oUX)&zprL3VKMSsG6D@(w#J+5937-^hYIgr#GF99h=L)_%Z4e}+_ULS zrdDsMUs3G_=|eIu|LLpVyY&5MqcLzN&(qjgi*iBRVyo8^^voNmO%0rObXc$m&&TR( z1kdFH~HuZjNQu(|0{h`93A5m;ZJ+CEb1 zSlGelJ0tDnJbd{bC;Xyw3o4k<;M%-mg)QUA*$D!t-{R%$Ax{#8?Js0(k+KWoK1 z1bk4PZAevn22yS`nMOPAn#JH-npMf7rq)MwFJ;Mb<^_=g)46XpXp~6LQ<4TlD3I8Z zVWqlcNdxznU(F+Vd~W+tbj9j>yOlozg7@d~ei5d-RqWH!(n4BMD9~BgB1XPp3V#iR zbR?60Hf}n9;mDDm=#JsQ;*FV@Lcw=N6J6B;(WdzExv&iel>?B17GmynyMy(QH(%`( zj^Z&YmEEG?)*-@#IJPHlY&KFr)TJaRpWs_U$Of)F>1V@~uxdOjh~NRn+D*R^V?)^E zx3=l)XCu=n-Moy@yxEZAva%o-8I+-vFk0Vyz@86!_eXkt@PWdG3S%leCw-)QvK}x^ zq*V%tnYiPQjZ)dIkxRlv3&~-A*9~ieq6Z-DmaA^j0Y41UVqaf4P{$L4!hOC`QtIU^ zLAacJ!+aYXCH?gpYNjR*g&hxb>s+KXhm|&baOYnZCH=tPKOOyyPMR+YtZILhd#FVg zMNZggi#N6roy?n z3C?!BZOo})K-L(+Elm7x_sdv~({4b&)@_wapMKaUb?`5mHf}6s`g+To77h*$gu{y< zlqY7%Z_UkDVw=ec@i|`v|`3ofXfDoFN!C(#!8oJ>UaaJ3gLH zubC?G^z$34Uj_O5PZ+}xoOyG}hbs9gg1}deQuG`&N3L~xyQ)4<0I10&)88bcCI2o<&4L}%Ol4Jv-^K}6R=rWcP?<_qhOa~Dmsqxxa+4+w|6m# z2Yi^ds;!vG=x8e}`^<_HQhyL2{tqz!Tac6bkXaCT%%+2Vqt_@dK`t)}m-&-dngiI) z4O0D*PF$)E{`XmwcpTsFmN%EW=`gRG?KZXMo%Hx~&jzbg(_=Q1BG*`5+Vzf3|2ypc zXTG#oN@oRCc}KZs`5r6(?#RS_gCYxj-CAFvT~Ac2z_HRY8zbkW2bVu=+_hSRT5=xO z;^5^D)MQ)Ff-ka*jhn(YT&3<&PcJA4&F}DP%9RC{8lS(tK*u^p;*(=J7Aw_=Rs_n5 zh?m`0#0Y4W&`}Xpm4&z;%*{`7EjYph^zwt7Q}Q3=BF&=3Ch*vpBUfMd$flSUrXHa& z>&b|3N3Cy(YG`kc4BW=M4IyFoHar*}?EVS6{|lJ^!LC0A#E&Kl=@oq!K`gL$ z4QeGP7{KsG8pWmV-tkG+`1lpWCU21z%2P(c=M4LyX8)bLV;5?MODF5QJk1G;3dMSQ zx7hmRd#>+XE;43l$kY4i*V4&;g>w3A5k?jR#b>+@;EZ}Wlssw7y}uE_4dGsb=1vJY zNlS@?wt)l9SAfbMe_IDsV-xI^%4VOdXZGS*`jmL9taC1*F8xM}%wRI`2_OaBUkf@1 zV`jJOsz{5gmHSVw`sa-vF96c+t({sij!k*-a<%55GnZ=~*PmT5RZ?Ex?saeSIUi*50!s_q0 z2s|yMfjt`>rXfdvpAmt4%u^+WVo6_;G1favjpuZ~kHDsmPc zFJ!7ZJFlj84B;9#&Mr`ZvpljGVQ73Ek9P=s%Q=f(Y*y>!s?t7k)C;=v%D^}_!6ESL zADI*B?cpuKE{Mb&=>C#spw@D>;^Z1(pXv1Ak~X)D%P$u2xXbCGa~ZKb+I-3qwMT$N ziRYyX6pH&KxIRb6KLK#$Rby;BZZrufBYzFtYDeA=@7Tdln;D&n<@X$MJ6mwhOu?wk z7iCt$%82buuC9OicrNK0D7w_`t@Xg2MeYp&KaM)(Sk3f$dc~U%6c1jKrkhQFl?MM1 z$v+02=0qUGgra5YfV@z zJ@$2SEMIss@bKX^1VuXzFr#ctfM;g#Iz1D6X=bRPg)`hAho{%X3UN{k06+N?H0eZ) z(-Spwl(1_Hxes;YF(&)GTXJRXbR%VZ_0No8gxE=2mAk)Pq}W$lUc$(cZMdd=I<&pK z^%nTAa!GS>IX1IIM>-@yeIx;pbB&t3RqRh=r~)t!Oh?!bR*S`aIB2%&3pFKw=x9ic zC~FE9%*X9DIuuMA4gR)=zzRG;8Z-3xq zn;OET>1)=-?#nMo1}QK=jlPq&Y$^EK33EDeCZR}t5h&N4 zOADa;B|t(>oaoMP?^31M3hMzNM_1i-AS3*dXM@)@R-`$fb1&oFRg-3P%%@kxKYPUM z>niq2B~N_#9FoW5aIgzNNEh-=BL>}F%UWa?H;(j6n!c$I@U$?uLFv$U;6AWSMEVP~ zg%7BC=~A+TR2?SM{2h?d#tPMQrnb7hrMjBryw8gurQ5x-q_HUN%1Rij{TXOst>o2# zq_>OAuXH7epKRZ%mYvU+2?&#``@87Xbz#&?m{3C%rS=vbgdM4<(;Ij-7MS|%Cj98b z!I%PW=&IjCb(b>2Bt;Ks77&SpV_@aq@BBCnY)bb}`fB1iv-iT#U`w-e0ZR#3Q@qj` zSL1?Y#a&tQ2ifZa!w-@8-Nen|j1ZC5AdN=T?2lL~aqfw|kImmh3k4E#`6rCOd2#V( zHNUw=PTkYFnT|*ie?F)+A(vNN#;RPcn+$qZ2O(gx3`Nw^j!!`;&)v>*gg{@2b_07tH#l+#EX2jzZae z-yi4%X^u>%s&O?r;y5X=FGRTnweE)^ruMaEZpSoMXbcZG*<wU{n-?rNznTRuykj z`zdY<(g)-n4%0gDd#r)Z^rL}*R}xyf_z7gT7dCr-zw64;fD%(kigWLP-G_hn4t)Zu9XM5NV2Uit# z6gmw;wml6AQEWJHXRI>vCCe{kdqFNH^uENjci2OwDmzCEfxm6`ySA2o>woND2{HKe literal 0 HcmV?d00001 diff --git a/public/background/parallax/parallax_planet.png b/public/background/parallax/parallax_planet.png new file mode 100644 index 0000000000000000000000000000000000000000..b75b61613305f66ed0ec6e7e179e2e3c5f1e74df GIT binary patch literal 17779 zcmeIa_dA>a_Xn=kmQwVkRjt`Yi=wq+YpJS{T8Y@BEo#MHA#|ZAYJ?i4W+e!vMvPEe zD)z1#LCjD=q_M*H_Wu46-|r6}*L7d6>vp@Jch2*i$9bIdICr9rp6GC}@v$*6F>&ZV zerUqPbYkZCU_AqzK@Q_lOibF!x(^>fg0lWjA-_2W+AQt%1yYbgaHvSCJ@@CN!oP2C zzB7U+?wtVof(JaI@bcCTH!r>+Sda5TyJq#NSrMk z5F;sm`xd)iaNoe>F8SlB$9K(dq9;Svl|sUo5}Lx74tnwXs*{;k)vL1%g0fpqRUfGg zlhwyK6#Dy}Mff5UlVVj;jRx?Hyw^`&W_o$)d8tW)W9DN?RD-6dOlnCUiqSqCX7N9!3x*K0Q4MUEQ0n?w*p7Zjn~q*BT4px`5N{&!ENr@RgWA z**FOr4vQJ2XHIrkYU-&aW{}a0rUo`$9L_{~n5K!aF;7+bBE?=)|4Zb)`hAo zDNXL$kR;WA2$rh#l1hWzrX~8vCMIpw{1u3EFT5Qp@2!FAL_|2lK8d?KukT)9a4>!X zA6Nd=-HNmNXDB;QdE>Z+EyQ6@r&?2r^EJ_v-2SoM254@>lpvjS6CS-%(*hZk!vlKKQ0tz>k(3dMa9b2^-%~+Wu+vuqPMJ=ah{B;DTqfj9d>U`3MB2R z11*FL2o01}^;hs00 z3;gd#iy7dqCo|95q8N?oKKdvL=%NcxOS%ljk}Q}`a9SANPle8AB8r1#)4z=Po02QH zHW$L9qX=UKO#FJn0%zycy2b2jr8z_u2%XZ89SK6s(5B` z)Trbm+uygx<@t8mU8HoO=M!!TL|p|;uyDSmMZmYURw+m)6?!AZG+kN7A9CBY!&JYq zq`QGcjdo5=<@wqU9?*N9oe{CVxN=4^-E^vCUv1e<@?;`;VhwQ6V< zsuqbleOUu$6|d}Z&R`J>HdvheuU_?^LX|V!lod)Bg5`w$dU|Bxf0Vnmh#Jb z>wJxqiQLvWxYDvF!Z&w(90Gw>Vem6P&;73aa$qtW*H|Mg)Cgfi9JF+`aA$ntp7XtU zu2qP~LfrT)vBOb%-{9#9H+cd!i#MFBCZ&Xe1%AA}+yB1$^Q&K37!cde@mYOLPDNEXCPn&m z$(e|b-FGbg^3!*vzy4?ak;g4VDIr~xM2!LIn=Z6K+r@fU{-f6~sjMf?K`y=Zv`GI) zHNgJhMqMLM8_%if3a$qA*{C^c!=e!~{&ysl9e-o;e>BMWmkFHxR9BJ}c~fMhd&+0_ zaqaomq%J%?Tl(Q;G5}S!4 zqnnyqol$ynAFRwy|Eu@udOnS^T6ELxFtL+O-nDccl^l(At`~*DrLPe7w1MZXZQ3&y zY$j_MpJtYqd%&E*k6+nAXi&@-1$j~-$U2+!K-6xG2((3%EJ4jKgl^~wrXyr1VpIqm z-7Tvdoj&NpKzomcAmj)iJzp3^ zE%;q8$tVQh;1QpcPntlCu&5@veQu2;cq~VpNqu31eU;#Tb*SE;gb$hkuEuKO*!V@H zuhiS9`snh7In`E)T)+E(iS&BxJU%%FWQ_=RN_Vz3H;Z#xhrXJqdZ?BjI3j6=d0?h1 zKNzfS0$X^zNwvxg6YOz#ka=|8E+5@j)Gi0 z1ln~?vX6#@@ni;+$2u(ON383AU5V+DBYK1R-Wp!xI;utvTEgS?1rOwHT)=}Fk7|l! zK6WYnj95sDJa$N?_R}85JE_cNcT95)(1E2^em7|&o7vWC`oqvgq{wt_w``%KY?U># za2mZx4VV{avE$L3cOv@sMRPq)?x$g*Mw`w}?9>$K-iD3wTlle#l`tttXpI}}aeWzW zAMs{g=xd~5=&+%WY+%fskFA%IyW8!d3?F`U#RDjVQ>3g@4w4JSmF@SRN!`N~r`I(!*p(=#+ zG^=%~nl7s0_Mk(43bp|<-7AuJcC!t$cJ8bB#pYqW@|~Prd{j6mckp7>heR)_Q(lT1 zobv_e=8QO^?jCk?+0YJM2ThH!9}BIcAC26JHIEelanWq+tv2+_XaP zom5{0d!gy~hCyka`>0iuxRNP!OrY(CUOi>^6_z-X8PYhL*ZFtfki!q@zaJSJ;>e^= zx>{4P2I73+F3K3!XxLkFT-R$ad9mQwFP?TM&8?@)$QGLWpgLoeD*i>f43S%naY0-i ztH^4-X((;S&)s_8h4eOTrqxt25esvI--IIq^3TO?NmWEK{Q-gNy+G5QhaEBXwyF4cseYkxxALX&lgvq znr2Ji>5flWpV;9K6>2U@TrAdjcBNkgPyD+K883ciokMb;%g{Pk{NT$woJJDN-G8`P1{ z<++xBjOvu^<+#JAu>aKgQFo;t0*-pyw+%)ZmXs-+uKv-W*Hqq$AYVf2H+^}il7i@~ zbWP+KdV=y@X-JYmany{jQj|7dd2g688c0Qp{bN>lgzF1?cw#_n zzvZHqzbZZXlfywetAq6mR(tEae66sI()%bhtRNLJ#_oTICMe?%U{C3}2^&JAvtVBe zkK+ZmapFW`idgM7M=p74AdPnj+zI|3GCyvS+i;i{);m7pgL5}So`NB<8$*kGE3x}~ z!{}Fs3f>m-_q#A1VgFdlgL4SRgCpFjmT414Kw`9_d2747B{hFGt}OZiL%z`JIyfyn z{_gylW#;w>vFYK@*6#V|i1EB52UG9?<3$NzH(hw}3v&59JZAqqG6D%a1$U4PwOjC` zuVHqcb}J>9Q4Ac3srMGL!P{=V{qr{u4x*Qebq+S~R$G4T)4i=^mA!g8KQmG!knuy$ zj+m4gV@-(N+Oo+B+J56xD4qhPrmL{A$3LF!EBZ3LpY+#g4#_hL%ZpEN*M>(grMkRW z7|i-_@2&T>Yd~nf!~gy=<|oBF&N@4RLOV+Y!{93IJ-xcn-6Fi!V2lA{)3P%{x%_A+ zdV+`_gc(0%F3IcXU^MGw3oh?{s?wzYTzaAw>iMVXx~}PxX!xm3{~=Q!oW7k{qreXI zaoWYAgwSVTyG|Poya|*R0jb-z$qC(N7B3}JYfAY(La~B^nsr8o5s0LKpj>?Vp3kcI zrl9y8+N4awi*F7g+M1Vn*-l?yO9Af>;z(c*TyF?S$= zead21BLSMku;pi{nni6Cg>#D)3?raROAKK^9<4B9m(awjOATTNulQ3g4JRFx+u zwWcf$dWJqL6Zme!c%8^QczAU1OIjR;v9_otz^=3u#Xnz=7Dv-XXm@DYyyAgT;-&eT zD)Xs3zchK7h}v~C8wo8s8Ev9DLHg|)4& zdsH+z=)JQz1n#9>%@(pB2_NX`2G3!X-+C6me3o4C$=}bW=%JlI%=qybWo^Zzwz9tO zR?l!Q-*n)7qFoBi6lLu|FIeAMCU=g|ysMg&7YO#LVlca(!*HW#kneTp&$lR+k7Q&Q z>JC+*tx`&?MW(5mHjdeyWdeSvy%-tkeR&%dXi5XW7;JoLKf0rRb`^Rz0zVxDEm=8X z#)vR|SCko(#tUn?7OHhxAX6C6FEMwc57je}Rv)M1pU_sfXF(U*jpYi;{lTsuwh%qn zw&io;0y=~F4sC(lISkDeOsdyw%rdk#*I}rZCW6BOhyY;XqIa{WxY+*pX3L{`Zc2zl zIxS{hGCchVS2zvL;}Id0TAM%9j&9B9MNbY=@Xn8R%x+{+kZ>b*BCW73P{KFVnZ`In zQ=bXW<^OT*4hq?pc9CCVws8+fpW5dYHiEB6mOl=Avehpzm6-OX{BTSoP-3ZvN$YvrPzqRcWX5J0`hxZ%SM7AZ_LI5oP5aw z*Iq?$G}1vkiw{>9SjyZp9y6iX?jL9!RY5rJinr0L&#S^)&agbM#Z9)-~+#{&&kJ)V} z=#zD)QDUYJHIpTJYF_UgEpgidWzPzzC>R2 z+qLt~Qu^U$*oP(^2A}q&iF9w2B%7MMO zf6NJs1>;;Xgle3NtL5M<(i1M#`HISP;ytx@zz|6&kzTLclh^I!Ivm*>Lj_}oWks^h zn6b)wP1N!y%j){WiDIU6f;eT{AZ5-p*Zz?p-Ojsxu$VnWW?QY8+-mI-w6#h|m}PAp z6o1pjb(`AA7G!3(afkNGLMNMlS>mUky!Aw%VxrY`3-P!>WAU+G1=`J3h-s>FQUseK z0%{AkpX{ehr1&wDDz@k5ny9ev-4-Jc=3X@Sq!IyUcX_}OAxl~WP01$F!<*LmNq z^5!-owtw6DcA`Wuwmzxedsk>ckgi!4=bfo3nH`0-tk?%b_UO()GOJ7$Vt#rBBjryI=f*+h3 zg5!6cM&sL+Vwu{NJbHP(u6GL6;DpOl23uw$@OzBX}bT)}_4 z1@8Zp$M@G=u&c4;M+l+O4IPLI9)GAj?LKWHonj!brZYPsH&Wc$*#Ev{*dq1s4ZI7T z0NH8p^DyBe_Hh2fumlyqZ6+rl&hD6;_A;T-{y`!=F|K!0<<^fltW;9j3m>lt+YSgH z^|QD-oXc7T!Y4UiNKLtFWpf9wmb)@2w=2Vy{~7R=UzpvdBAL*__<3}MPa8Ko zPUOo_y1$?;(0=xOhGGLS4`nkSeV zY=^chc=EMP8Lx#dH(yk_N$DC6MDIreRZC$|@@Z+zGY>qaaq2zU^sVOO^)S+7VSMxC zn=sj)z9c@7MREClWA|t5Usj@h{qCQRp_FWeG-$Z$?9MNG^S`BeK0Sbc-N(w~&Lr7> z*nT}}CQ_z{z$=43$R&M~5=$%6*my=cI-eWk%g1xK*HR~5U?A~^&Q0AYPQi?QN0n!@ zah1E{C`gxnkxU=ql^OY$s_|U#ZfaH;OIailJ10mxjMo5CkXk}R3|;~&Za@MOsC3%@gjDcBPVq2U*OuuZAPTi z@(P}~J_#ykabWFC>D=UsbMOohNsH&KjZfM+F%XH(#Vft7}SjafcZuyS^Rl{y!!Q z-NGoowXholZPGf_j4UmQM|DlZ#PFf!FBS=or{w=UV#fa4DZnulEI(Yq_#Tv|Y zpbLTG2`Rtk$%GV~gs)hl*cC3JnEkMvgtoxVFnp}Iy-NU5d3zL3q4%lJ9e(yo$p}&23%+4ST%P&ti*2V z8ke2fPhNKZ8=xlM=cv8wm=p9gch^EZGvCzkIoaF<`+FO3kIUtB0Ss{; zK+pP5O@$eOZ!CH`a!*dX6U!lye{((m{64S_?^6)B*Bxn`c|a4Y$>rvJ5K5yU*8{*T z@Zx~gE~7}%6$ESZi>`PvrYE42m&=M_*Cu`omBLk=N+ycQCPPC;ohr|d!j0_~ z>Q;7vg^EvR+wGpAU47rS)kf#4m80Dj+HBm9%a@eb(C^}C*-P%StK9G>7uDX|ZpY8u z%V8T1;#fA||8nhTrtAhXg35OE*}MHt#-nc>rL!hs-nR(Pr;QiU%Gww|8QRaT;Ns}0 z8Cs`!vNw@Zc}f1XXAuPyFxCle+OO{o`X1L~pq7-%MFgpB(s1RntJQDnt|%AFYp3<} z*&>hX;&`X~w*f{k<1(PAMYNDJB^dy9d3#p;1Li7^(N+7veI`N`tg_QlcGTbq9-p;h^~XI zzInB~7?r=wKO|!2il`!WCE0Dd(Zox5D*n z*LC@MCs{izW+f!)`mK2zHbq+~Cs^~WngZUAs_~{o=rTwvs>s;|QMRnh`v5&%&Xq;o ziF)thP3-}NOnTOIM#$RUajR1w54(GXYY}kM>|1to#?>nDu=qz>9Vka6EYA@$S9Dq_ zLwx4h7s7v|*UU-hIcNEsA6bix5x>C434z8$&$@6kqYj>pB;UAO%{R4GuDU3{AiXjl zbXj9by%dP5KwPT1aN@nky%I4>f38+oSusgx0nT ziBRd{)}rk&Iecyka$-zk8nM%Bb)w{O{At%)icYqjps=&WMf_~j(^wXy#n3z2o_+mZ zJKvX)JW-d7(yyO@-MW-}c5l6bQsbN*ylBwmao}i6z9b6641=Q$(1vGd9}R5P{V=<@ zdK=F$tTgt&JFX|Oo`inLi4K&fIaY>~sQ7jX+ES&dc&SxRPDOg+pmF>NQtx@=|r z^-7#vEAd&QsGQgIjIdk{beSbS^K+k(uV0g9%sy`!CamrH`4QYo_|fL$<$b<03K6Tc z2T%aW)A?Ukoq4J|*da|+3**o=&HuDI%O4Ns@j6haX0&S+@-Oa7@deR(Z6w%BNS}r3 z^bJBVN39nrNBmqrVwf$JnNfGWM9;VUt~6TcwX)Bj`fi^3KJ&AFva}ya4AgXZA%T&3 zmq|jwZ8Hv$Tq(Cw`-$fzxbN%|8RcpElV6yGpV_(G%|2U)+r=hRGe2o<=*3D9?W=e; zpj@hj0Up9@ti zmfw+g`_orS1?T>T?1t?eIy}qqES)|l7*D}tWqmVD?+Cr%VR2)f^g3H!J-#tDcfZsE z`5laGJ0;!AKRy@5)TM;jUJknHr7k^<70p=&qM6bFbi^0AwB&S8M zb0_F6XkEpqtLwKGGUYk4+4|UL`QM7%F4Se!=Sz5-earpKf35QP$NVKT=PPKhU{ykP zAc+@gYs}gH4KDMtv$51OC*Dg&Ysp!cmop~im{xx!-ca_L|CPS`;ojJM$;1NmJm~Pc zmmOp((g+>3(a5$l)7!c0b(Sn)6F~y#ssf}D+|xCSSA6Rn_s;fFBdbnm%A&N&l@hL+ znDA-v_6cTQfs>b||HxR?3aTN7wX{ReTw2`t<6r)1sB~`(S${Hn`bC)Xa{#KeuPI8% zwaFED9#|;TEWPccR=w@K4wS*v_h|!=zoTtI*$C9cFygMxko1F1+=uC+m1Z4rhb$_q zy?dtF@nc9kO0x)o*3JE4yKr{q&o@2Jk%BMDYj^^DVu$^Lm(cZ> zUp>ff>QO~2L46|)6#PW*@7Mous0oRSq|cK4IbG!1k2Id<5jMrqiy1VIORbyy;i=?j zc2;hoVMFUWvk28&iXVAfr4`<1c4w?M{M_)^;}?^&InC=U#GVDDEO!gF$E&7sns%Oy z1DC8MxwDoNM%p;YX>W%JpJYD#j~)Ws&fX_AUHl50VzHqtTW;O4SC^e`-uluRxxtYU z@F*t2MW6OEek=>`0Q1BMhcrm?F&ZB(@4wHNn?lUW3NdF@0n3a#1;i`GnI<_k!K-nf zt&6Nhg+WjB7v>9MMnuItV5bFQndRP6a?`f`=woRU&Oy@$Gke2DMQn9=O(?^80#h_F zTeWU=b-kodes^CYk2+ibkd>s`qG$d)09<0*vno4X1g&I4H5-kxSe?#y^=)mniQqB& zMey4xTN>MrM;+D;?HrmiPX!s{xXnyYho&dBkCbKnK(=}>gbc0oOwniyH5W@ungfxv zGQ`AJ58^#Qm-0j*`4F15n%YF2NsG;$9N$xsdYv8 zO@(or%Znr|ezVC4u0Fj~e3=g9is6UVKiX&whPn@Yq{JZdKci4$-oQC+*e z!L)6_=X5t|UMg7)qpVDCiZH@!{C!N_tHomh=9G-j0DX2WZxxC!}yy?X^+DP+8 zc2L}m!Gb~nAaxpIXhV+FZZ*A3*xlgq8*O>w3%VmaHlSXGf%^1PdR+y!= zLylq{rAeH(La6EBRn*~B`O#i^0wq?06cD@s{c&^_f^iefcFgIJeqhM>feJT=)~+MNJ_oK_T9}_53tunFXdsA>FQ8m~#BK0WN&=i1V@z{XZDYMJf;4Ikpwx5Iga+7-2o z-VR3Trni}hAXXalRx3z>MpBS>?#S^R#}k(@c42cHWhLbq0i-yP!ZdG=XXSYCYRfTm z)z0K80xvnM1(aZzIMX1Gm!p{0#f%MI25KKRs8VA~O-pan1V=Y*d}xm3ru7R6$l}`t zfu)e1ew-hrikV0IH`Z&*dr4kJpC48c)AJ`k(AbV#y0~aDt0EylI&Ztpmx*L-$aZ{J zmwrpxq1k2DPhG@+cS@5gi}I@jvy$AkF33H}ERt@tuzT%re^enlGnbu5G;m>2e16eq z!6)_$?s0~JPW{pF{V@s|Ovx#TdtfH~HFT_V#5>t@^3>$8wSX|`Gh0W+j<)FnzYs`T zfHYPD>)+fPrim^B)$$H4g+H=tmPkVFPI~ zL0&bhUB(y{4Tp%kf2sc&QyBKugqRCd>)bSyD?&+DR_SO;j0clmV zGCDze|H6{PEj{LWGPJ8;s~YWjXdU5`HoCxv76`U_j*00fVt zYHJ)0nCmb*Q-R)D2j1!gRYA`Hj49K@@vf2>C?pkVRLK=gTL)rYHO z=B!$dC-A*!F-cLBaCf>$d%sjC+OTkwt*0NWxuqGgpclG4*v}R>&xd;RRW9YZ5C2iK zeYD?^ucPdCQy-__5xc`xD3x-$>)bn6SA}e-LvKi!Kn2YvW^TWAwHwhCbl zG$qAd7kPM;qC_Yuj2L7OvF6BGF;exJe+K}7p7U4EZ_!Nc7H(!ckL*UV^zdJKugn*4 z-V3X^Zj%MG+XKKLjc+sju=XNNb!2+FbM}Bf0NsT`AsvE&%e^X; z$-#Z5iC3a8zPV0Mw}9yp(u+VP@@UL9!~^L$yW+I`AVXpe`%E2U_Jgle9+F+h#<9R> zCh=_Hh!KSiPPjSck8zL0ALhlGCKfDia4hi(t|sKr541He_^}ebLZA}FP=o+c@r zlS@{3QWi6^U!g^7F!($jM2d616Z%HB1|;AAlI?O?#u!n>EqoSO+-dJ#GF#pBxxdgl zQ9g^@)<=YxM1vdBp~cqG>2Z*q$3+I%R!An7wY=7?XvoDXEnkbO){v^X{h^@DlxCNd=8 z_NFx)O;DfBEx>XMKPKyq8XLb)akar3m~6#o5+!u&S7Gom!!`2iv@?s01ndVw58L&e zK!@^neKzaL11S>)>XHHIQ54^tIuzW=~e)p7$u}Wz}hR@0qMiqw)CT zh7XI7okYCNfT4WT9mhQQfNAb}P+&pna+hDC4AH@2pbFBkUUv{lgd-SppfC#n->;UZ z79Qvs*O)6r*bVKLMQ%5al~^f+E~VF6FO+t)XH0`^S8?iN^q=uQ**x{J@l|g}Q~z3C zJ!5_b*`nyylUZ^l75g3pR}9c@b`Ox^Ns3`kDE}nR@=PoZ{lVoM-7se_tD8mK{kFv{ z4$QF<$LsNdfVW4NzSPR`GQF)3XEY5c3*{G@Z5hb9M8fPr<15?mr9TzO(9Kd0PLa4k zXi|Z*G}48(B*O^nv)wZ(vqp4w=TQA3fm(Z%M5cG>tbAJob94iuMk!SIv>?|Nq%cFhcRbdly)$d?@2p>%?GXvokm-^g)WR8RAn#=i?ImV_Ox}BWI997wmEnM?tWg=-`r;;7gL}SJwA;78+=yx1PlJ z*&S@l@=sI5cr1~7ZpTNGsEXjoku}I|+$c^G^UhgK+WzIG<0jbB`#sA+Z~~5&%R*3U z5z%Nonjz0JSaQ;WjiD`$b``siBRC+x>%V;^qX^Q@vMbNNjBcCq(mIyX&dxfv22GRN ze9{KDpXk#%#@b-6wp*2W8+-TkjV3@<@I=lPD3{k`HoZ4jZ4WVSMZMuG`gVK?Ubf#n z?32shF3F%M*CB0+Q-CIJAtt9G-EeVXAYZ46jd*qXhN3a26I6&kCP`q! zP$WEOtFbzNb?H)>{M2@%1rnduOy=VdR=S6m)RjoHmBEIsb{WE}x8k(E=`s$BHf)~D zh8QtVM6g|UE^b~Uul!Gu++i*oRF8t_PkWOy(!1QZ%yN1Yj&&M3 zAO9AHRnR&{rT|sCaS$Sa2Pc##D95vyjPO!k@D(=R4kdN`$ghP-H9a&`-73y*+AbvF z?R7~TQ=GA9j3Rt#AEw-QPI}~?Y*%vV|oq>Sa!N zA1@dJ-fBzT5SPp#{v3w$0oul+a4MRbdf0(uXdA`PfM|%@TSH~Z3C3bgxO2S}3x^mFd zpt6)|o+@z?FF$@ZU}(3#E*u1@rfoDGK*zeXIvV%3#}?zmY)A9((}4E+yL7|x{-q}@ zfDeDm*GbspRuSXrp#NRb-FgPw4kSPX_W!Mmbl}TEBG|0PenoaP(<{fs#vVs3bP)Yk zxPkzYfI~#MY2K=QKp#)z8~>TseQvHkID{tUYi*`>iZ^1dbU(-B-g+NO6x>ORp-1Zo zp$gI;@Mj0k&EVSRYTd)fLoGPe3LRVEnA|k(Dnocx0r!GZyQh* z@%P2`?AjW?x+6oWa9t8yA50BeEjJCfzC0@clJ9T`-7Ucm zEs6=Gt(5nKme=8wI46uwbhI*nD9Y1lY@}C3TVN|3O`fN_Ja#tS8C-im6!*Yf(NpsB z2b7-Ph?ueuZGO~r4q5m!<~gG&XP5jXp?R}%6_{W8rWK8FA_wL6x>2NA9Ca7$OZ8*6 zJX$}OmLtq%|M;hK``h}XA``OA>;D`hi*Rt5KiqVy6!}&;#+W0o#to3C%;5x>} z{$XK3r#-spa~W49CSd^2RdI8On{9U*HSE`s=p! zH7$%#QVaAQ>mi~ghtfcb{4$S7N6lJgOKktRk?;hXLamWWA-HJF;`inRYa1y|{H^pT zB3&A^J#dC*OxW}#ZFpF|D}bBjtPu*+mIpu-#yF#+`M?tzQC>hJ%Pbu8IGj>jUW=;W ztd-74tSrEtf+g13Qw!Smx#Bq~8j8aOy2@h+8A#s2Z{jN6VCz-EtF7l(=>Qr9944}H zK!49{K*t!V)>^nxN6VuFD_aKk%fjBo4;phVBP+Y6(*)(vvurg@pGM=VCa0BB2+< zlU|>MkfAwFPwlUK(eODCw%)^14u*Ndl;H8HMN2H8o(u7B%BP(BG= zwY7Bd<1-yc-yJC_?i)*L<@kSiE8*Q?mFJ_Vl+KZ0+Cblto;9r< zWnjXpMX|^8H%w?BG5Mu-!zNp z)~au}(8SwA6Gc?3Ob;&)y7|qf(di0kS4`UptyT&MBy4O z*rJg?68HL<8|F47g&kM*ZT{WB`fl+ZUhQzcG3Zsx5wQlGf7&2I1k z+H37dTdnO0Q10B%m50EfB|!$|<-hWne4B>1W^C1zKPFQc6uVtg&Ov8R%FU_0h;712G| zX3pcU8Ljs8&IYjlQS@?_H)eKbK6#n9R79(8T3SG}E`xWC(Zq$^Z5BGhrX5|-wcz&DM=G>5%+9~%J zVVulgeNfOXqCi95QO}6)acxs3)R33sQpu`^T>Vwp8fZa%ofh*yb)EN{(lr6D?ilH7 z=33g5X(>>*M`^QbsRY$?-E0YldCw3d6hUIYoZ8um#b?Q7aWMg=T+@T7Qqr$H=j9;IH|l{eK06+g#k5bz-3 zd!wCsd37Ry1kZyu&A3L~*M5yfq zsMehV89y#nycu8<4IVtLqa)H zarzVd65tS?#ymAZRl83DeA2Fb1+Aln;#t1{5YSyGk2MO^Zy4~3n0`b4D0ekKpy+=7 zpZJX8OVUgni}%l0x-aLfA22baPG7V3jOVP?63G(hoYB2Y{|6N3IReC^7*LmFnc9~d zVoE?ccJ$x$+GvzekTcCv7n(TjGs4VuM6MixOS*?Y8nFG9bO1m}pc#c~I)YOzwHHC< z1^|U+T*f-3M;;wST3oCnb0C|)0AWHYE-lvamaUXKJ9H&{l;2$;H0{BCk~{Dq@*K10 zPnu@{qo=P)PAheMoYw@RJYYjm&j7&aAzxDQleJ5Ne=cur4nWR0v(|X2yvsz8HY6dO zk$dJebq&i;{DRZr8`+Bez$zM_SJZ((@ZN}g*?ZhhEvAAKP~8oHd)N�Wme`JUsBUtxV z$uqT3qJY|>g>D~o%n;h)#emT2yawJ=O9uAaa~#2gRPd}-+#_`!H9Ex4dIE4&yO9Du zp@a{k1<@hL^}RP!-;VF(3^1Q{^V|=%+BTZwsJrcG0RGa(Q{xlN?01SI+h`W1X`1qx z+G&u5b^Y+ofrKzfl3yq>n-aI~h6&J0raNI;`?po$uQ_Xvb9~2O`$#ch-e$dIa*cWh zPF-89F$zGvyIkeGshQ`7gnk>seQ1?ZalNUNG>M;#;LRkx74OMQDB6Pu0Oc zg@+%#g})Z{~jyj}H<5Q0aYmY>^T$fCb)jQ~N7?SKBzPc=hHeW^MYpqA!x5uR&+ zL}|#lCA{a*!Pmkkj;_Dp1A-PA3lE@NBAJ{f@y~Y32$q?D1>2=c7!t zE=RSvxhltdf=&mh4%SNvg^t{WBRDfojybCaxL1K&oh!*Aq2B+yT;bOH)oYjFW3Z~2 z9N7}Wrx5`gPfgqHXh@l=shE5zwdGL@ycX;epS_yMN7)Wj0S)I26^!x{QiFN z%U8a`yGCk*=i=C}oH+MczH5!$0GPx534hGg>)Q2J&PyuqqK`4*t&q|7U^! ezguAAi1`oy_4Ddad{~))A6@My53!o|um2z4l{oGI literal 0 HcmV?d00001 diff --git a/sweep.yaml b/sweep.yaml deleted file mode 100644 index bae610e..0000000 --- a/sweep.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# Sweep AI turns bugs & feature requests into code changes (https://sweep.dev) -# For details on our config file, check out our docs at https://docs.sweep.dev/usage/config - -# This setting contains a list of rules that Sweep will check for. If any of these rules are broken in a new commit, Sweep will create an pull request to fix the broken rule. -rules: -- "All docstrings and comments should be up to date." -- "Do not use large chunks of commented out code." -- "Use consistent indentation and spacing." -- "Avoid using inline styles and instead use CSS classes." -- "Do not use unnecessary imports." -- "Use meaningful variable and function names." -- "All commits should use the conventional commit format." -- "All PR names should also use the conventional commit format." - -# This is the branch that Sweep will develop from and make pull requests to. Most people use 'main' or 'master' but some users also use 'dev' or 'staging'. -branch: 'main' - -# By default Sweep will read the logs and outputs from your existing Github Actions. To disable this, set this to false. -gha_enabled: True - -# This is the description of your project. It will be used by sweep when creating PRs. You can tell Sweep what's unique about your project, what frameworks you use, or anything else you want. -# -# Example: -# -# description: sweepai/sweep is a python project. The main api endpoints are in sweepai/api.py. Write code that adheres to PEP8. -description: '' - -# This sets whether to create pull requests as drafts. If this is set to True, then all pull requests will be created as drafts and GitHub Actions will not be triggered. -draft: False - -# This is a list of directories that Sweep will not be able to edit. -blocked_dirs: [] - -# This is a list of documentation links that Sweep will use to help it understand your code. You can add links to documentation for any packages you use here. -# -# Example: -# -# docs: -# - PyGitHub: ["https://pygithub.readthedocs.io/en/latest/", "We use pygithub to interact with the GitHub API"] -docs: - - nextjs13: - - https://nextjs.org/docs - - We use nextjs 13 as the main technology in our stack. It serves as a React framework to efficiently build the user interface - - tailwind: - - https://tailwindcss.com/docs/installation - - Tailwind is our primary styling framework. We use it to build components with the desired css styles. - - cypress: - - https://docs.cypress.io/guides/overview/why-cypress - - Cypress is our e2e framework. We test every new flux a user can take with this library - - flowbite-react: - - https://www.flowbite-react.com/docs/getting-started/introduction - - this library is a little components library we use to make our lives easier and not needing to create all components in our prototyping phase. The usage of this library should be reduced over time. - -# Sandbox executes commands in a sandboxed environment to validate code changes after every edit to guarantee pristine code. For more details, see the [Sandbox](./sandbox) page. -sandbox: - install: - - trunk init - check: - - trunk fmt {file_path} - - trunk check --fix --print-failures {file_path} diff --git a/tailwind.config.js b/tailwind.config.js index 29d353e..64fca84 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,39 +1,94 @@ /** @type {import('tailwindcss').Config} */ + +/* + * Unitystation design tokens. Every colour maps to a CSS custom property + * declared in app/globals.css (the classic StationHub palette), so the + * palette can be re-themed in one place. + */ module.exports = { - content: [ - 'node_modules/flowbite-react/**/*.{js,jsx,ts,tsx}', - "./pages/**/*.tsx", - './app/**/*.{js,ts,jsx,tsx,mdx}', - "./components/**/*.tsx" - ], - important: true, // Active dark mode on class basis - darkMode: "class", i18n: { - locales: ["en-US"], defaultLocale: "en-US", - }, + content: ["./app/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx}"], theme: { + colors: { + transparent: "transparent", + current: "currentColor", + black: "#000", + white: "#fff", + + // Surfaces (darkest to lightest) + void: "rgb(var(--c-void) / )", + hull: "rgb(var(--c-hull) / )", + panel: "rgb(var(--c-panel) / )", + raised: "rgb(var(--c-raised) / )", + + // Lines & interactive chrome + seam: "rgb(var(--c-seam) / )", + "seam-bright": "rgb(var(--c-seam-bright) / )", + steel: "rgb(var(--c-steel) / )", + + // Text + crew: "rgb(var(--c-crew) / )", + dim: "rgb(var(--c-dim) / )", + faint: "rgb(var(--c-faint) / )", + + // Accents + primary: { + DEFAULT: "rgb(var(--c-primary) / )", + hot: "rgb(var(--c-primary-hot) / )", + }, + accent: "rgb(var(--c-accent) / )", + info: "rgb(var(--c-info) / )", + success: "rgb(var(--c-success) / )", + warning: "rgb(var(--c-warning) / )", + danger: { + DEFAULT: "rgb(var(--c-danger) / )", + fill: "rgb(var(--c-danger-fill) / )", + }, + }, + fontFamily: { + display: ["var(--font-display)", "system-ui", "sans-serif"], + mono: ["var(--font-mono)", "ui-monospace", "SFMono-Regular", "monospace"], + body: ["var(--font-body)", "system-ui", "sans-serif"], + }, + /* Shadows are tokens too (this replaces Tailwind's shadow-sm/md/lg + * scale on purpose): never write an arbitrary shadow-[…] in a + * component. */ + boxShadow: { + none: "none", + panel: "0 10px 30px rgba(0, 0, 0, 0.45)", // panels, cards, tables + nav: "0 4px 16px rgba(0, 0, 0, 0.35)", // the sticky navbar + float: "0 6px 20px rgba(0, 0, 0, 0.4)", // small floating boxes (the clown's taunt) + menu: "0 12px 32px rgba(0, 0, 0, 0.6)", // dropdown menus + window: "0 32px 80px rgba(0, 0, 0, 0.7)", // the hero's launcher window + bevel: "inset 0 1px 0 rgb(255 255 255 / 0.06)", // top highlight on steel toolbars + cta: "inset 0 1px 0 rgb(255 255 255 / 0.18), 0 16px 40px rgb(var(--c-primary) / 0.35)", // the hero download button's teal glow + }, extend: { container: { center: true, }, - backgroundImage: { - "layer1": "url('../public/background/layer1.png')", + letterSpacing: { + label: "0.14em", + }, + animation: { + "led-blink": "led-blink 2.4s steps(1) infinite", + "fade-up": "fade-up 0.5s ease-out both", + marquee: "marquee 120s linear infinite", + }, + keyframes: { + marquee: { + from: { transform: "translateX(0)" }, + to: { transform: "translateX(-50%)" }, + }, + "led-blink": { + "0%, 92%, 100%": { opacity: "1" }, + "94%, 98%": { opacity: "0.25" }, + }, + "fade-up": { + from: { opacity: "0", transform: "translateY(12px)" }, + to: { opacity: "1", transform: "translateY(0)" }, + }, }, - blur: { - 'xs': '2px', - 'xxs': '1px', - } - }, - }, - variants: { - extend: { - backgroundColor: ["checked"], borderColor: ["checked"], inset: ["checked"], zIndex: ["hover", "active"], }, }, - plugins: [ - require('flowbite/plugin'), - ], - future: { - purgeLayersByDefault: true, - }, + plugins: [], }; - diff --git a/tsconfig.json b/tsconfig.json index 95e6379..2a71762 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,42 +1,31 @@ { - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" + "compilerOptions": { + "target": "ES6", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "types": [ - "cypress" - ], - "plugins": [ - { - "name": "next" - } - ] - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules", - "cypress", - "**/*.test.ts", - "**/*.test.tsx" - ] + "exclude": ["node_modules", "cypress"] } diff --git a/types/allChangesResponse.ts b/types/allChangesResponse.ts index 9d8467e..19c7019 100644 --- a/types/allChangesResponse.ts +++ b/types/allChangesResponse.ts @@ -1,10 +1,10 @@ -import Build from './build'; +import Build from "./build"; interface AllChangesResponse { - count: number, - next: string | null, - previous: string | null, - results: Build[], + count: number; + next: string | null; + previous: string | null; + results: Build[]; } -export type {AllChangesResponse}; +export type { AllChangesResponse }; diff --git a/types/blogPost.ts b/types/blogPost.ts index 8b2e81a..7d3ed4b 100644 --- a/types/blogPost.ts +++ b/types/blogPost.ts @@ -1,16 +1,16 @@ export interface BlogPostSection { - heading?: string, - body: string, + heading?: string; + body: string; } export interface BlogPost { - title: string, - slug: string, - author: string, - date_created: Date, - type: string, - state: string, - socials_image: string, - summary: string, - sections: BlogPostSection[], + title: string; + slug: string; + author: string; + date_created: Date; + type: string; + state: string; + socials_image: string; + summary: string; + sections: BlogPostSection[]; } diff --git a/types/blogPostsResponse.ts b/types/blogPostsResponse.ts index 8ed15de..356d285 100644 --- a/types/blogPostsResponse.ts +++ b/types/blogPostsResponse.ts @@ -1,8 +1,8 @@ -import {BlogPost} from "./blogPost"; +import { BlogPost } from "./blogPost"; export interface BlogPostsResponse { - count: number, - next: string | null, - previous: string | null, - results: BlogPost[], + count: number; + next: string | null; + previous: string | null; + results: BlogPost[]; } diff --git a/types/build.ts b/types/build.ts index 93b86c4..1fed1b1 100644 --- a/types/build.ts +++ b/types/build.ts @@ -1,9 +1,9 @@ -import Change from './change'; +import Change from "./change"; interface Build { - version_number: string, - date_created: string, - changes: Change[], + version_number: string; + date_created: string; + changes: Change[]; } export default Build; diff --git a/types/change.ts b/types/change.ts index cc6f3d5..a1996a0 100644 --- a/types/change.ts +++ b/types/change.ts @@ -1,12 +1,12 @@ interface Change { - author_username: string, - author_url: string, - description: string, - pr_url: string, - pr_number: number, - category: "FIX" | "NEW" | "IMPROVEMENT" | "BALANCE", - build: string, - date_added: string, + author_username: string; + author_url: string; + description: string; + pr_url: string; + pr_number: number; + category: "FIX" | "NEW" | "IMPROVEMENT" | "BALANCE"; + build: string; + date_added: string; } export default Change; diff --git a/types/githubReleaseResponse.ts b/types/githubReleaseResponse.ts index ebb0e2f..f9d2094 100644 --- a/types/githubReleaseResponse.ts +++ b/types/githubReleaseResponse.ts @@ -60,8 +60,8 @@ export interface Asset { interface Reactions { url: string; total_count: number; - '+1': number; - '-1': number; + "+1": number; + "-1": number; laugh: number; hooray: number; confused: number; diff --git a/types/launcherRelease.ts b/types/launcherRelease.ts index 32b9d83..841ed7f 100644 --- a/types/launcherRelease.ts +++ b/types/launcherRelease.ts @@ -1,38 +1,38 @@ export interface DownloadVariant { - label: string; - url: string; - sizeMB: number; + label: string; + url: string; + sizeMB: number; } export interface AurVariant { - cmd: string; - pageUrl: string; + cmd: string; + pageUrl: string; } export interface WindowsPlatform { - recommended?: DownloadVariant; - alternatives: DownloadVariant[]; + recommended?: DownloadVariant; + alternatives: DownloadVariant[]; } export interface MacPlatform { - recommended?: DownloadVariant; - note: string; + recommended?: DownloadVariant; + note: string; } export interface LinuxPlatform { - deb?: DownloadVariant; - rpm?: DownloadVariant; - aur: AurVariant; + deb?: DownloadVariant; + rpm?: DownloadVariant; + aur: AurVariant; } -export type OsKey = 'win' | 'mac' | 'linux'; +export type OsKey = "win" | "mac" | "linux"; export interface LauncherRelease { - version: string; - releasesPageUrl: string; - platforms: { - windows: WindowsPlatform; - mac: MacPlatform; - linux: LinuxPlatform; - }; + version: string; + releasesPageUrl: string; + platforms: { + windows: WindowsPlatform; + mac: MacPlatform; + linux: LinuxPlatform; + }; } diff --git a/types/layoutChildren.ts b/types/layoutChildren.ts index d8a9a73..cfcc99e 100644 --- a/types/layoutChildren.ts +++ b/types/layoutChildren.ts @@ -1,8 +1,8 @@ import React from "react"; interface LayoutChildren { - children?: React.ReactNode - className?: string + children?: React.ReactNode; + className?: string; } export default LayoutChildren; diff --git a/types/ledger/ledgerResponse.ts b/types/ledger/ledgerResponse.ts index 73d977a..a357807 100644 --- a/types/ledger/ledgerResponse.ts +++ b/types/ledger/ledgerResponse.ts @@ -1,6 +1,6 @@ export interface LedgerData { id: number; - type: 'expense' | 'income'; + type: "expense" | "income"; description: string; notes: string | null; amount_usd: string; @@ -14,4 +14,4 @@ export interface LedgerResponse { next: string | null; previous: string | null; results: LedgerData[]; -} \ No newline at end of file +} diff --git a/types/pageParams.ts b/types/pageParams.ts index 2bc4fdc..40cfee9 100644 --- a/types/pageParams.ts +++ b/types/pageParams.ts @@ -1,4 +1,4 @@ export interface PageParams { - params: Promise<{slug: string}>, - searchParams: Promise -} \ No newline at end of file + params: Promise<{ slug: string }>; + searchParams: Promise; +} diff --git a/utils/__fixtures__/puduRelease.json b/utils/__fixtures__/puduRelease.json index 3fb58a6..bbd1495 100644 --- a/utils/__fixtures__/puduRelease.json +++ b/utils/__fixtures__/puduRelease.json @@ -1,15 +1,51 @@ { - "tag_name": "v2.0.0", - "html_url": "https://github.com/unitystation/PuduLauncher/releases/tag/v2.0.0", - "assets": [ - { "name": "darwin-pudu-launcher2.0.0-aarch64.app.tar.gz", "size": 11000000, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/darwin-pudu-launcher2.0.0-aarch64.app.tar.gz" }, - { "name": "darwin-pudu-launcher2.0.0-aarch64.dmg", "size": 12582912, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/darwin-pudu-launcher2.0.0-aarch64.dmg" }, - { "name": "latest.json", "size": 1200, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/latest.json" }, - { "name": "linux-pudu-launcher2.0.0-amd64.deb", "size": 15728640, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-amd64.deb" }, - { "name": "linux-pudu-launcher2.0.0-amd64.deb.sig", "size": 600, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-amd64.deb.sig" }, - { "name": "linux-pudu-launcher2.0.0-x86_64.rpm", "size": 16777216, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-x86_64.rpm" }, - { "name": "Windows-pudu-launcher-portable-x64.zip", "size": 20971520, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/Windows-pudu-launcher-portable-x64.zip" }, - { "name": "windows-pudu-launcher-setup2.0.0-x64.exe", "size": 18874368, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/windows-pudu-launcher-setup2.0.0-x64.exe" }, - { "name": "windows-pudu-launcher-setup2.0.0-x64.exe.sig", "size": 600, "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/windows-pudu-launcher-setup2.0.0-x64.exe.sig" } - ] + "tag_name": "v2.0.0", + "html_url": "https://github.com/unitystation/PuduLauncher/releases/tag/v2.0.0", + "assets": [ + { + "name": "darwin-pudu-launcher2.0.0-aarch64.app.tar.gz", + "size": 11000000, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/darwin-pudu-launcher2.0.0-aarch64.app.tar.gz" + }, + { + "name": "darwin-pudu-launcher2.0.0-aarch64.dmg", + "size": 12582912, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/darwin-pudu-launcher2.0.0-aarch64.dmg" + }, + { + "name": "latest.json", + "size": 1200, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/latest.json" + }, + { + "name": "linux-pudu-launcher2.0.0-amd64.deb", + "size": 15728640, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-amd64.deb" + }, + { + "name": "linux-pudu-launcher2.0.0-amd64.deb.sig", + "size": 600, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-amd64.deb.sig" + }, + { + "name": "linux-pudu-launcher2.0.0-x86_64.rpm", + "size": 16777216, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/linux-pudu-launcher2.0.0-x86_64.rpm" + }, + { + "name": "Windows-pudu-launcher-portable-x64.zip", + "size": 20971520, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/Windows-pudu-launcher-portable-x64.zip" + }, + { + "name": "windows-pudu-launcher-setup2.0.0-x64.exe", + "size": 18874368, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/windows-pudu-launcher-setup2.0.0-x64.exe" + }, + { + "name": "windows-pudu-launcher-setup2.0.0-x64.exe.sig", + "size": 600, + "browser_download_url": "https://github.com/unitystation/PuduLauncher/releases/download/v2.0.0/windows-pudu-launcher-setup2.0.0-x64.exe.sig" + } + ] } diff --git a/utils/detectPlatform.ts b/utils/detectPlatform.ts index 7c500e0..30cb43b 100644 --- a/utils/detectPlatform.ts +++ b/utils/detectPlatform.ts @@ -1,44 +1,44 @@ -import { UAParser } from 'ua-parser-js'; -import { OsKey } from '../types/launcherRelease'; +import { UAParser } from "ua-parser-js"; +import { OsKey } from "../types/launcherRelease"; -export type LinuxFamily = 'arch' | 'debian' | 'rpm'; -export type DetectedOs = OsKey | 'unknown'; +export type LinuxFamily = "arch" | "debian" | "rpm"; +export type DetectedOs = OsKey | "unknown"; export interface PlatformInfo { - os: DetectedOs; - linuxFamily?: LinuxFamily; + os: DetectedOs; + linuxFamily?: LinuxFamily; } -const ARCH_DISTROS = ['arch', 'manjaro', 'endeavouros', 'garuda']; -const DEBIAN_DISTROS = ['debian', 'ubuntu', 'mint', 'pop', 'elementary']; -const RPM_DISTROS = ['fedora', 'redhat', 'rhel', 'centos', 'suse', 'opensuse', 'rocky', 'alma']; +const ARCH_DISTROS = ["arch", "manjaro", "endeavouros", "garuda"]; +const DEBIAN_DISTROS = ["debian", "ubuntu", "mint", "pop", "elementary"]; +const RPM_DISTROS = ["fedora", "redhat", "rhel", "centos", "suse", "opensuse", "rocky", "alma"]; function linuxFamilyFrom(osName: string): LinuxFamily | undefined { - if (ARCH_DISTROS.some((d) => osName.includes(d))) return 'arch'; - if (DEBIAN_DISTROS.some((d) => osName.includes(d))) return 'debian'; - if (RPM_DISTROS.some((d) => osName.includes(d))) return 'rpm'; - return undefined; + if (ARCH_DISTROS.some((d) => osName.includes(d))) return "arch"; + if (DEBIAN_DISTROS.some((d) => osName.includes(d))) return "debian"; + if (RPM_DISTROS.some((d) => osName.includes(d))) return "rpm"; + return undefined; } export function detectPlatform(uaString?: string): PlatformInfo { - const parser = uaString ? new UAParser(uaString) : new UAParser(); - const osName = (parser.getResult().os.name ?? '').toLowerCase(); + const parser = uaString ? new UAParser(uaString) : new UAParser(); + const osName = (parser.getResult().os.name ?? "").toLowerCase(); - if (osName.includes('windows')) return { os: 'win' }; - if (osName.includes('mac')) return { os: 'mac' }; + if (osName.includes("windows")) return { os: "win" }; + if (osName.includes("mac")) return { os: "mac" }; - const family = linuxFamilyFrom(osName); - if (osName.includes('linux') || family) { - return { os: 'linux', linuxFamily: family }; - } - return { os: 'unknown' }; + const family = linuxFamilyFrom(osName); + if (osName.includes("linux") || family) { + return { os: "linux", linuxFamily: family }; + } + return { os: "unknown" }; } export function recommendedLinuxFormat( - family: LinuxFamily | undefined, -): 'aur' | 'deb' | 'rpm' | undefined { - if (family === 'arch') return 'aur'; - if (family === 'debian') return 'deb'; - if (family === 'rpm') return 'rpm'; - return undefined; + family: LinuxFamily | undefined, +): "aur" | "deb" | "rpm" | undefined { + if (family === "arch") return "aur"; + if (family === "debian") return "deb"; + if (family === "rpm") return "rpm"; + return undefined; } diff --git a/utils/fetchOfType.ts b/utils/fetchOfType.ts index e925625..e38de35 100644 --- a/utils/fetchOfType.ts +++ b/utils/fetchOfType.ts @@ -1,9 +1,4 @@ -const fetchOfType = async (url: string, config?: {}): Promise => { - if (config) { - return fetch(url, config).then(res => res.json()); - } +const fetchOfType = (url: string, config?: RequestInit): Promise => + fetch(url, config).then((res) => res.json()); - return fetch(url).then(res => res.json()); -} - -export default fetchOfType; \ No newline at end of file +export default fetchOfType; diff --git a/utils/launcherRelease.ts b/utils/launcherRelease.ts index 0dd39b5..356db26 100644 --- a/utils/launcherRelease.ts +++ b/utils/launcherRelease.ts @@ -1,56 +1,53 @@ -import GithubReleaseResponse, { Asset } from '../types/githubReleaseResponse'; -import { - LauncherRelease, - DownloadVariant, -} from '../types/launcherRelease'; -import { AUR_INSTALL_CMD, AUR_PAGE_URL } from './urlContants'; +import GithubReleaseResponse, { Asset } from "../types/githubReleaseResponse"; +import { LauncherRelease, DownloadVariant } from "../types/launcherRelease"; +import { AUR_INSTALL_CMD, AUR_PAGE_URL } from "./urlContants"; const MAC_INTEL_NOTE = - 'This build is for Apple Silicon (M-series) Macs. We do not ship a prebuilt Intel download, so check the GitHub repo if you need one.'; + "This build is for Apple Silicon (M-series) Macs. We do not ship a prebuilt Intel download, so check the GitHub repo if you need one."; function bytesToMB(size: number): number { - return Math.round((size / 1048576) * 10) / 10; + return Math.round((size / 1048576) * 10) / 10; } function variant(asset: Asset | undefined, label: string): DownloadVariant | undefined { - if (!asset) return undefined; - return { label, url: asset.browser_download_url, sizeMB: bytesToMB(asset.size) }; + if (!asset) return undefined; + return { label, url: asset.browser_download_url, sizeMB: bytesToMB(asset.size) }; } function find(assets: Asset[], predicate: (name: string) => boolean): Asset | undefined { - return assets.find((a) => predicate(a.name.toLowerCase())); + return assets.find((a) => predicate(a.name.toLowerCase())); } function mapLauncherRelease(raw: GithubReleaseResponse): LauncherRelease { - const assets = raw.assets; - - const winInstaller = find(assets, (n) => n.includes('setup') && n.endsWith('.exe')); - const winPortable = find(assets, (n) => n.includes('portable') && n.endsWith('.zip')); - const macDmg = find(assets, (n) => n.endsWith('.dmg')); - const linuxDeb = find(assets, (n) => n.endsWith('.deb')); - const linuxRpm = find(assets, (n) => n.endsWith('.rpm')); - - return { - version: raw.tag_name, - releasesPageUrl: raw.html_url, - platforms: { - windows: { - recommended: variant(winInstaller, 'Installer (.exe)'), - alternatives: [variant(winPortable, 'Portable (.zip)')].filter( - (v): v is DownloadVariant => v !== undefined, - ), - }, - mac: { - recommended: variant(macDmg, 'Apple Silicon (.dmg)'), - note: MAC_INTEL_NOTE, - }, - linux: { - deb: variant(linuxDeb, 'Debian / Ubuntu (.deb)'), - rpm: variant(linuxRpm, 'Fedora / SUSE (.rpm)'), - aur: { cmd: AUR_INSTALL_CMD, pageUrl: AUR_PAGE_URL }, - }, - }, - }; + const assets = raw.assets; + + const winInstaller = find(assets, (n) => n.includes("setup") && n.endsWith(".exe")); + const winPortable = find(assets, (n) => n.includes("portable") && n.endsWith(".zip")); + const macDmg = find(assets, (n) => n.endsWith(".dmg")); + const linuxDeb = find(assets, (n) => n.endsWith(".deb")); + const linuxRpm = find(assets, (n) => n.endsWith(".rpm")); + + return { + version: raw.tag_name, + releasesPageUrl: raw.html_url, + platforms: { + windows: { + recommended: variant(winInstaller, "Installer (.exe)"), + alternatives: [variant(winPortable, "Portable (.zip)")].filter( + (v): v is DownloadVariant => v !== undefined, + ), + }, + mac: { + recommended: variant(macDmg, "Apple Silicon (.dmg)"), + note: MAC_INTEL_NOTE, + }, + linux: { + deb: variant(linuxDeb, "Debian / Ubuntu (.deb)"), + rpm: variant(linuxRpm, "Fedora / SUSE (.rpm)"), + aur: { cmd: AUR_INSTALL_CMD, pageUrl: AUR_PAGE_URL }, + }, + }, + }; } export default mapLauncherRelease; diff --git a/utils/osMeta.ts b/utils/osMeta.ts new file mode 100644 index 0000000..e31ecb4 --- /dev/null +++ b/utils/osMeta.ts @@ -0,0 +1,11 @@ +import type { IconType } from "react-icons"; +import { FaApple, FaLinux, FaWindows } from "react-icons/fa"; +import { OsKey } from "../types/launcherRelease"; + +export const OS_META: Record = { + win: { label: "Windows", Icon: FaWindows }, + mac: { label: "macOS", Icon: FaApple }, + linux: { label: "Linux", Icon: FaLinux }, +}; + +export const OS_ORDER: OsKey[] = ["win", "mac", "linux"]; diff --git a/utils/postMeta.ts b/utils/postMeta.ts new file mode 100644 index 0000000..c39b88f --- /dev/null +++ b/utils/postMeta.ts @@ -0,0 +1,23 @@ +import type { Tone } from "../components/ui/tones"; + +/* Blog post `type` → display label + department tone, shared by the home + * news section and the blog pages. */ +export const POST_TYPE_LABEL: Record = { + announcement: "Announcement", + weekly: "Progress Update", + community: "Community Highlight", +}; + +export const POST_TYPE_TONE: Record = { + announcement: "info", + weekly: "primary", + community: "success", +}; + +export function postTypeLabel(type: string): string { + return POST_TYPE_LABEL[type] ?? type; +} + +export function postTypeTone(type: string): Tone { + return POST_TYPE_TONE[type] ?? "neutral"; +} diff --git a/utils/timeUtils.ts b/utils/timeUtils.ts index 7d2c6f5..eb35b4e 100644 --- a/utils/timeUtils.ts +++ b/utils/timeUtils.ts @@ -9,24 +9,24 @@ export function toAgoTime(time: Date) { const years = Math.floor(months / 12); if (years > 0) { - return `${years} year${years > 1 ? 's' : ''} ago`; + return `${years} year${years > 1 ? "s" : ""} ago`; } if (months > 0) { - return `${months} month${months > 1 ? 's' : ''} ago`; + return `${months} month${months > 1 ? "s" : ""} ago`; } if (days > 0) { - return `${days} day${days > 1 ? 's' : ''} ago`; + return `${days} day${days > 1 ? "s" : ""} ago`; } if (hours > 0) { - return `${hours} hour${hours > 1 ? 's' : ''} ago`; + return `${hours} hour${hours > 1 ? "s" : ""} ago`; } if (minutes > 0) { - return `${minutes} minute${minutes > 1 ? 's' : ''} ago`; + return `${minutes} minute${minutes > 1 ? "s" : ""} ago`; } if (seconds > 0) { - return `${seconds} second${seconds > 1 ? 's' : ''} ago`; + return `${seconds} second${seconds > 1 ? "s" : ""} ago`; } - return 'just now'; + return "just now"; } export function toHumanTime(time: Date) { diff --git a/utils/urlContants.ts b/utils/urlContants.ts index 55ae7ed..d694151 100644 --- a/utils/urlContants.ts +++ b/utils/urlContants.ts @@ -1,11 +1,12 @@ -export const GITHUB_URL = 'https://github.com/unitystation/unitystation'; -export const DISCORD_INVITE_URL = 'https://discord.com/invite/tFcTpBp'; -export const PATREON_URL = 'https://www.patreon.com/unitystation'; -export const PAYPAL_DONATION_URL = 'https://www.paypal.com/donate/?hosted_button_id=SLGV34ZBQYTA2'; +export const GITHUB_URL = "https://github.com/unitystation/unitystation"; +export const DISCORD_INVITE_URL = "https://discord.com/invite/tFcTpBp"; +export const PATREON_URL = "https://www.patreon.com/unitystation"; +export const PAYPAL_DONATION_URL = "https://www.paypal.com/donate/?hosted_button_id=SLGV34ZBQYTA2"; // Pudu Launcher (replaces the retired StationHub) -export const LAUNCHER_REPO_URL = 'https://github.com/unitystation/PuduLauncher'; -export const GITHUB_RELEASES_URL = 'https://github.com/unitystation/PuduLauncher/releases/latest'; -export const LAUNCHER_RELEASES_API = 'https://api.github.com/repos/unitystation/PuduLauncher/releases/latest'; -export const AUR_PAGE_URL = 'https://aur.archlinux.org/packages/pudu-launcher-git'; -export const AUR_INSTALL_CMD = 'yay -S pudu-launcher-git'; +export const LAUNCHER_REPO_URL = "https://github.com/unitystation/PuduLauncher"; +export const GITHUB_RELEASES_URL = "https://github.com/unitystation/PuduLauncher/releases/latest"; +export const LAUNCHER_RELEASES_API = + "https://api.github.com/repos/unitystation/PuduLauncher/releases/latest"; +export const AUR_PAGE_URL = "https://aur.archlinux.org/packages/pudu-launcher-git"; +export const AUR_INSTALL_CMD = "yay -S pudu-launcher-git";