├── .changeset ├── README.md └── config.json ├── .devcontainer └── devcontainer.json ├── .github ├── dependabot.yml └── workflows │ ├── release.yml │ └── test.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── __tests__ └── ScrollRestorer.spec.ts ├── eslint.config.mjs ├── next-app-mock ├── .gitignore ├── next.config.js ├── package.json ├── pnpm-lock.yaml ├── src │ ├── ClientSideScrollRestorer.tsx │ └── app │ │ ├── globals.css │ │ ├── high-with-loading │ │ ├── SomeClient.tsx │ │ ├── loading.tsx │ │ └── page.tsx │ │ ├── high │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── low-page │ │ └── page.tsx │ │ ├── page.module.css │ │ └── page.tsx └── tsconfig.json ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── ScrollRestorer.tsx ├── index.ts ├── storage.ts ├── useScrollRestorer.ts └── util.ts ├── tsconfig.eslint.json ├── tsconfig.json └── tsup.config.ts /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "restricted", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "image": "mcr.microsoft.com/devcontainers/typescript-node:22", 3 | "customizations": { 4 | "vscode": { 5 | "extensions": ["GitHub.vscode-pull-request-github"] 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "composer" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | groups: 8 | all: 9 | patterns: 10 | - "*" 11 | commit-message: 12 | prefix: "php packages" 13 | - package-ecosystem: "github-actions" 14 | directory: / 15 | groups: 16 | all: 17 | patterns: 18 | - "*" 19 | commit-message: 20 | prefix: "github-actions" 21 | schedule: 22 | interval: "weekly" 23 | - package-ecosystem: "npm" 24 | directory: "/" 25 | groups: 26 | all: 27 | patterns: 28 | - "*" 29 | schedule: 30 | interval: "weekly" 31 | commit-message: 32 | prefix: "npm" 33 | - package-ecosystem: "docker" 34 | groups: 35 | all: 36 | patterns: 37 | - "*" 38 | directory: "/" 39 | schedule: 40 | interval: "weekly" 41 | commit-message: 42 | prefix: "docker" 43 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | branches: 5 | - main 6 | concurrency: ${{ github.workflow }}-${{ github.ref }} 7 | permissions: {} 8 | jobs: 9 | release: 10 | if: github.repository == 'RevoTale/next-scroll-restorer' 11 | concurrency: release 12 | # prevents this action from running on forks 13 | permissions: 14 | contents: write # to create release (changesets/action) 15 | pull-requests: write # to create pull request (changesets/action) 16 | id-token: write 17 | 18 | name: Release 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Checkout Repo 22 | uses: actions/checkout@v4 23 | - uses: pnpm/action-setup@v4.1.0 24 | - name: Setup Node.js 25 | uses: actions/setup-node@v4 26 | with: 27 | node-version: 20.x 28 | cache: pnpm 29 | - run: pnpm install --frozen-lockfile 30 | - name: Create Release Pull Request or Publish to npm 31 | id: changesets 32 | uses: changesets/action@v1 33 | with: 34 | version: pnpm changeset:version 35 | publish: pnpm changeset:publish 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 39 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | pull_request: 4 | branches: 5 | - main 6 | push: 7 | branches: 8 | - '**' 9 | permissions: 10 | contents: read 11 | jobs: 12 | Unit: 13 | runs-on: ${{ matrix.os }} 14 | timeout-minutes: 15 15 | strategy: 16 | matrix: 17 | node-version: [20,22] 18 | os: [ubuntu-latest] 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: pnpm/action-setup@v4.1.0 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | cache: pnpm 26 | - run: pnpm i && pnpm build 27 | - run: pnpm playwright install --with-deps 28 | - run: pnpm test 29 | env: 30 | CI: true 31 | - uses: actions/upload-artifact@v4 32 | with: 33 | name: my-artifacts-${{inputs.context}}-${{inputs.job-index}}-${{ matrix.node-version }} 34 | path: playwright-report/ 35 | - uses: actions/download-artifact@v4 36 | with: 37 | pattern: my-artifacts-${{inputs.context}}* 38 | merge-multiple: true 39 | Lint: 40 | runs-on: ubuntu-latest 41 | timeout-minutes: 5 42 | steps: 43 | - uses: actions/checkout@v4 44 | - uses: pnpm/action-setup@v4.1.0 45 | - uses: actions/setup-node@v4 46 | with: 47 | node-version: 20 48 | cache: pnpm 49 | - run: pnpm i 50 | - run: pnpm lint 51 | Types: 52 | runs-on: ubuntu-latest 53 | timeout-minutes: 5 54 | steps: 55 | - uses: actions/checkout@v4 56 | - uses: pnpm/action-setup@v4.1.0 57 | - uses: actions/setup-node@v4 58 | with: 59 | node-version: 20 60 | cache: pnpm 61 | - run: pnpm i 62 | - run: pnpm tsc 63 | Test: 64 | needs: [ Lint, Unit, Types ] 65 | runs-on: ubuntu-latest 66 | steps: 67 | - name: Success 68 | run: echo "Ready to merge!" 69 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .idea 4 | /test-results/ 5 | /playwright-report/ 6 | /blob-report/ 7 | /playwright/.cache/ 8 | .pnpm-store -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # next-scroll-restorer 2 | 3 | ## 0.10.1 4 | 5 | ### Patch Changes 6 | 7 | - e7ddcfd: Remove console.log from build output 8 | 9 | ## 0.10.0 10 | 11 | ### Minor Changes 12 | 13 | - 0f56dc7: Change bundler to `tsup` 14 | 15 | ### Patch Changes 16 | 17 | - 0f56dc7: Fix eslint error according to new eslint config. 18 | - 0f56dc7: Drop support for nextjs 14 because there is a major changeset between react 18 and 19 19 | - 0f56dc7: Add tests on different nextjs verisions and lowest/highest deps 20 | 21 | ## 0.9.9 22 | 23 | ### Patch Changes 24 | 25 | - 348927d: bump packages to latest version 26 | 27 | ## 0.9.8 28 | 29 | ### Patch Changes 30 | 31 | - 2a73a3a: Update dependabot to keep up-to-date major versions 32 | - 2a73a3a: Bump to react^19 nad next^15 33 | - 2a73a3a: Bump pnpm/action-setup@v4.0.0 34 | 35 | ## 0.9.7 36 | 37 | ### Patch Changes 38 | 39 | - 5910596: Add NPM package link to README. 40 | 41 | ## 0.9.6 42 | 43 | ### Patch Changes 44 | 45 | - e771ab8: Add NPM badge to Readme 46 | 47 | ## 0.9.5 48 | 49 | ### Patch Changes 50 | 51 | - 11f1008: Update readme. Fix NPM approval badge. 52 | 53 | ## 0.9.4 54 | 55 | ### Patch Changes 56 | 57 | - 2f3b482: Fix bug where safari workaround caused revert to previous scroll position when spwiping to the top of the website. 58 | - 2f3b482: Add integration tests with simulation of Safari scroll reset bug. 59 | Finally, make working workaround for this bug. 60 | 61 | ## 0.9.3 62 | 63 | ### Patch Changes 64 | 65 | - be75ad0: Fix bug where safari workaround caused revert to previous scroll position when spwiping to the top of the website. 66 | 67 | ## 0.9.2 68 | 69 | ### Patch Changes 70 | 71 | - eb273a2: Update readme to use suspense 72 | - eb273a2: Increase threshold for Safari scroll reset bug workaround, because sometimes Safari browser fires it even after 700ms. 73 | 74 | ## 0.9.1 75 | 76 | ### Patch Changes 77 | 78 | - 8874f56: Fix Test CI to run on release merge. 79 | 80 | ## 0.9.0 81 | 82 | ### Minor Changes 83 | 84 | - 776dc72: Added many tests with complex cases and stress situations. In my opinion, 100% of cases in real-world browser are coveraged by tests. 85 | - 776dc72: Fixed broken behaviour of previous version. 86 | 87 | ### Patch Changes 88 | 89 | - 776dc72: Rewritten component from scratch to match all existing tests. 90 | - 776dc72: More test for scroll behaviour. Test for history replaceState limitation described in https://github.com/sveltejs/kit/issues/365 91 | - 776dc72: Prevent error Unhandled Rejection (SecurityError): Attempt to use history.pushState() more than 100 times per 30 seconds react. 92 | - 776dc72: Workaround for Safari resetting scroll position. 93 | 94 | ## 0.8.0 95 | 96 | ### Minor Changes 97 | 98 | - 97980df: Save scroll position to window history instead of local storage. 99 | 100 | ### Patch Changes 101 | 102 | - 97980df: Update README with all the latest features. 103 | - 97980df: Update Readme with the latest updates. Restructure to be more informative and clean. 104 | 105 | ## 0.7.1 106 | 107 | ### Patch Changes 108 | 109 | - 075cc6e: Add option to delay scroll restoration. 110 | 111 | ## 0.7.0 112 | 113 | ### Minor Changes 114 | 115 | - 2d1c8a1: Make tests more complex to cover a wider range of issues. Redesign scroll restorer to pass them. Removed unnecessary complexity of scroll restorer. 116 | - 2d1c8a1: Add end-to-end testing of `ScrollRestorer` in real NextJS application. 117 | 118 | ### Patch Changes 119 | 120 | - 2d1c8a1: Add tests that stress out scroll restorer. It showed up a bug I experienced in Safari browser with recent NextJS 14 minor versions. 121 | 122 | ## 0.6.15 123 | 124 | ### Patch Changes 125 | 126 | - 3ef329d: Add support for NextJS 14. 127 | - 3ef329d: Export scroll restorer as a hook. 128 | 129 | ## 0.6.14 130 | 131 | ### Patch Changes 132 | 133 | - 6985c58: Improve README 134 | 135 | ## 0.6.13 136 | 137 | ### Patch Changes 138 | 139 | - a228a70: Fix readme headings 140 | - 49711f2: fix bundle preparation 141 | 142 | ## 0.6.12 143 | 144 | ### Patch Changes 145 | 146 | - 7500bfa: Readme guide 147 | 148 | ## 0.6.11 149 | 150 | ### Patch Changes 151 | 152 | - 0437a7f: fix repository naming occurrences 153 | 154 | ## 0.6.10 155 | 156 | ### Patch Changes 157 | 158 | - f2ece35: Fix release process 159 | 160 | ## 0.6.9 161 | 162 | ### Patch Changes 163 | 164 | - 9b83c24: Fix release process 165 | 166 | ## 0.6.8 167 | 168 | ### Patch Changes 169 | 170 | - 01d9913: Introduced scroll restoration component that performs much better than alternatives, but can only be used for `appDir` NextJS apps. 171 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 RevoTale 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NextJs Scroll Restorer 2 | ![NPM Version](https://img.shields.io/npm/v/next-scroll-restorer) 3 | ![NPM Downloads](https://img.shields.io/npm/dm/next-scroll-restorer) 4 | ![NPM License](https://img.shields.io/npm/l/next-scroll-restorer) 5 | ![npm bundle size](https://img.shields.io/bundlephobia/min/next-scroll-restorer) 6 | ![NPM Type Definitions](https://img.shields.io/npm/types/next-scroll-restorer) 7 | 8 | [next-scroll-restorer](https://www.npmjs.com/package/next-scroll-restorer) handles scroll restoration for Next.js apps built with **app** directory. 9 | Fixed bugs that Next.js team ignored. 10 | 11 | **Important!** This component works only for application written with [**Next.js 'app' directory**](https://nextjs.org/docs/app). 12 | ## Install 13 | - `npm install next-scroll-restorer` for [NPM](https://www.npmjs.com/package/next-scroll-restorer) 14 | - `pnpm add next-scroll-restorer` for [pnpm](https://pnpm.io) 15 | - `yarn add next-scroll-restorer` for [Yarn](https://yarnpkg.com) 16 | 17 | ## Key features 18 | - 100% of codebase written in Typescript 19 | - Can be used at any nesting `layout.tsx` file. Root layout isn't required. 20 | - Fixed bug where built-in Next.js scroll restoration is not immediate 21 | - Fixed annoying bug where [scroll position forgotten by Next.js built-in scroll restoration.](https://github.com/vercel/next.js/issues/53777) 22 | - Extensive testing in different browsers with [Playwright](https://github.com/microsoft/playwright) testing library. 23 | ## Presequences 24 | Before you start, keep in mind following rules. 25 | - Keep disabled native `scrollRestoration` option in Next.js config to avoid conflicts. 26 | - **Skip this rule for Next.js [14.1.0](https://github.com/vercel/next.js/releases/tag/v14.1.0) and higher.** In case your Next.js version is less than [14.1.0](https://github.com/vercel/next.js/releases/tag/v14.1.0) then you should enable `windowHistorySupport` in your Next.js config under `expermimental` property. 27 | [Since Next.js 14.1.0 browser history support is enabled by default.](https://github.com/vercel/next.js/pull/60557) 28 | ```js 29 | /** @type {import('next').NextConfig} */ 30 | const nextConfig = { 31 | experimental:{ 32 | //Only For Next.js versions prior to 14.1.0 because it is enabled by default since version 14.1.0 33 | windowHistorySupport:true 34 | }, 35 | } 36 | module.exports = nextConfig 37 | ``` 38 | 39 | 40 | ## Usage 41 | 42 | ### Step 1 43 | Create component named `ClientSideScrollRestorer` in your `src` directory with `useScrollRestorer` hook and `"use client"` directive to prevent server errors. 44 | 45 | **src/ClientSideScrollRestorer.tsx** 46 | ```tsx 47 | "use client" 48 | import {useScrollRestorer} from 'next-scroll-restorer'; 49 | const ClientSideScrollRestorer = () => { 50 | useScrollRestorer() 51 | return <> 52 | } 53 | export default ClientSideScrollRestorer 54 | ``` 55 | ### Step 2 56 | Import component created in a previous step to your root layout file (layout.tsx). 57 | Wrap it wih [React](https://react.dev/reference/react/Suspense) `` to avoid possible [client-side deopting for entire page](https://nextjs.org/docs/messages/deopted-into-client-rendering). 58 | 59 | **app/layout.tsx** 60 | ```tsx 61 | import ClientSideScrollRestorer from '../src/ClientSideScrollRestorer' 62 | import {ReactNode, Suspense} from "react"; 63 | 64 | type Props = { 65 | children: ReactNode 66 | } 67 | const RootLayout = ({children}) => { 68 | return ( 69 | 70 | {children} 71 | 72 | 73 | 74 | 75 | ) 76 | } 77 | 78 | export default RootLayout 79 | ``` 80 | It can be any nesting layout shared by [group of routes](https://nextjs.org/docs/app/building-your-application/routing/route-groups) in case you do not want to enable scroll restoration for the whole application. 81 | 82 | -------------------------------------------------------------------------------- /__tests__/ScrollRestorer.spec.ts: -------------------------------------------------------------------------------- 1 | import {test, expect, Page,} from '@playwright/test' 2 | 3 | const highPage = 1300 4 | const mainPage = 2600 5 | const resolveTimeout = (time: number) => (async () => { 6 | return new Promise(resolve => { 7 | setTimeout(() => { 8 | resolve(1) 9 | }, time) 10 | }) 11 | })() 12 | const getScrollY = (page: Page) => page.evaluate((): number => window.scrollY) 13 | 14 | const expectScrollToBe = async (page: Page, value: number) => { 15 | await resolveTimeout(50) 16 | await expect(getScrollY(page)).resolves.toBeGreaterThanOrEqual(value - 2) 17 | await expect(getScrollY(page)).resolves.toBeLessThanOrEqual(value + 2) 18 | } 19 | const scrollPage = (page: Page, scrollY: number) => { 20 | return page.evaluate(async (value) => { 21 | return await new Promise((resolve) => { 22 | if (window.scrollY === value) { 23 | resolve(true) 24 | return 25 | } 26 | const timeout = setTimeout(() => { 27 | window.scrollTo({ 28 | top: value, 29 | left: 0, 30 | behavior: "smooth", 31 | }) 32 | }, 500)//There are lags 3with smooth scroll behavior. THis is workaround to trigger scroll again. 33 | const listener = () => { 34 | const diff = (value - window.scrollY) 35 | if (-2 < diff && diff < 2) { 36 | window.removeEventListener('scroll', listener) 37 | resolve(true) 38 | clearTimeout(timeout) 39 | } 40 | 41 | } 42 | window.addEventListener('scroll', listener, { 43 | passive: true 44 | }) 45 | window.scrollTo({ 46 | top: value, 47 | left: 0, 48 | behavior: "smooth", 49 | }) 50 | 51 | }) 52 | }, scrollY) 53 | } 54 | const initTests = async (page: Page) => { 55 | 56 | await page.goto('/') 57 | // Default behavior to start. 58 | const el = page.getByText('Lets-go to low-page') 59 | await expectScrollToBe(page, 0) 60 | await el.scrollIntoViewIfNeeded() 61 | await expectScrollToBe(page, mainPage) 62 | await el.click() 63 | await expect(page).toHaveURL('/low-page') 64 | await expect(page.locator('h1')).toContainText('This is the low page') 65 | await expectScrollToBe(page, 0) 66 | await page.goBack() 67 | } 68 | test('End to end testing of scroll restorer', async ({page, browserName}) => { 69 | 70 | await initTests(page) 71 | await expect(page).toHaveURL('/') 72 | await resolveTimeout(1000) //Check if Next.js does not brake scroll position later 73 | await expectScrollToBe(page, mainPage) 74 | await page.goForward() 75 | await expectScrollToBe(page, 0) 76 | //A little bit of stress for app 77 | await page.goBack() 78 | 79 | await expectScrollToBe(page, mainPage) 80 | for (let i = 0; i < 10; i++) { 81 | await page.goForward() 82 | await resolveTimeout(10)//Sometimes browsers struggle to restore the same millisecond 83 | await page.goBack() 84 | } 85 | 86 | await expectScrollToBe(page, mainPage) 87 | await page.goForward() 88 | 89 | await expectScrollToBe(page, 0) 90 | await page.goBack() 91 | await expectScrollToBe(page, mainPage) 92 | 93 | //End of a little bit of stress for app 94 | 95 | //Test when both pages are high 96 | await page.goto('/high') 97 | await expectScrollToBe(page, 0) 98 | 99 | const mainEl = page.getByText('Lets-go to main') 100 | await mainEl.scrollIntoViewIfNeeded() 101 | await page.waitForURL('/high') 102 | await expectScrollToBe(page, highPage) 103 | await mainEl.click() 104 | await expectScrollToBe(page, 0) 105 | await page.waitForURL('/') 106 | 107 | 108 | await page.getByText('Lets-go to low-page').scrollIntoViewIfNeeded() 109 | await expectScrollToBe(page, mainPage) 110 | 111 | await page.getByText('Lets-go to low-page').click() 112 | 113 | await expectScrollToBe(page, 0) 114 | await page.waitForURL('/low-page') 115 | 116 | await page.goBack() 117 | 118 | await expectScrollToBe(page, mainPage) 119 | await page.waitForURL('/') 120 | await page.goBack() 121 | await expectScrollToBe(page, highPage) 122 | await page.waitForURL('/high') 123 | await page.goForward() 124 | await page.waitForURL('/') 125 | await expectScrollToBe(page, mainPage) 126 | 127 | 128 | await page.reload() 129 | if (browserName === "firefox") { 130 | await page.goBack() //Firefox pushed new history entry history after reload https://github.com/microsoft/playwright/issues/22640 131 | } 132 | await resolveTimeout(1000)//Sometimes browsers struggle to restore the same millisecond 133 | await expectScrollToBe(page, mainPage) 134 | 135 | 136 | 137 | await page.getByText('Lets-go without scroll').scrollIntoViewIfNeeded() 138 | await expectScrollToBe(page, mainPage) 139 | await page.getByText('Lets-go without scroll').click() 140 | await page.waitForURL('/?fff=fff') 141 | await expectScrollToBe(page, mainPage) 142 | 143 | }) 144 | 145 | test('Safari scroll reset bug simulation', async ({page}) => { 146 | await initTests(page) 147 | await page.goForward() 148 | await expectScrollToBe(page, 0) 149 | await page.goBack() 150 | await page.evaluate(() => { 151 | window.scrollTo({ 152 | top: 0, 153 | behavior: 'instant' 154 | }) 155 | })//This is actual bug behaviour 156 | 157 | await resolveTimeout(500) //Webkit does it not immediately 158 | await expectScrollToBe(page, mainPage) 159 | await page.evaluate(() => { 160 | window.scrollTo({ 161 | top: 0, 162 | behavior: 'instant' 163 | }) 164 | })//Test second time, it should allow scroll 165 | 166 | await resolveTimeout(500) //Webkit does it not immediately 167 | await expectScrollToBe(page, 0) 168 | 169 | 170 | }) 171 | //I keep this test to have amount of test 172 | test('Some random behaviour 1',async ({page})=>{ 173 | await page.goto('/') 174 | await expectScrollToBe(page, 0) 175 | 176 | await page.goto('/high') 177 | await page.waitForURL('/high') 178 | await expectScrollToBe(page, 0) 179 | 180 | await scrollPage(page,highPage) 181 | await expectScrollToBe(page, highPage) 182 | 183 | await page.goto('/low-page') 184 | await page.waitForURL('/low-page') 185 | await expectScrollToBe(page, 0) 186 | 187 | await resolveTimeout(400) 188 | await expectScrollToBe(page, 0) 189 | 190 | 191 | 192 | }) 193 | test('Some random behaviour 2',async ({page})=>{ 194 | await page.goto('/') 195 | await expectScrollToBe(page, 0) 196 | await scrollPage(page,mainPage) 197 | await page.goto('/high') 198 | await page.waitForURL('/high') 199 | await expectScrollToBe(page, 0) 200 | 201 | await resolveTimeout(500) 202 | await expectScrollToBe(page, 0) 203 | 204 | 205 | 206 | }) 207 | 208 | test('Some random behaviour 3 (bug fix)',async ({page})=>{ 209 | await page.goto('/') 210 | await expectScrollToBe(page, 0) 211 | await scrollPage(page,highPage/2) 212 | await page.goto('/high-with-loading') 213 | await page.waitForURL('/high-with-loading') 214 | await expectScrollToBe(page, 0) 215 | 216 | await resolveTimeout(1002) 217 | await expectScrollToBe(page, 0) 218 | 219 | 220 | 221 | }) 222 | 223 | test('Smooth scrolling', async ({page}) => { 224 | await initTests(page) 225 | 226 | //Test for a scroll to not produce any errors. Https://github.com/sveltejs/kit/issues/365 227 | let error: string | null = null 228 | page.on("console", (msg) => { 229 | if (msg.type() === 'error') { 230 | error = msg.text() 231 | } 232 | }) 233 | 234 | await resolveTimeout(2000) // Timeout for safari scroll bug navigation workaround. 235 | 236 | const smoothScrollTop = async () => { 237 | await scrollPage(page, 0) 238 | await expectScrollToBe(page, 0) 239 | } 240 | const smoothScrollBottom = async () => { 241 | 242 | await scrollPage(page, mainPage) 243 | 244 | await expectScrollToBe(page, mainPage) 245 | } 246 | //This is a very important test to stress out 'scroll' event 247 | // DO NOT CHANGE THIS TEST IN ANY WAY! 248 | for (let i = 0; i < 10; i++) { 249 | console.log(`Iteration ${i}.`) 250 | await smoothScrollTop() 251 | 252 | 253 | await smoothScrollBottom() 254 | } 255 | 256 | expect(error).toBe(null) 257 | }) 258 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | 2 | import love from 'eslint-config-love' 3 | 4 | export default [ 5 | { 6 | ...love, 7 | files: ['./src/**/*.tsx', './src/**/*.ts'], 8 | }, 9 | ] -------------------------------------------------------------------------------- /next-app-mock/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /next-app-mock/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | eslint: { 4 | // Warning: This allows production builds to successfully complete even if 5 | // your project has ESLint errors. 6 | ignoreDuringBuilds: true, 7 | }, 8 | } 9 | 10 | module.exports = nextConfig 11 | -------------------------------------------------------------------------------- /next-app-mock/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-app-mock", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "next": "^15.3.2", 12 | "react": "^19.1.0", 13 | "react-dom": "^19.1.0" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "^22.15.17", 17 | "@types/react": "^19.1.4", 18 | "@types/react-dom": "^19.1.5", 19 | "eslint": "^9.26.0", 20 | "eslint-config-next": "^15.3.2", 21 | "typescript": "^5.8.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /next-app-mock/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | next: 12 | specifier: ^15.3.2 13 | version: 15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 14 | react: 15 | specifier: ^19.1.0 16 | version: 19.1.0 17 | react-dom: 18 | specifier: ^19.1.0 19 | version: 19.1.0(react@19.1.0) 20 | devDependencies: 21 | '@types/node': 22 | specifier: ^22.15.17 23 | version: 22.15.17 24 | '@types/react': 25 | specifier: ^19.1.4 26 | version: 19.1.4 27 | '@types/react-dom': 28 | specifier: ^19.1.5 29 | version: 19.1.5(@types/react@19.1.4) 30 | eslint: 31 | specifier: ^9.26.0 32 | version: 9.26.0 33 | eslint-config-next: 34 | specifier: ^15.3.2 35 | version: 15.3.2(eslint@9.26.0)(typescript@5.8.3) 36 | typescript: 37 | specifier: ^5.8.3 38 | version: 5.8.3 39 | 40 | packages: 41 | 42 | '@emnapi/core@1.4.3': 43 | resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} 44 | 45 | '@emnapi/runtime@1.4.3': 46 | resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} 47 | 48 | '@emnapi/wasi-threads@1.0.2': 49 | resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} 50 | 51 | '@eslint-community/eslint-utils@4.7.0': 52 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 53 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 54 | peerDependencies: 55 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 56 | 57 | '@eslint-community/regexpp@4.12.1': 58 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 59 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 60 | 61 | '@eslint/config-array@0.20.0': 62 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 63 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 64 | 65 | '@eslint/config-helpers@0.2.2': 66 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 67 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 68 | 69 | '@eslint/core@0.13.0': 70 | resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 71 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 72 | 73 | '@eslint/eslintrc@3.3.1': 74 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 75 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 76 | 77 | '@eslint/js@9.26.0': 78 | resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} 79 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 80 | 81 | '@eslint/object-schema@2.1.6': 82 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 83 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 84 | 85 | '@eslint/plugin-kit@0.2.8': 86 | resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 87 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 88 | 89 | '@humanfs/core@0.19.1': 90 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 91 | engines: {node: '>=18.18.0'} 92 | 93 | '@humanfs/node@0.16.6': 94 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 95 | engines: {node: '>=18.18.0'} 96 | 97 | '@humanwhocodes/module-importer@1.0.1': 98 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 99 | engines: {node: '>=12.22'} 100 | 101 | '@humanwhocodes/retry@0.3.1': 102 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 103 | engines: {node: '>=18.18'} 104 | 105 | '@humanwhocodes/retry@0.4.3': 106 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 107 | engines: {node: '>=18.18'} 108 | 109 | '@img/sharp-darwin-arm64@0.34.1': 110 | resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} 111 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 112 | cpu: [arm64] 113 | os: [darwin] 114 | 115 | '@img/sharp-darwin-x64@0.34.1': 116 | resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} 117 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 118 | cpu: [x64] 119 | os: [darwin] 120 | 121 | '@img/sharp-libvips-darwin-arm64@1.1.0': 122 | resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} 123 | cpu: [arm64] 124 | os: [darwin] 125 | 126 | '@img/sharp-libvips-darwin-x64@1.1.0': 127 | resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} 128 | cpu: [x64] 129 | os: [darwin] 130 | 131 | '@img/sharp-libvips-linux-arm64@1.1.0': 132 | resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} 133 | cpu: [arm64] 134 | os: [linux] 135 | 136 | '@img/sharp-libvips-linux-arm@1.1.0': 137 | resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} 138 | cpu: [arm] 139 | os: [linux] 140 | 141 | '@img/sharp-libvips-linux-ppc64@1.1.0': 142 | resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} 143 | cpu: [ppc64] 144 | os: [linux] 145 | 146 | '@img/sharp-libvips-linux-s390x@1.1.0': 147 | resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} 148 | cpu: [s390x] 149 | os: [linux] 150 | 151 | '@img/sharp-libvips-linux-x64@1.1.0': 152 | resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} 153 | cpu: [x64] 154 | os: [linux] 155 | 156 | '@img/sharp-libvips-linuxmusl-arm64@1.1.0': 157 | resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} 158 | cpu: [arm64] 159 | os: [linux] 160 | 161 | '@img/sharp-libvips-linuxmusl-x64@1.1.0': 162 | resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} 163 | cpu: [x64] 164 | os: [linux] 165 | 166 | '@img/sharp-linux-arm64@0.34.1': 167 | resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} 168 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 169 | cpu: [arm64] 170 | os: [linux] 171 | 172 | '@img/sharp-linux-arm@0.34.1': 173 | resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} 174 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 175 | cpu: [arm] 176 | os: [linux] 177 | 178 | '@img/sharp-linux-s390x@0.34.1': 179 | resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} 180 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 181 | cpu: [s390x] 182 | os: [linux] 183 | 184 | '@img/sharp-linux-x64@0.34.1': 185 | resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} 186 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 187 | cpu: [x64] 188 | os: [linux] 189 | 190 | '@img/sharp-linuxmusl-arm64@0.34.1': 191 | resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} 192 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 193 | cpu: [arm64] 194 | os: [linux] 195 | 196 | '@img/sharp-linuxmusl-x64@0.34.1': 197 | resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} 198 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 199 | cpu: [x64] 200 | os: [linux] 201 | 202 | '@img/sharp-wasm32@0.34.1': 203 | resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} 204 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 205 | cpu: [wasm32] 206 | 207 | '@img/sharp-win32-ia32@0.34.1': 208 | resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} 209 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 210 | cpu: [ia32] 211 | os: [win32] 212 | 213 | '@img/sharp-win32-x64@0.34.1': 214 | resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} 215 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 216 | cpu: [x64] 217 | os: [win32] 218 | 219 | '@modelcontextprotocol/sdk@1.11.2': 220 | resolution: {integrity: sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==} 221 | engines: {node: '>=18'} 222 | 223 | '@napi-rs/wasm-runtime@0.2.9': 224 | resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} 225 | 226 | '@next/env@15.3.2': 227 | resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} 228 | 229 | '@next/eslint-plugin-next@15.3.2': 230 | resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} 231 | 232 | '@next/swc-darwin-arm64@15.3.2': 233 | resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} 234 | engines: {node: '>= 10'} 235 | cpu: [arm64] 236 | os: [darwin] 237 | 238 | '@next/swc-darwin-x64@15.3.2': 239 | resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} 240 | engines: {node: '>= 10'} 241 | cpu: [x64] 242 | os: [darwin] 243 | 244 | '@next/swc-linux-arm64-gnu@15.3.2': 245 | resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} 246 | engines: {node: '>= 10'} 247 | cpu: [arm64] 248 | os: [linux] 249 | 250 | '@next/swc-linux-arm64-musl@15.3.2': 251 | resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} 252 | engines: {node: '>= 10'} 253 | cpu: [arm64] 254 | os: [linux] 255 | 256 | '@next/swc-linux-x64-gnu@15.3.2': 257 | resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} 258 | engines: {node: '>= 10'} 259 | cpu: [x64] 260 | os: [linux] 261 | 262 | '@next/swc-linux-x64-musl@15.3.2': 263 | resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} 264 | engines: {node: '>= 10'} 265 | cpu: [x64] 266 | os: [linux] 267 | 268 | '@next/swc-win32-arm64-msvc@15.3.2': 269 | resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} 270 | engines: {node: '>= 10'} 271 | cpu: [arm64] 272 | os: [win32] 273 | 274 | '@next/swc-win32-x64-msvc@15.3.2': 275 | resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} 276 | engines: {node: '>= 10'} 277 | cpu: [x64] 278 | os: [win32] 279 | 280 | '@nodelib/fs.scandir@2.1.5': 281 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 282 | engines: {node: '>= 8'} 283 | 284 | '@nodelib/fs.stat@2.0.5': 285 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 286 | engines: {node: '>= 8'} 287 | 288 | '@nodelib/fs.walk@1.2.8': 289 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 290 | engines: {node: '>= 8'} 291 | 292 | '@nolyfill/is-core-module@1.0.39': 293 | resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} 294 | engines: {node: '>=12.4.0'} 295 | 296 | '@rtsao/scc@1.1.0': 297 | resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 298 | 299 | '@rushstack/eslint-patch@1.11.0': 300 | resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} 301 | 302 | '@swc/counter@0.1.3': 303 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 304 | 305 | '@swc/helpers@0.5.15': 306 | resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} 307 | 308 | '@tybys/wasm-util@0.9.0': 309 | resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} 310 | 311 | '@types/estree@1.0.7': 312 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 313 | 314 | '@types/json-schema@7.0.15': 315 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 316 | 317 | '@types/json5@0.0.29': 318 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 319 | 320 | '@types/node@22.15.17': 321 | resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} 322 | 323 | '@types/react-dom@19.1.5': 324 | resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} 325 | peerDependencies: 326 | '@types/react': ^19.0.0 327 | 328 | '@types/react@19.1.4': 329 | resolution: {integrity: sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==} 330 | 331 | '@typescript-eslint/eslint-plugin@8.32.1': 332 | resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} 333 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 334 | peerDependencies: 335 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 336 | eslint: ^8.57.0 || ^9.0.0 337 | typescript: '>=4.8.4 <5.9.0' 338 | 339 | '@typescript-eslint/parser@8.32.1': 340 | resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} 341 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 342 | peerDependencies: 343 | eslint: ^8.57.0 || ^9.0.0 344 | typescript: '>=4.8.4 <5.9.0' 345 | 346 | '@typescript-eslint/scope-manager@8.32.1': 347 | resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} 348 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 349 | 350 | '@typescript-eslint/type-utils@8.32.1': 351 | resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} 352 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 353 | peerDependencies: 354 | eslint: ^8.57.0 || ^9.0.0 355 | typescript: '>=4.8.4 <5.9.0' 356 | 357 | '@typescript-eslint/types@8.32.1': 358 | resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} 359 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 360 | 361 | '@typescript-eslint/typescript-estree@8.32.1': 362 | resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} 363 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 364 | peerDependencies: 365 | typescript: '>=4.8.4 <5.9.0' 366 | 367 | '@typescript-eslint/utils@8.32.1': 368 | resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} 369 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 370 | peerDependencies: 371 | eslint: ^8.57.0 || ^9.0.0 372 | typescript: '>=4.8.4 <5.9.0' 373 | 374 | '@typescript-eslint/visitor-keys@8.32.1': 375 | resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} 376 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 377 | 378 | '@unrs/resolver-binding-darwin-arm64@1.7.2': 379 | resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} 380 | cpu: [arm64] 381 | os: [darwin] 382 | 383 | '@unrs/resolver-binding-darwin-x64@1.7.2': 384 | resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} 385 | cpu: [x64] 386 | os: [darwin] 387 | 388 | '@unrs/resolver-binding-freebsd-x64@1.7.2': 389 | resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} 390 | cpu: [x64] 391 | os: [freebsd] 392 | 393 | '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': 394 | resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} 395 | cpu: [arm] 396 | os: [linux] 397 | 398 | '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': 399 | resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} 400 | cpu: [arm] 401 | os: [linux] 402 | 403 | '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': 404 | resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} 405 | cpu: [arm64] 406 | os: [linux] 407 | 408 | '@unrs/resolver-binding-linux-arm64-musl@1.7.2': 409 | resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} 410 | cpu: [arm64] 411 | os: [linux] 412 | 413 | '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': 414 | resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} 415 | cpu: [ppc64] 416 | os: [linux] 417 | 418 | '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': 419 | resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} 420 | cpu: [riscv64] 421 | os: [linux] 422 | 423 | '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': 424 | resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} 425 | cpu: [riscv64] 426 | os: [linux] 427 | 428 | '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': 429 | resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} 430 | cpu: [s390x] 431 | os: [linux] 432 | 433 | '@unrs/resolver-binding-linux-x64-gnu@1.7.2': 434 | resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} 435 | cpu: [x64] 436 | os: [linux] 437 | 438 | '@unrs/resolver-binding-linux-x64-musl@1.7.2': 439 | resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} 440 | cpu: [x64] 441 | os: [linux] 442 | 443 | '@unrs/resolver-binding-wasm32-wasi@1.7.2': 444 | resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} 445 | engines: {node: '>=14.0.0'} 446 | cpu: [wasm32] 447 | 448 | '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': 449 | resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} 450 | cpu: [arm64] 451 | os: [win32] 452 | 453 | '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': 454 | resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} 455 | cpu: [ia32] 456 | os: [win32] 457 | 458 | '@unrs/resolver-binding-win32-x64-msvc@1.7.2': 459 | resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} 460 | cpu: [x64] 461 | os: [win32] 462 | 463 | accepts@2.0.0: 464 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 465 | engines: {node: '>= 0.6'} 466 | 467 | acorn-jsx@5.3.2: 468 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 469 | peerDependencies: 470 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 471 | 472 | acorn@8.14.1: 473 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 474 | engines: {node: '>=0.4.0'} 475 | hasBin: true 476 | 477 | ajv@6.12.6: 478 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 479 | 480 | ansi-styles@4.3.0: 481 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 482 | engines: {node: '>=8'} 483 | 484 | argparse@2.0.1: 485 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 486 | 487 | aria-query@5.3.2: 488 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 489 | engines: {node: '>= 0.4'} 490 | 491 | array-buffer-byte-length@1.0.2: 492 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 493 | engines: {node: '>= 0.4'} 494 | 495 | array-includes@3.1.8: 496 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 497 | engines: {node: '>= 0.4'} 498 | 499 | array.prototype.findlast@1.2.5: 500 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 501 | engines: {node: '>= 0.4'} 502 | 503 | array.prototype.findlastindex@1.2.6: 504 | resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} 505 | engines: {node: '>= 0.4'} 506 | 507 | array.prototype.flat@1.3.3: 508 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 509 | engines: {node: '>= 0.4'} 510 | 511 | array.prototype.flatmap@1.3.3: 512 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 513 | engines: {node: '>= 0.4'} 514 | 515 | array.prototype.tosorted@1.1.4: 516 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 517 | engines: {node: '>= 0.4'} 518 | 519 | arraybuffer.prototype.slice@1.0.4: 520 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 521 | engines: {node: '>= 0.4'} 522 | 523 | ast-types-flow@0.0.8: 524 | resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} 525 | 526 | async-function@1.0.0: 527 | resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 528 | engines: {node: '>= 0.4'} 529 | 530 | available-typed-arrays@1.0.7: 531 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 532 | engines: {node: '>= 0.4'} 533 | 534 | axe-core@4.10.3: 535 | resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} 536 | engines: {node: '>=4'} 537 | 538 | axobject-query@4.1.0: 539 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 540 | engines: {node: '>= 0.4'} 541 | 542 | balanced-match@1.0.2: 543 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 544 | 545 | body-parser@2.2.0: 546 | resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} 547 | engines: {node: '>=18'} 548 | 549 | brace-expansion@1.1.11: 550 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 551 | 552 | brace-expansion@2.0.1: 553 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 554 | 555 | braces@3.0.3: 556 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 557 | engines: {node: '>=8'} 558 | 559 | busboy@1.6.0: 560 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 561 | engines: {node: '>=10.16.0'} 562 | 563 | bytes@3.1.2: 564 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 565 | engines: {node: '>= 0.8'} 566 | 567 | call-bind-apply-helpers@1.0.2: 568 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 569 | engines: {node: '>= 0.4'} 570 | 571 | call-bind@1.0.8: 572 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 573 | engines: {node: '>= 0.4'} 574 | 575 | call-bound@1.0.4: 576 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 577 | engines: {node: '>= 0.4'} 578 | 579 | callsites@3.1.0: 580 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 581 | engines: {node: '>=6'} 582 | 583 | caniuse-lite@1.0.30001718: 584 | resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} 585 | 586 | chalk@4.1.2: 587 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 588 | engines: {node: '>=10'} 589 | 590 | client-only@0.0.1: 591 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 592 | 593 | color-convert@2.0.1: 594 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 595 | engines: {node: '>=7.0.0'} 596 | 597 | color-name@1.1.4: 598 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 599 | 600 | color-string@1.9.1: 601 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 602 | 603 | color@4.2.3: 604 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 605 | engines: {node: '>=12.5.0'} 606 | 607 | concat-map@0.0.1: 608 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 609 | 610 | content-disposition@1.0.0: 611 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 612 | engines: {node: '>= 0.6'} 613 | 614 | content-type@1.0.5: 615 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 616 | engines: {node: '>= 0.6'} 617 | 618 | cookie-signature@1.2.2: 619 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 620 | engines: {node: '>=6.6.0'} 621 | 622 | cookie@0.7.2: 623 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 624 | engines: {node: '>= 0.6'} 625 | 626 | cors@2.8.5: 627 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 628 | engines: {node: '>= 0.10'} 629 | 630 | cross-spawn@7.0.6: 631 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 632 | engines: {node: '>= 8'} 633 | 634 | csstype@3.1.3: 635 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 636 | 637 | damerau-levenshtein@1.0.8: 638 | resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 639 | 640 | data-view-buffer@1.0.2: 641 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 642 | engines: {node: '>= 0.4'} 643 | 644 | data-view-byte-length@1.0.2: 645 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 646 | engines: {node: '>= 0.4'} 647 | 648 | data-view-byte-offset@1.0.1: 649 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 650 | engines: {node: '>= 0.4'} 651 | 652 | debug@3.2.7: 653 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 654 | peerDependencies: 655 | supports-color: '*' 656 | peerDependenciesMeta: 657 | supports-color: 658 | optional: true 659 | 660 | debug@4.4.0: 661 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 662 | engines: {node: '>=6.0'} 663 | peerDependencies: 664 | supports-color: '*' 665 | peerDependenciesMeta: 666 | supports-color: 667 | optional: true 668 | 669 | deep-is@0.1.4: 670 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 671 | 672 | define-data-property@1.1.4: 673 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 674 | engines: {node: '>= 0.4'} 675 | 676 | define-properties@1.2.1: 677 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 678 | engines: {node: '>= 0.4'} 679 | 680 | depd@2.0.0: 681 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 682 | engines: {node: '>= 0.8'} 683 | 684 | detect-libc@2.0.4: 685 | resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 686 | engines: {node: '>=8'} 687 | 688 | doctrine@2.1.0: 689 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 690 | engines: {node: '>=0.10.0'} 691 | 692 | dunder-proto@1.0.1: 693 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 694 | engines: {node: '>= 0.4'} 695 | 696 | ee-first@1.1.1: 697 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 698 | 699 | emoji-regex@9.2.2: 700 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 701 | 702 | encodeurl@2.0.0: 703 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 704 | engines: {node: '>= 0.8'} 705 | 706 | es-abstract@1.23.9: 707 | resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 708 | engines: {node: '>= 0.4'} 709 | 710 | es-define-property@1.0.1: 711 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 712 | engines: {node: '>= 0.4'} 713 | 714 | es-errors@1.3.0: 715 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 716 | engines: {node: '>= 0.4'} 717 | 718 | es-iterator-helpers@1.2.1: 719 | resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 720 | engines: {node: '>= 0.4'} 721 | 722 | es-object-atoms@1.1.1: 723 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 724 | engines: {node: '>= 0.4'} 725 | 726 | es-set-tostringtag@2.1.0: 727 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 728 | engines: {node: '>= 0.4'} 729 | 730 | es-shim-unscopables@1.1.0: 731 | resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} 732 | engines: {node: '>= 0.4'} 733 | 734 | es-to-primitive@1.3.0: 735 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 736 | engines: {node: '>= 0.4'} 737 | 738 | escape-html@1.0.3: 739 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 740 | 741 | escape-string-regexp@4.0.0: 742 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 743 | engines: {node: '>=10'} 744 | 745 | eslint-config-next@15.3.2: 746 | resolution: {integrity: sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==} 747 | peerDependencies: 748 | eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 749 | typescript: '>=3.3.1' 750 | peerDependenciesMeta: 751 | typescript: 752 | optional: true 753 | 754 | eslint-import-resolver-node@0.3.9: 755 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 756 | 757 | eslint-import-resolver-typescript@3.10.1: 758 | resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} 759 | engines: {node: ^14.18.0 || >=16.0.0} 760 | peerDependencies: 761 | eslint: '*' 762 | eslint-plugin-import: '*' 763 | eslint-plugin-import-x: '*' 764 | peerDependenciesMeta: 765 | eslint-plugin-import: 766 | optional: true 767 | eslint-plugin-import-x: 768 | optional: true 769 | 770 | eslint-module-utils@2.12.0: 771 | resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} 772 | engines: {node: '>=4'} 773 | peerDependencies: 774 | '@typescript-eslint/parser': '*' 775 | eslint: '*' 776 | eslint-import-resolver-node: '*' 777 | eslint-import-resolver-typescript: '*' 778 | eslint-import-resolver-webpack: '*' 779 | peerDependenciesMeta: 780 | '@typescript-eslint/parser': 781 | optional: true 782 | eslint: 783 | optional: true 784 | eslint-import-resolver-node: 785 | optional: true 786 | eslint-import-resolver-typescript: 787 | optional: true 788 | eslint-import-resolver-webpack: 789 | optional: true 790 | 791 | eslint-plugin-import@2.31.0: 792 | resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} 793 | engines: {node: '>=4'} 794 | peerDependencies: 795 | '@typescript-eslint/parser': '*' 796 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 797 | peerDependenciesMeta: 798 | '@typescript-eslint/parser': 799 | optional: true 800 | 801 | eslint-plugin-jsx-a11y@6.10.2: 802 | resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} 803 | engines: {node: '>=4.0'} 804 | peerDependencies: 805 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 806 | 807 | eslint-plugin-react-hooks@5.2.0: 808 | resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 809 | engines: {node: '>=10'} 810 | peerDependencies: 811 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 812 | 813 | eslint-plugin-react@7.37.5: 814 | resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} 815 | engines: {node: '>=4'} 816 | peerDependencies: 817 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 818 | 819 | eslint-scope@8.3.0: 820 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 821 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 822 | 823 | eslint-visitor-keys@3.4.3: 824 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 825 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 826 | 827 | eslint-visitor-keys@4.2.0: 828 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 829 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 830 | 831 | eslint@9.26.0: 832 | resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} 833 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 834 | hasBin: true 835 | peerDependencies: 836 | jiti: '*' 837 | peerDependenciesMeta: 838 | jiti: 839 | optional: true 840 | 841 | espree@10.3.0: 842 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 843 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 844 | 845 | esquery@1.6.0: 846 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 847 | engines: {node: '>=0.10'} 848 | 849 | esrecurse@4.3.0: 850 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 851 | engines: {node: '>=4.0'} 852 | 853 | estraverse@5.3.0: 854 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 855 | engines: {node: '>=4.0'} 856 | 857 | esutils@2.0.3: 858 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 859 | engines: {node: '>=0.10.0'} 860 | 861 | etag@1.8.1: 862 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 863 | engines: {node: '>= 0.6'} 864 | 865 | eventsource-parser@3.0.1: 866 | resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} 867 | engines: {node: '>=18.0.0'} 868 | 869 | eventsource@3.0.7: 870 | resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} 871 | engines: {node: '>=18.0.0'} 872 | 873 | express-rate-limit@7.5.0: 874 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 875 | engines: {node: '>= 16'} 876 | peerDependencies: 877 | express: ^4.11 || 5 || ^5.0.0-beta.1 878 | 879 | express@5.1.0: 880 | resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} 881 | engines: {node: '>= 18'} 882 | 883 | fast-deep-equal@3.1.3: 884 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 885 | 886 | fast-glob@3.3.1: 887 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 888 | engines: {node: '>=8.6.0'} 889 | 890 | fast-glob@3.3.3: 891 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 892 | engines: {node: '>=8.6.0'} 893 | 894 | fast-json-stable-stringify@2.1.0: 895 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 896 | 897 | fast-levenshtein@2.0.6: 898 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 899 | 900 | fastq@1.19.1: 901 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 902 | 903 | fdir@6.4.4: 904 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} 905 | peerDependencies: 906 | picomatch: ^3 || ^4 907 | peerDependenciesMeta: 908 | picomatch: 909 | optional: true 910 | 911 | file-entry-cache@8.0.0: 912 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 913 | engines: {node: '>=16.0.0'} 914 | 915 | fill-range@7.1.1: 916 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 917 | engines: {node: '>=8'} 918 | 919 | finalhandler@2.1.0: 920 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 921 | engines: {node: '>= 0.8'} 922 | 923 | find-up@5.0.0: 924 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 925 | engines: {node: '>=10'} 926 | 927 | flat-cache@4.0.1: 928 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 929 | engines: {node: '>=16'} 930 | 931 | flatted@3.3.3: 932 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 933 | 934 | for-each@0.3.5: 935 | resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 936 | engines: {node: '>= 0.4'} 937 | 938 | forwarded@0.2.0: 939 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 940 | engines: {node: '>= 0.6'} 941 | 942 | fresh@2.0.0: 943 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 944 | engines: {node: '>= 0.8'} 945 | 946 | function-bind@1.1.2: 947 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 948 | 949 | function.prototype.name@1.1.8: 950 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 951 | engines: {node: '>= 0.4'} 952 | 953 | functions-have-names@1.2.3: 954 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 955 | 956 | get-intrinsic@1.3.0: 957 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 958 | engines: {node: '>= 0.4'} 959 | 960 | get-proto@1.0.1: 961 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 962 | engines: {node: '>= 0.4'} 963 | 964 | get-symbol-description@1.1.0: 965 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 966 | engines: {node: '>= 0.4'} 967 | 968 | get-tsconfig@4.10.0: 969 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 970 | 971 | glob-parent@5.1.2: 972 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 973 | engines: {node: '>= 6'} 974 | 975 | glob-parent@6.0.2: 976 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 977 | engines: {node: '>=10.13.0'} 978 | 979 | globals@14.0.0: 980 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 981 | engines: {node: '>=18'} 982 | 983 | globalthis@1.0.4: 984 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 985 | engines: {node: '>= 0.4'} 986 | 987 | gopd@1.2.0: 988 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 989 | engines: {node: '>= 0.4'} 990 | 991 | graphemer@1.4.0: 992 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 993 | 994 | has-bigints@1.1.0: 995 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 996 | engines: {node: '>= 0.4'} 997 | 998 | has-flag@4.0.0: 999 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1000 | engines: {node: '>=8'} 1001 | 1002 | has-property-descriptors@1.0.2: 1003 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1004 | 1005 | has-proto@1.2.0: 1006 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 1007 | engines: {node: '>= 0.4'} 1008 | 1009 | has-symbols@1.1.0: 1010 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1011 | engines: {node: '>= 0.4'} 1012 | 1013 | has-tostringtag@1.0.2: 1014 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1015 | engines: {node: '>= 0.4'} 1016 | 1017 | hasown@2.0.2: 1018 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1019 | engines: {node: '>= 0.4'} 1020 | 1021 | http-errors@2.0.0: 1022 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1023 | engines: {node: '>= 0.8'} 1024 | 1025 | iconv-lite@0.6.3: 1026 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1027 | engines: {node: '>=0.10.0'} 1028 | 1029 | ignore@5.3.2: 1030 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1031 | engines: {node: '>= 4'} 1032 | 1033 | ignore@7.0.4: 1034 | resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} 1035 | engines: {node: '>= 4'} 1036 | 1037 | import-fresh@3.3.1: 1038 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1039 | engines: {node: '>=6'} 1040 | 1041 | imurmurhash@0.1.4: 1042 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1043 | engines: {node: '>=0.8.19'} 1044 | 1045 | inherits@2.0.4: 1046 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1047 | 1048 | internal-slot@1.1.0: 1049 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1050 | engines: {node: '>= 0.4'} 1051 | 1052 | ipaddr.js@1.9.1: 1053 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1054 | engines: {node: '>= 0.10'} 1055 | 1056 | is-array-buffer@3.0.5: 1057 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1058 | engines: {node: '>= 0.4'} 1059 | 1060 | is-arrayish@0.3.2: 1061 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1062 | 1063 | is-async-function@2.1.1: 1064 | resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 1065 | engines: {node: '>= 0.4'} 1066 | 1067 | is-bigint@1.1.0: 1068 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1069 | engines: {node: '>= 0.4'} 1070 | 1071 | is-boolean-object@1.2.2: 1072 | resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 1073 | engines: {node: '>= 0.4'} 1074 | 1075 | is-bun-module@2.0.0: 1076 | resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} 1077 | 1078 | is-callable@1.2.7: 1079 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1080 | engines: {node: '>= 0.4'} 1081 | 1082 | is-core-module@2.16.1: 1083 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1084 | engines: {node: '>= 0.4'} 1085 | 1086 | is-data-view@1.0.2: 1087 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1088 | engines: {node: '>= 0.4'} 1089 | 1090 | is-date-object@1.1.0: 1091 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1092 | engines: {node: '>= 0.4'} 1093 | 1094 | is-extglob@2.1.1: 1095 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1096 | engines: {node: '>=0.10.0'} 1097 | 1098 | is-finalizationregistry@1.1.1: 1099 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1100 | engines: {node: '>= 0.4'} 1101 | 1102 | is-generator-function@1.1.0: 1103 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1104 | engines: {node: '>= 0.4'} 1105 | 1106 | is-glob@4.0.3: 1107 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1108 | engines: {node: '>=0.10.0'} 1109 | 1110 | is-map@2.0.3: 1111 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1112 | engines: {node: '>= 0.4'} 1113 | 1114 | is-number-object@1.1.1: 1115 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1116 | engines: {node: '>= 0.4'} 1117 | 1118 | is-number@7.0.0: 1119 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1120 | engines: {node: '>=0.12.0'} 1121 | 1122 | is-promise@4.0.0: 1123 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 1124 | 1125 | is-regex@1.2.1: 1126 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1127 | engines: {node: '>= 0.4'} 1128 | 1129 | is-set@2.0.3: 1130 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1131 | engines: {node: '>= 0.4'} 1132 | 1133 | is-shared-array-buffer@1.0.4: 1134 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1135 | engines: {node: '>= 0.4'} 1136 | 1137 | is-string@1.1.1: 1138 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1139 | engines: {node: '>= 0.4'} 1140 | 1141 | is-symbol@1.1.1: 1142 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1143 | engines: {node: '>= 0.4'} 1144 | 1145 | is-typed-array@1.1.15: 1146 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1147 | engines: {node: '>= 0.4'} 1148 | 1149 | is-weakmap@2.0.2: 1150 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1151 | engines: {node: '>= 0.4'} 1152 | 1153 | is-weakref@1.1.1: 1154 | resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 1155 | engines: {node: '>= 0.4'} 1156 | 1157 | is-weakset@2.0.4: 1158 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1159 | engines: {node: '>= 0.4'} 1160 | 1161 | isarray@2.0.5: 1162 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1163 | 1164 | isexe@2.0.0: 1165 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1166 | 1167 | iterator.prototype@1.1.5: 1168 | resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} 1169 | engines: {node: '>= 0.4'} 1170 | 1171 | js-tokens@4.0.0: 1172 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1173 | 1174 | js-yaml@4.1.0: 1175 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1176 | hasBin: true 1177 | 1178 | json-buffer@3.0.1: 1179 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1180 | 1181 | json-schema-traverse@0.4.1: 1182 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1183 | 1184 | json-stable-stringify-without-jsonify@1.0.1: 1185 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1186 | 1187 | json5@1.0.2: 1188 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1189 | hasBin: true 1190 | 1191 | jsx-ast-utils@3.3.5: 1192 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1193 | engines: {node: '>=4.0'} 1194 | 1195 | keyv@4.5.4: 1196 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1197 | 1198 | language-subtag-registry@0.3.23: 1199 | resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} 1200 | 1201 | language-tags@1.0.9: 1202 | resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} 1203 | engines: {node: '>=0.10'} 1204 | 1205 | levn@0.4.1: 1206 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1207 | engines: {node: '>= 0.8.0'} 1208 | 1209 | locate-path@6.0.0: 1210 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1211 | engines: {node: '>=10'} 1212 | 1213 | lodash.merge@4.6.2: 1214 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1215 | 1216 | loose-envify@1.4.0: 1217 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1218 | hasBin: true 1219 | 1220 | math-intrinsics@1.1.0: 1221 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1222 | engines: {node: '>= 0.4'} 1223 | 1224 | media-typer@1.1.0: 1225 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 1226 | engines: {node: '>= 0.8'} 1227 | 1228 | merge-descriptors@2.0.0: 1229 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 1230 | engines: {node: '>=18'} 1231 | 1232 | merge2@1.4.1: 1233 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1234 | engines: {node: '>= 8'} 1235 | 1236 | micromatch@4.0.8: 1237 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1238 | engines: {node: '>=8.6'} 1239 | 1240 | mime-db@1.54.0: 1241 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 1242 | engines: {node: '>= 0.6'} 1243 | 1244 | mime-types@3.0.1: 1245 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 1246 | engines: {node: '>= 0.6'} 1247 | 1248 | minimatch@3.1.2: 1249 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1250 | 1251 | minimatch@9.0.5: 1252 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1253 | engines: {node: '>=16 || 14 >=14.17'} 1254 | 1255 | minimist@1.2.8: 1256 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1257 | 1258 | ms@2.1.3: 1259 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1260 | 1261 | nanoid@3.3.11: 1262 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1263 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1264 | hasBin: true 1265 | 1266 | napi-postinstall@0.2.4: 1267 | resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} 1268 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 1269 | hasBin: true 1270 | 1271 | natural-compare@1.4.0: 1272 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1273 | 1274 | negotiator@1.0.0: 1275 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 1276 | engines: {node: '>= 0.6'} 1277 | 1278 | next@15.3.2: 1279 | resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} 1280 | engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} 1281 | hasBin: true 1282 | peerDependencies: 1283 | '@opentelemetry/api': ^1.1.0 1284 | '@playwright/test': ^1.41.2 1285 | babel-plugin-react-compiler: '*' 1286 | react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 1287 | react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 1288 | sass: ^1.3.0 1289 | peerDependenciesMeta: 1290 | '@opentelemetry/api': 1291 | optional: true 1292 | '@playwright/test': 1293 | optional: true 1294 | babel-plugin-react-compiler: 1295 | optional: true 1296 | sass: 1297 | optional: true 1298 | 1299 | object-assign@4.1.1: 1300 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1301 | engines: {node: '>=0.10.0'} 1302 | 1303 | object-inspect@1.13.4: 1304 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1305 | engines: {node: '>= 0.4'} 1306 | 1307 | object-keys@1.1.1: 1308 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1309 | engines: {node: '>= 0.4'} 1310 | 1311 | object.assign@4.1.7: 1312 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1313 | engines: {node: '>= 0.4'} 1314 | 1315 | object.entries@1.1.9: 1316 | resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} 1317 | engines: {node: '>= 0.4'} 1318 | 1319 | object.fromentries@2.0.8: 1320 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1321 | engines: {node: '>= 0.4'} 1322 | 1323 | object.groupby@1.0.3: 1324 | resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} 1325 | engines: {node: '>= 0.4'} 1326 | 1327 | object.values@1.2.1: 1328 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1329 | engines: {node: '>= 0.4'} 1330 | 1331 | on-finished@2.4.1: 1332 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1333 | engines: {node: '>= 0.8'} 1334 | 1335 | once@1.4.0: 1336 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1337 | 1338 | optionator@0.9.4: 1339 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1340 | engines: {node: '>= 0.8.0'} 1341 | 1342 | own-keys@1.0.1: 1343 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1344 | engines: {node: '>= 0.4'} 1345 | 1346 | p-limit@3.1.0: 1347 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1348 | engines: {node: '>=10'} 1349 | 1350 | p-locate@5.0.0: 1351 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1352 | engines: {node: '>=10'} 1353 | 1354 | parent-module@1.0.1: 1355 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1356 | engines: {node: '>=6'} 1357 | 1358 | parseurl@1.3.3: 1359 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1360 | engines: {node: '>= 0.8'} 1361 | 1362 | path-exists@4.0.0: 1363 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1364 | engines: {node: '>=8'} 1365 | 1366 | path-key@3.1.1: 1367 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1368 | engines: {node: '>=8'} 1369 | 1370 | path-parse@1.0.7: 1371 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1372 | 1373 | path-to-regexp@8.2.0: 1374 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 1375 | engines: {node: '>=16'} 1376 | 1377 | picocolors@1.1.1: 1378 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1379 | 1380 | picomatch@2.3.1: 1381 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1382 | engines: {node: '>=8.6'} 1383 | 1384 | picomatch@4.0.2: 1385 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1386 | engines: {node: '>=12'} 1387 | 1388 | pkce-challenge@5.0.0: 1389 | resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} 1390 | engines: {node: '>=16.20.0'} 1391 | 1392 | possible-typed-array-names@1.1.0: 1393 | resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1394 | engines: {node: '>= 0.4'} 1395 | 1396 | postcss@8.4.31: 1397 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1398 | engines: {node: ^10 || ^12 || >=14} 1399 | 1400 | prelude-ls@1.2.1: 1401 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1402 | engines: {node: '>= 0.8.0'} 1403 | 1404 | prop-types@15.8.1: 1405 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1406 | 1407 | proxy-addr@2.0.7: 1408 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1409 | engines: {node: '>= 0.10'} 1410 | 1411 | punycode@2.3.1: 1412 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1413 | engines: {node: '>=6'} 1414 | 1415 | qs@6.14.0: 1416 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 1417 | engines: {node: '>=0.6'} 1418 | 1419 | queue-microtask@1.2.3: 1420 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1421 | 1422 | range-parser@1.2.1: 1423 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1424 | engines: {node: '>= 0.6'} 1425 | 1426 | raw-body@3.0.0: 1427 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 1428 | engines: {node: '>= 0.8'} 1429 | 1430 | react-dom@19.1.0: 1431 | resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} 1432 | peerDependencies: 1433 | react: ^19.1.0 1434 | 1435 | react-is@16.13.1: 1436 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1437 | 1438 | react@19.1.0: 1439 | resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} 1440 | engines: {node: '>=0.10.0'} 1441 | 1442 | reflect.getprototypeof@1.0.10: 1443 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1444 | engines: {node: '>= 0.4'} 1445 | 1446 | regexp.prototype.flags@1.5.4: 1447 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1448 | engines: {node: '>= 0.4'} 1449 | 1450 | resolve-from@4.0.0: 1451 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1452 | engines: {node: '>=4'} 1453 | 1454 | resolve-pkg-maps@1.0.0: 1455 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1456 | 1457 | resolve@1.22.10: 1458 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1459 | engines: {node: '>= 0.4'} 1460 | hasBin: true 1461 | 1462 | resolve@2.0.0-next.5: 1463 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1464 | hasBin: true 1465 | 1466 | reusify@1.1.0: 1467 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1468 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1469 | 1470 | router@2.2.0: 1471 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 1472 | engines: {node: '>= 18'} 1473 | 1474 | run-parallel@1.2.0: 1475 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1476 | 1477 | safe-array-concat@1.1.3: 1478 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1479 | engines: {node: '>=0.4'} 1480 | 1481 | safe-buffer@5.2.1: 1482 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1483 | 1484 | safe-push-apply@1.0.0: 1485 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1486 | engines: {node: '>= 0.4'} 1487 | 1488 | safe-regex-test@1.1.0: 1489 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1490 | engines: {node: '>= 0.4'} 1491 | 1492 | safer-buffer@2.1.2: 1493 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1494 | 1495 | scheduler@0.26.0: 1496 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} 1497 | 1498 | semver@6.3.1: 1499 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1500 | hasBin: true 1501 | 1502 | semver@7.7.2: 1503 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1504 | engines: {node: '>=10'} 1505 | hasBin: true 1506 | 1507 | send@1.2.0: 1508 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 1509 | engines: {node: '>= 18'} 1510 | 1511 | serve-static@2.2.0: 1512 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 1513 | engines: {node: '>= 18'} 1514 | 1515 | set-function-length@1.2.2: 1516 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1517 | engines: {node: '>= 0.4'} 1518 | 1519 | set-function-name@2.0.2: 1520 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1521 | engines: {node: '>= 0.4'} 1522 | 1523 | set-proto@1.0.0: 1524 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1525 | engines: {node: '>= 0.4'} 1526 | 1527 | setprototypeof@1.2.0: 1528 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1529 | 1530 | sharp@0.34.1: 1531 | resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} 1532 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 1533 | 1534 | shebang-command@2.0.0: 1535 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1536 | engines: {node: '>=8'} 1537 | 1538 | shebang-regex@3.0.0: 1539 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1540 | engines: {node: '>=8'} 1541 | 1542 | side-channel-list@1.0.0: 1543 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1544 | engines: {node: '>= 0.4'} 1545 | 1546 | side-channel-map@1.0.1: 1547 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1548 | engines: {node: '>= 0.4'} 1549 | 1550 | side-channel-weakmap@1.0.2: 1551 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1552 | engines: {node: '>= 0.4'} 1553 | 1554 | side-channel@1.1.0: 1555 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1556 | engines: {node: '>= 0.4'} 1557 | 1558 | simple-swizzle@0.2.2: 1559 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1560 | 1561 | source-map-js@1.2.1: 1562 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1563 | engines: {node: '>=0.10.0'} 1564 | 1565 | stable-hash@0.0.5: 1566 | resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} 1567 | 1568 | statuses@2.0.1: 1569 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1570 | engines: {node: '>= 0.8'} 1571 | 1572 | streamsearch@1.1.0: 1573 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1574 | engines: {node: '>=10.0.0'} 1575 | 1576 | string.prototype.includes@2.0.1: 1577 | resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} 1578 | engines: {node: '>= 0.4'} 1579 | 1580 | string.prototype.matchall@4.0.12: 1581 | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1582 | engines: {node: '>= 0.4'} 1583 | 1584 | string.prototype.repeat@1.0.0: 1585 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1586 | 1587 | string.prototype.trim@1.2.10: 1588 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1589 | engines: {node: '>= 0.4'} 1590 | 1591 | string.prototype.trimend@1.0.9: 1592 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1593 | engines: {node: '>= 0.4'} 1594 | 1595 | string.prototype.trimstart@1.0.8: 1596 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1597 | engines: {node: '>= 0.4'} 1598 | 1599 | strip-bom@3.0.0: 1600 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1601 | engines: {node: '>=4'} 1602 | 1603 | strip-json-comments@3.1.1: 1604 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1605 | engines: {node: '>=8'} 1606 | 1607 | styled-jsx@5.1.6: 1608 | resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} 1609 | engines: {node: '>= 12.0.0'} 1610 | peerDependencies: 1611 | '@babel/core': '*' 1612 | babel-plugin-macros: '*' 1613 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' 1614 | peerDependenciesMeta: 1615 | '@babel/core': 1616 | optional: true 1617 | babel-plugin-macros: 1618 | optional: true 1619 | 1620 | supports-color@7.2.0: 1621 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1622 | engines: {node: '>=8'} 1623 | 1624 | supports-preserve-symlinks-flag@1.0.0: 1625 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1626 | engines: {node: '>= 0.4'} 1627 | 1628 | tinyglobby@0.2.13: 1629 | resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} 1630 | engines: {node: '>=12.0.0'} 1631 | 1632 | to-regex-range@5.0.1: 1633 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1634 | engines: {node: '>=8.0'} 1635 | 1636 | toidentifier@1.0.1: 1637 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1638 | engines: {node: '>=0.6'} 1639 | 1640 | ts-api-utils@2.1.0: 1641 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1642 | engines: {node: '>=18.12'} 1643 | peerDependencies: 1644 | typescript: '>=4.8.4' 1645 | 1646 | tsconfig-paths@3.15.0: 1647 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1648 | 1649 | tslib@2.8.1: 1650 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1651 | 1652 | type-check@0.4.0: 1653 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1654 | engines: {node: '>= 0.8.0'} 1655 | 1656 | type-is@2.0.1: 1657 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1658 | engines: {node: '>= 0.6'} 1659 | 1660 | typed-array-buffer@1.0.3: 1661 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1662 | engines: {node: '>= 0.4'} 1663 | 1664 | typed-array-byte-length@1.0.3: 1665 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1666 | engines: {node: '>= 0.4'} 1667 | 1668 | typed-array-byte-offset@1.0.4: 1669 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1670 | engines: {node: '>= 0.4'} 1671 | 1672 | typed-array-length@1.0.7: 1673 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1674 | engines: {node: '>= 0.4'} 1675 | 1676 | typescript@5.8.3: 1677 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1678 | engines: {node: '>=14.17'} 1679 | hasBin: true 1680 | 1681 | unbox-primitive@1.1.0: 1682 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1683 | engines: {node: '>= 0.4'} 1684 | 1685 | undici-types@6.21.0: 1686 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1687 | 1688 | unpipe@1.0.0: 1689 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1690 | engines: {node: '>= 0.8'} 1691 | 1692 | unrs-resolver@1.7.2: 1693 | resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} 1694 | 1695 | uri-js@4.4.1: 1696 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1697 | 1698 | vary@1.1.2: 1699 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1700 | engines: {node: '>= 0.8'} 1701 | 1702 | which-boxed-primitive@1.1.1: 1703 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1704 | engines: {node: '>= 0.4'} 1705 | 1706 | which-builtin-type@1.2.1: 1707 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1708 | engines: {node: '>= 0.4'} 1709 | 1710 | which-collection@1.0.2: 1711 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1712 | engines: {node: '>= 0.4'} 1713 | 1714 | which-typed-array@1.1.19: 1715 | resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 1716 | engines: {node: '>= 0.4'} 1717 | 1718 | which@2.0.2: 1719 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1720 | engines: {node: '>= 8'} 1721 | hasBin: true 1722 | 1723 | word-wrap@1.2.5: 1724 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1725 | engines: {node: '>=0.10.0'} 1726 | 1727 | wrappy@1.0.2: 1728 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1729 | 1730 | yocto-queue@0.1.0: 1731 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1732 | engines: {node: '>=10'} 1733 | 1734 | zod-to-json-schema@3.24.5: 1735 | resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 1736 | peerDependencies: 1737 | zod: ^3.24.1 1738 | 1739 | zod@3.24.4: 1740 | resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} 1741 | 1742 | snapshots: 1743 | 1744 | '@emnapi/core@1.4.3': 1745 | dependencies: 1746 | '@emnapi/wasi-threads': 1.0.2 1747 | tslib: 2.8.1 1748 | optional: true 1749 | 1750 | '@emnapi/runtime@1.4.3': 1751 | dependencies: 1752 | tslib: 2.8.1 1753 | optional: true 1754 | 1755 | '@emnapi/wasi-threads@1.0.2': 1756 | dependencies: 1757 | tslib: 2.8.1 1758 | optional: true 1759 | 1760 | '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': 1761 | dependencies: 1762 | eslint: 9.26.0 1763 | eslint-visitor-keys: 3.4.3 1764 | 1765 | '@eslint-community/regexpp@4.12.1': {} 1766 | 1767 | '@eslint/config-array@0.20.0': 1768 | dependencies: 1769 | '@eslint/object-schema': 2.1.6 1770 | debug: 4.4.0 1771 | minimatch: 3.1.2 1772 | transitivePeerDependencies: 1773 | - supports-color 1774 | 1775 | '@eslint/config-helpers@0.2.2': {} 1776 | 1777 | '@eslint/core@0.13.0': 1778 | dependencies: 1779 | '@types/json-schema': 7.0.15 1780 | 1781 | '@eslint/eslintrc@3.3.1': 1782 | dependencies: 1783 | ajv: 6.12.6 1784 | debug: 4.4.0 1785 | espree: 10.3.0 1786 | globals: 14.0.0 1787 | ignore: 5.3.2 1788 | import-fresh: 3.3.1 1789 | js-yaml: 4.1.0 1790 | minimatch: 3.1.2 1791 | strip-json-comments: 3.1.1 1792 | transitivePeerDependencies: 1793 | - supports-color 1794 | 1795 | '@eslint/js@9.26.0': {} 1796 | 1797 | '@eslint/object-schema@2.1.6': {} 1798 | 1799 | '@eslint/plugin-kit@0.2.8': 1800 | dependencies: 1801 | '@eslint/core': 0.13.0 1802 | levn: 0.4.1 1803 | 1804 | '@humanfs/core@0.19.1': {} 1805 | 1806 | '@humanfs/node@0.16.6': 1807 | dependencies: 1808 | '@humanfs/core': 0.19.1 1809 | '@humanwhocodes/retry': 0.3.1 1810 | 1811 | '@humanwhocodes/module-importer@1.0.1': {} 1812 | 1813 | '@humanwhocodes/retry@0.3.1': {} 1814 | 1815 | '@humanwhocodes/retry@0.4.3': {} 1816 | 1817 | '@img/sharp-darwin-arm64@0.34.1': 1818 | optionalDependencies: 1819 | '@img/sharp-libvips-darwin-arm64': 1.1.0 1820 | optional: true 1821 | 1822 | '@img/sharp-darwin-x64@0.34.1': 1823 | optionalDependencies: 1824 | '@img/sharp-libvips-darwin-x64': 1.1.0 1825 | optional: true 1826 | 1827 | '@img/sharp-libvips-darwin-arm64@1.1.0': 1828 | optional: true 1829 | 1830 | '@img/sharp-libvips-darwin-x64@1.1.0': 1831 | optional: true 1832 | 1833 | '@img/sharp-libvips-linux-arm64@1.1.0': 1834 | optional: true 1835 | 1836 | '@img/sharp-libvips-linux-arm@1.1.0': 1837 | optional: true 1838 | 1839 | '@img/sharp-libvips-linux-ppc64@1.1.0': 1840 | optional: true 1841 | 1842 | '@img/sharp-libvips-linux-s390x@1.1.0': 1843 | optional: true 1844 | 1845 | '@img/sharp-libvips-linux-x64@1.1.0': 1846 | optional: true 1847 | 1848 | '@img/sharp-libvips-linuxmusl-arm64@1.1.0': 1849 | optional: true 1850 | 1851 | '@img/sharp-libvips-linuxmusl-x64@1.1.0': 1852 | optional: true 1853 | 1854 | '@img/sharp-linux-arm64@0.34.1': 1855 | optionalDependencies: 1856 | '@img/sharp-libvips-linux-arm64': 1.1.0 1857 | optional: true 1858 | 1859 | '@img/sharp-linux-arm@0.34.1': 1860 | optionalDependencies: 1861 | '@img/sharp-libvips-linux-arm': 1.1.0 1862 | optional: true 1863 | 1864 | '@img/sharp-linux-s390x@0.34.1': 1865 | optionalDependencies: 1866 | '@img/sharp-libvips-linux-s390x': 1.1.0 1867 | optional: true 1868 | 1869 | '@img/sharp-linux-x64@0.34.1': 1870 | optionalDependencies: 1871 | '@img/sharp-libvips-linux-x64': 1.1.0 1872 | optional: true 1873 | 1874 | '@img/sharp-linuxmusl-arm64@0.34.1': 1875 | optionalDependencies: 1876 | '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 1877 | optional: true 1878 | 1879 | '@img/sharp-linuxmusl-x64@0.34.1': 1880 | optionalDependencies: 1881 | '@img/sharp-libvips-linuxmusl-x64': 1.1.0 1882 | optional: true 1883 | 1884 | '@img/sharp-wasm32@0.34.1': 1885 | dependencies: 1886 | '@emnapi/runtime': 1.4.3 1887 | optional: true 1888 | 1889 | '@img/sharp-win32-ia32@0.34.1': 1890 | optional: true 1891 | 1892 | '@img/sharp-win32-x64@0.34.1': 1893 | optional: true 1894 | 1895 | '@modelcontextprotocol/sdk@1.11.2': 1896 | dependencies: 1897 | content-type: 1.0.5 1898 | cors: 2.8.5 1899 | cross-spawn: 7.0.6 1900 | eventsource: 3.0.7 1901 | express: 5.1.0 1902 | express-rate-limit: 7.5.0(express@5.1.0) 1903 | pkce-challenge: 5.0.0 1904 | raw-body: 3.0.0 1905 | zod: 3.24.4 1906 | zod-to-json-schema: 3.24.5(zod@3.24.4) 1907 | transitivePeerDependencies: 1908 | - supports-color 1909 | 1910 | '@napi-rs/wasm-runtime@0.2.9': 1911 | dependencies: 1912 | '@emnapi/core': 1.4.3 1913 | '@emnapi/runtime': 1.4.3 1914 | '@tybys/wasm-util': 0.9.0 1915 | optional: true 1916 | 1917 | '@next/env@15.3.2': {} 1918 | 1919 | '@next/eslint-plugin-next@15.3.2': 1920 | dependencies: 1921 | fast-glob: 3.3.1 1922 | 1923 | '@next/swc-darwin-arm64@15.3.2': 1924 | optional: true 1925 | 1926 | '@next/swc-darwin-x64@15.3.2': 1927 | optional: true 1928 | 1929 | '@next/swc-linux-arm64-gnu@15.3.2': 1930 | optional: true 1931 | 1932 | '@next/swc-linux-arm64-musl@15.3.2': 1933 | optional: true 1934 | 1935 | '@next/swc-linux-x64-gnu@15.3.2': 1936 | optional: true 1937 | 1938 | '@next/swc-linux-x64-musl@15.3.2': 1939 | optional: true 1940 | 1941 | '@next/swc-win32-arm64-msvc@15.3.2': 1942 | optional: true 1943 | 1944 | '@next/swc-win32-x64-msvc@15.3.2': 1945 | optional: true 1946 | 1947 | '@nodelib/fs.scandir@2.1.5': 1948 | dependencies: 1949 | '@nodelib/fs.stat': 2.0.5 1950 | run-parallel: 1.2.0 1951 | 1952 | '@nodelib/fs.stat@2.0.5': {} 1953 | 1954 | '@nodelib/fs.walk@1.2.8': 1955 | dependencies: 1956 | '@nodelib/fs.scandir': 2.1.5 1957 | fastq: 1.19.1 1958 | 1959 | '@nolyfill/is-core-module@1.0.39': {} 1960 | 1961 | '@rtsao/scc@1.1.0': {} 1962 | 1963 | '@rushstack/eslint-patch@1.11.0': {} 1964 | 1965 | '@swc/counter@0.1.3': {} 1966 | 1967 | '@swc/helpers@0.5.15': 1968 | dependencies: 1969 | tslib: 2.8.1 1970 | 1971 | '@tybys/wasm-util@0.9.0': 1972 | dependencies: 1973 | tslib: 2.8.1 1974 | optional: true 1975 | 1976 | '@types/estree@1.0.7': {} 1977 | 1978 | '@types/json-schema@7.0.15': {} 1979 | 1980 | '@types/json5@0.0.29': {} 1981 | 1982 | '@types/node@22.15.17': 1983 | dependencies: 1984 | undici-types: 6.21.0 1985 | 1986 | '@types/react-dom@19.1.5(@types/react@19.1.4)': 1987 | dependencies: 1988 | '@types/react': 19.1.4 1989 | 1990 | '@types/react@19.1.4': 1991 | dependencies: 1992 | csstype: 3.1.3 1993 | 1994 | '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': 1995 | dependencies: 1996 | '@eslint-community/regexpp': 4.12.1 1997 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1998 | '@typescript-eslint/scope-manager': 8.32.1 1999 | '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2000 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2001 | '@typescript-eslint/visitor-keys': 8.32.1 2002 | eslint: 9.26.0 2003 | graphemer: 1.4.0 2004 | ignore: 7.0.4 2005 | natural-compare: 1.4.0 2006 | ts-api-utils: 2.1.0(typescript@5.8.3) 2007 | typescript: 5.8.3 2008 | transitivePeerDependencies: 2009 | - supports-color 2010 | 2011 | '@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 2012 | dependencies: 2013 | '@typescript-eslint/scope-manager': 8.32.1 2014 | '@typescript-eslint/types': 8.32.1 2015 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 2016 | '@typescript-eslint/visitor-keys': 8.32.1 2017 | debug: 4.4.0 2018 | eslint: 9.26.0 2019 | typescript: 5.8.3 2020 | transitivePeerDependencies: 2021 | - supports-color 2022 | 2023 | '@typescript-eslint/scope-manager@8.32.1': 2024 | dependencies: 2025 | '@typescript-eslint/types': 8.32.1 2026 | '@typescript-eslint/visitor-keys': 8.32.1 2027 | 2028 | '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 2029 | dependencies: 2030 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 2031 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2032 | debug: 4.4.0 2033 | eslint: 9.26.0 2034 | ts-api-utils: 2.1.0(typescript@5.8.3) 2035 | typescript: 5.8.3 2036 | transitivePeerDependencies: 2037 | - supports-color 2038 | 2039 | '@typescript-eslint/types@8.32.1': {} 2040 | 2041 | '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': 2042 | dependencies: 2043 | '@typescript-eslint/types': 8.32.1 2044 | '@typescript-eslint/visitor-keys': 8.32.1 2045 | debug: 4.4.0 2046 | fast-glob: 3.3.3 2047 | is-glob: 4.0.3 2048 | minimatch: 9.0.5 2049 | semver: 7.7.2 2050 | ts-api-utils: 2.1.0(typescript@5.8.3) 2051 | typescript: 5.8.3 2052 | transitivePeerDependencies: 2053 | - supports-color 2054 | 2055 | '@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 2056 | dependencies: 2057 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) 2058 | '@typescript-eslint/scope-manager': 8.32.1 2059 | '@typescript-eslint/types': 8.32.1 2060 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 2061 | eslint: 9.26.0 2062 | typescript: 5.8.3 2063 | transitivePeerDependencies: 2064 | - supports-color 2065 | 2066 | '@typescript-eslint/visitor-keys@8.32.1': 2067 | dependencies: 2068 | '@typescript-eslint/types': 8.32.1 2069 | eslint-visitor-keys: 4.2.0 2070 | 2071 | '@unrs/resolver-binding-darwin-arm64@1.7.2': 2072 | optional: true 2073 | 2074 | '@unrs/resolver-binding-darwin-x64@1.7.2': 2075 | optional: true 2076 | 2077 | '@unrs/resolver-binding-freebsd-x64@1.7.2': 2078 | optional: true 2079 | 2080 | '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': 2081 | optional: true 2082 | 2083 | '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': 2084 | optional: true 2085 | 2086 | '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': 2087 | optional: true 2088 | 2089 | '@unrs/resolver-binding-linux-arm64-musl@1.7.2': 2090 | optional: true 2091 | 2092 | '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': 2093 | optional: true 2094 | 2095 | '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': 2096 | optional: true 2097 | 2098 | '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': 2099 | optional: true 2100 | 2101 | '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': 2102 | optional: true 2103 | 2104 | '@unrs/resolver-binding-linux-x64-gnu@1.7.2': 2105 | optional: true 2106 | 2107 | '@unrs/resolver-binding-linux-x64-musl@1.7.2': 2108 | optional: true 2109 | 2110 | '@unrs/resolver-binding-wasm32-wasi@1.7.2': 2111 | dependencies: 2112 | '@napi-rs/wasm-runtime': 0.2.9 2113 | optional: true 2114 | 2115 | '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': 2116 | optional: true 2117 | 2118 | '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': 2119 | optional: true 2120 | 2121 | '@unrs/resolver-binding-win32-x64-msvc@1.7.2': 2122 | optional: true 2123 | 2124 | accepts@2.0.0: 2125 | dependencies: 2126 | mime-types: 3.0.1 2127 | negotiator: 1.0.0 2128 | 2129 | acorn-jsx@5.3.2(acorn@8.14.1): 2130 | dependencies: 2131 | acorn: 8.14.1 2132 | 2133 | acorn@8.14.1: {} 2134 | 2135 | ajv@6.12.6: 2136 | dependencies: 2137 | fast-deep-equal: 3.1.3 2138 | fast-json-stable-stringify: 2.1.0 2139 | json-schema-traverse: 0.4.1 2140 | uri-js: 4.4.1 2141 | 2142 | ansi-styles@4.3.0: 2143 | dependencies: 2144 | color-convert: 2.0.1 2145 | 2146 | argparse@2.0.1: {} 2147 | 2148 | aria-query@5.3.2: {} 2149 | 2150 | array-buffer-byte-length@1.0.2: 2151 | dependencies: 2152 | call-bound: 1.0.4 2153 | is-array-buffer: 3.0.5 2154 | 2155 | array-includes@3.1.8: 2156 | dependencies: 2157 | call-bind: 1.0.8 2158 | define-properties: 1.2.1 2159 | es-abstract: 1.23.9 2160 | es-object-atoms: 1.1.1 2161 | get-intrinsic: 1.3.0 2162 | is-string: 1.1.1 2163 | 2164 | array.prototype.findlast@1.2.5: 2165 | dependencies: 2166 | call-bind: 1.0.8 2167 | define-properties: 1.2.1 2168 | es-abstract: 1.23.9 2169 | es-errors: 1.3.0 2170 | es-object-atoms: 1.1.1 2171 | es-shim-unscopables: 1.1.0 2172 | 2173 | array.prototype.findlastindex@1.2.6: 2174 | dependencies: 2175 | call-bind: 1.0.8 2176 | call-bound: 1.0.4 2177 | define-properties: 1.2.1 2178 | es-abstract: 1.23.9 2179 | es-errors: 1.3.0 2180 | es-object-atoms: 1.1.1 2181 | es-shim-unscopables: 1.1.0 2182 | 2183 | array.prototype.flat@1.3.3: 2184 | dependencies: 2185 | call-bind: 1.0.8 2186 | define-properties: 1.2.1 2187 | es-abstract: 1.23.9 2188 | es-shim-unscopables: 1.1.0 2189 | 2190 | array.prototype.flatmap@1.3.3: 2191 | dependencies: 2192 | call-bind: 1.0.8 2193 | define-properties: 1.2.1 2194 | es-abstract: 1.23.9 2195 | es-shim-unscopables: 1.1.0 2196 | 2197 | array.prototype.tosorted@1.1.4: 2198 | dependencies: 2199 | call-bind: 1.0.8 2200 | define-properties: 1.2.1 2201 | es-abstract: 1.23.9 2202 | es-errors: 1.3.0 2203 | es-shim-unscopables: 1.1.0 2204 | 2205 | arraybuffer.prototype.slice@1.0.4: 2206 | dependencies: 2207 | array-buffer-byte-length: 1.0.2 2208 | call-bind: 1.0.8 2209 | define-properties: 1.2.1 2210 | es-abstract: 1.23.9 2211 | es-errors: 1.3.0 2212 | get-intrinsic: 1.3.0 2213 | is-array-buffer: 3.0.5 2214 | 2215 | ast-types-flow@0.0.8: {} 2216 | 2217 | async-function@1.0.0: {} 2218 | 2219 | available-typed-arrays@1.0.7: 2220 | dependencies: 2221 | possible-typed-array-names: 1.1.0 2222 | 2223 | axe-core@4.10.3: {} 2224 | 2225 | axobject-query@4.1.0: {} 2226 | 2227 | balanced-match@1.0.2: {} 2228 | 2229 | body-parser@2.2.0: 2230 | dependencies: 2231 | bytes: 3.1.2 2232 | content-type: 1.0.5 2233 | debug: 4.4.0 2234 | http-errors: 2.0.0 2235 | iconv-lite: 0.6.3 2236 | on-finished: 2.4.1 2237 | qs: 6.14.0 2238 | raw-body: 3.0.0 2239 | type-is: 2.0.1 2240 | transitivePeerDependencies: 2241 | - supports-color 2242 | 2243 | brace-expansion@1.1.11: 2244 | dependencies: 2245 | balanced-match: 1.0.2 2246 | concat-map: 0.0.1 2247 | 2248 | brace-expansion@2.0.1: 2249 | dependencies: 2250 | balanced-match: 1.0.2 2251 | 2252 | braces@3.0.3: 2253 | dependencies: 2254 | fill-range: 7.1.1 2255 | 2256 | busboy@1.6.0: 2257 | dependencies: 2258 | streamsearch: 1.1.0 2259 | 2260 | bytes@3.1.2: {} 2261 | 2262 | call-bind-apply-helpers@1.0.2: 2263 | dependencies: 2264 | es-errors: 1.3.0 2265 | function-bind: 1.1.2 2266 | 2267 | call-bind@1.0.8: 2268 | dependencies: 2269 | call-bind-apply-helpers: 1.0.2 2270 | es-define-property: 1.0.1 2271 | get-intrinsic: 1.3.0 2272 | set-function-length: 1.2.2 2273 | 2274 | call-bound@1.0.4: 2275 | dependencies: 2276 | call-bind-apply-helpers: 1.0.2 2277 | get-intrinsic: 1.3.0 2278 | 2279 | callsites@3.1.0: {} 2280 | 2281 | caniuse-lite@1.0.30001718: {} 2282 | 2283 | chalk@4.1.2: 2284 | dependencies: 2285 | ansi-styles: 4.3.0 2286 | supports-color: 7.2.0 2287 | 2288 | client-only@0.0.1: {} 2289 | 2290 | color-convert@2.0.1: 2291 | dependencies: 2292 | color-name: 1.1.4 2293 | 2294 | color-name@1.1.4: {} 2295 | 2296 | color-string@1.9.1: 2297 | dependencies: 2298 | color-name: 1.1.4 2299 | simple-swizzle: 0.2.2 2300 | optional: true 2301 | 2302 | color@4.2.3: 2303 | dependencies: 2304 | color-convert: 2.0.1 2305 | color-string: 1.9.1 2306 | optional: true 2307 | 2308 | concat-map@0.0.1: {} 2309 | 2310 | content-disposition@1.0.0: 2311 | dependencies: 2312 | safe-buffer: 5.2.1 2313 | 2314 | content-type@1.0.5: {} 2315 | 2316 | cookie-signature@1.2.2: {} 2317 | 2318 | cookie@0.7.2: {} 2319 | 2320 | cors@2.8.5: 2321 | dependencies: 2322 | object-assign: 4.1.1 2323 | vary: 1.1.2 2324 | 2325 | cross-spawn@7.0.6: 2326 | dependencies: 2327 | path-key: 3.1.1 2328 | shebang-command: 2.0.0 2329 | which: 2.0.2 2330 | 2331 | csstype@3.1.3: {} 2332 | 2333 | damerau-levenshtein@1.0.8: {} 2334 | 2335 | data-view-buffer@1.0.2: 2336 | dependencies: 2337 | call-bound: 1.0.4 2338 | es-errors: 1.3.0 2339 | is-data-view: 1.0.2 2340 | 2341 | data-view-byte-length@1.0.2: 2342 | dependencies: 2343 | call-bound: 1.0.4 2344 | es-errors: 1.3.0 2345 | is-data-view: 1.0.2 2346 | 2347 | data-view-byte-offset@1.0.1: 2348 | dependencies: 2349 | call-bound: 1.0.4 2350 | es-errors: 1.3.0 2351 | is-data-view: 1.0.2 2352 | 2353 | debug@3.2.7: 2354 | dependencies: 2355 | ms: 2.1.3 2356 | 2357 | debug@4.4.0: 2358 | dependencies: 2359 | ms: 2.1.3 2360 | 2361 | deep-is@0.1.4: {} 2362 | 2363 | define-data-property@1.1.4: 2364 | dependencies: 2365 | es-define-property: 1.0.1 2366 | es-errors: 1.3.0 2367 | gopd: 1.2.0 2368 | 2369 | define-properties@1.2.1: 2370 | dependencies: 2371 | define-data-property: 1.1.4 2372 | has-property-descriptors: 1.0.2 2373 | object-keys: 1.1.1 2374 | 2375 | depd@2.0.0: {} 2376 | 2377 | detect-libc@2.0.4: 2378 | optional: true 2379 | 2380 | doctrine@2.1.0: 2381 | dependencies: 2382 | esutils: 2.0.3 2383 | 2384 | dunder-proto@1.0.1: 2385 | dependencies: 2386 | call-bind-apply-helpers: 1.0.2 2387 | es-errors: 1.3.0 2388 | gopd: 1.2.0 2389 | 2390 | ee-first@1.1.1: {} 2391 | 2392 | emoji-regex@9.2.2: {} 2393 | 2394 | encodeurl@2.0.0: {} 2395 | 2396 | es-abstract@1.23.9: 2397 | dependencies: 2398 | array-buffer-byte-length: 1.0.2 2399 | arraybuffer.prototype.slice: 1.0.4 2400 | available-typed-arrays: 1.0.7 2401 | call-bind: 1.0.8 2402 | call-bound: 1.0.4 2403 | data-view-buffer: 1.0.2 2404 | data-view-byte-length: 1.0.2 2405 | data-view-byte-offset: 1.0.1 2406 | es-define-property: 1.0.1 2407 | es-errors: 1.3.0 2408 | es-object-atoms: 1.1.1 2409 | es-set-tostringtag: 2.1.0 2410 | es-to-primitive: 1.3.0 2411 | function.prototype.name: 1.1.8 2412 | get-intrinsic: 1.3.0 2413 | get-proto: 1.0.1 2414 | get-symbol-description: 1.1.0 2415 | globalthis: 1.0.4 2416 | gopd: 1.2.0 2417 | has-property-descriptors: 1.0.2 2418 | has-proto: 1.2.0 2419 | has-symbols: 1.1.0 2420 | hasown: 2.0.2 2421 | internal-slot: 1.1.0 2422 | is-array-buffer: 3.0.5 2423 | is-callable: 1.2.7 2424 | is-data-view: 1.0.2 2425 | is-regex: 1.2.1 2426 | is-shared-array-buffer: 1.0.4 2427 | is-string: 1.1.1 2428 | is-typed-array: 1.1.15 2429 | is-weakref: 1.1.1 2430 | math-intrinsics: 1.1.0 2431 | object-inspect: 1.13.4 2432 | object-keys: 1.1.1 2433 | object.assign: 4.1.7 2434 | own-keys: 1.0.1 2435 | regexp.prototype.flags: 1.5.4 2436 | safe-array-concat: 1.1.3 2437 | safe-push-apply: 1.0.0 2438 | safe-regex-test: 1.1.0 2439 | set-proto: 1.0.0 2440 | string.prototype.trim: 1.2.10 2441 | string.prototype.trimend: 1.0.9 2442 | string.prototype.trimstart: 1.0.8 2443 | typed-array-buffer: 1.0.3 2444 | typed-array-byte-length: 1.0.3 2445 | typed-array-byte-offset: 1.0.4 2446 | typed-array-length: 1.0.7 2447 | unbox-primitive: 1.1.0 2448 | which-typed-array: 1.1.19 2449 | 2450 | es-define-property@1.0.1: {} 2451 | 2452 | es-errors@1.3.0: {} 2453 | 2454 | es-iterator-helpers@1.2.1: 2455 | dependencies: 2456 | call-bind: 1.0.8 2457 | call-bound: 1.0.4 2458 | define-properties: 1.2.1 2459 | es-abstract: 1.23.9 2460 | es-errors: 1.3.0 2461 | es-set-tostringtag: 2.1.0 2462 | function-bind: 1.1.2 2463 | get-intrinsic: 1.3.0 2464 | globalthis: 1.0.4 2465 | gopd: 1.2.0 2466 | has-property-descriptors: 1.0.2 2467 | has-proto: 1.2.0 2468 | has-symbols: 1.1.0 2469 | internal-slot: 1.1.0 2470 | iterator.prototype: 1.1.5 2471 | safe-array-concat: 1.1.3 2472 | 2473 | es-object-atoms@1.1.1: 2474 | dependencies: 2475 | es-errors: 1.3.0 2476 | 2477 | es-set-tostringtag@2.1.0: 2478 | dependencies: 2479 | es-errors: 1.3.0 2480 | get-intrinsic: 1.3.0 2481 | has-tostringtag: 1.0.2 2482 | hasown: 2.0.2 2483 | 2484 | es-shim-unscopables@1.1.0: 2485 | dependencies: 2486 | hasown: 2.0.2 2487 | 2488 | es-to-primitive@1.3.0: 2489 | dependencies: 2490 | is-callable: 1.2.7 2491 | is-date-object: 1.1.0 2492 | is-symbol: 1.1.1 2493 | 2494 | escape-html@1.0.3: {} 2495 | 2496 | escape-string-regexp@4.0.0: {} 2497 | 2498 | eslint-config-next@15.3.2(eslint@9.26.0)(typescript@5.8.3): 2499 | dependencies: 2500 | '@next/eslint-plugin-next': 15.3.2 2501 | '@rushstack/eslint-patch': 1.11.0 2502 | '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) 2503 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2504 | eslint: 9.26.0 2505 | eslint-import-resolver-node: 0.3.9 2506 | eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0) 2507 | eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0) 2508 | eslint-plugin-jsx-a11y: 6.10.2(eslint@9.26.0) 2509 | eslint-plugin-react: 7.37.5(eslint@9.26.0) 2510 | eslint-plugin-react-hooks: 5.2.0(eslint@9.26.0) 2511 | optionalDependencies: 2512 | typescript: 5.8.3 2513 | transitivePeerDependencies: 2514 | - eslint-import-resolver-webpack 2515 | - eslint-plugin-import-x 2516 | - supports-color 2517 | 2518 | eslint-import-resolver-node@0.3.9: 2519 | dependencies: 2520 | debug: 3.2.7 2521 | is-core-module: 2.16.1 2522 | resolve: 1.22.10 2523 | transitivePeerDependencies: 2524 | - supports-color 2525 | 2526 | eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0): 2527 | dependencies: 2528 | '@nolyfill/is-core-module': 1.0.39 2529 | debug: 4.4.0 2530 | eslint: 9.26.0 2531 | get-tsconfig: 4.10.0 2532 | is-bun-module: 2.0.0 2533 | stable-hash: 0.0.5 2534 | tinyglobby: 0.2.13 2535 | unrs-resolver: 1.7.2 2536 | optionalDependencies: 2537 | eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0) 2538 | transitivePeerDependencies: 2539 | - supports-color 2540 | 2541 | eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0): 2542 | dependencies: 2543 | debug: 3.2.7 2544 | optionalDependencies: 2545 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2546 | eslint: 9.26.0 2547 | eslint-import-resolver-node: 0.3.9 2548 | eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0) 2549 | transitivePeerDependencies: 2550 | - supports-color 2551 | 2552 | eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0): 2553 | dependencies: 2554 | '@rtsao/scc': 1.1.0 2555 | array-includes: 3.1.8 2556 | array.prototype.findlastindex: 1.2.6 2557 | array.prototype.flat: 1.3.3 2558 | array.prototype.flatmap: 1.3.3 2559 | debug: 3.2.7 2560 | doctrine: 2.1.0 2561 | eslint: 9.26.0 2562 | eslint-import-resolver-node: 0.3.9 2563 | eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0) 2564 | hasown: 2.0.2 2565 | is-core-module: 2.16.1 2566 | is-glob: 4.0.3 2567 | minimatch: 3.1.2 2568 | object.fromentries: 2.0.8 2569 | object.groupby: 1.0.3 2570 | object.values: 1.2.1 2571 | semver: 6.3.1 2572 | string.prototype.trimend: 1.0.9 2573 | tsconfig-paths: 3.15.0 2574 | optionalDependencies: 2575 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2576 | transitivePeerDependencies: 2577 | - eslint-import-resolver-typescript 2578 | - eslint-import-resolver-webpack 2579 | - supports-color 2580 | 2581 | eslint-plugin-jsx-a11y@6.10.2(eslint@9.26.0): 2582 | dependencies: 2583 | aria-query: 5.3.2 2584 | array-includes: 3.1.8 2585 | array.prototype.flatmap: 1.3.3 2586 | ast-types-flow: 0.0.8 2587 | axe-core: 4.10.3 2588 | axobject-query: 4.1.0 2589 | damerau-levenshtein: 1.0.8 2590 | emoji-regex: 9.2.2 2591 | eslint: 9.26.0 2592 | hasown: 2.0.2 2593 | jsx-ast-utils: 3.3.5 2594 | language-tags: 1.0.9 2595 | minimatch: 3.1.2 2596 | object.fromentries: 2.0.8 2597 | safe-regex-test: 1.1.0 2598 | string.prototype.includes: 2.0.1 2599 | 2600 | eslint-plugin-react-hooks@5.2.0(eslint@9.26.0): 2601 | dependencies: 2602 | eslint: 9.26.0 2603 | 2604 | eslint-plugin-react@7.37.5(eslint@9.26.0): 2605 | dependencies: 2606 | array-includes: 3.1.8 2607 | array.prototype.findlast: 1.2.5 2608 | array.prototype.flatmap: 1.3.3 2609 | array.prototype.tosorted: 1.1.4 2610 | doctrine: 2.1.0 2611 | es-iterator-helpers: 1.2.1 2612 | eslint: 9.26.0 2613 | estraverse: 5.3.0 2614 | hasown: 2.0.2 2615 | jsx-ast-utils: 3.3.5 2616 | minimatch: 3.1.2 2617 | object.entries: 1.1.9 2618 | object.fromentries: 2.0.8 2619 | object.values: 1.2.1 2620 | prop-types: 15.8.1 2621 | resolve: 2.0.0-next.5 2622 | semver: 6.3.1 2623 | string.prototype.matchall: 4.0.12 2624 | string.prototype.repeat: 1.0.0 2625 | 2626 | eslint-scope@8.3.0: 2627 | dependencies: 2628 | esrecurse: 4.3.0 2629 | estraverse: 5.3.0 2630 | 2631 | eslint-visitor-keys@3.4.3: {} 2632 | 2633 | eslint-visitor-keys@4.2.0: {} 2634 | 2635 | eslint@9.26.0: 2636 | dependencies: 2637 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) 2638 | '@eslint-community/regexpp': 4.12.1 2639 | '@eslint/config-array': 0.20.0 2640 | '@eslint/config-helpers': 0.2.2 2641 | '@eslint/core': 0.13.0 2642 | '@eslint/eslintrc': 3.3.1 2643 | '@eslint/js': 9.26.0 2644 | '@eslint/plugin-kit': 0.2.8 2645 | '@humanfs/node': 0.16.6 2646 | '@humanwhocodes/module-importer': 1.0.1 2647 | '@humanwhocodes/retry': 0.4.3 2648 | '@modelcontextprotocol/sdk': 1.11.2 2649 | '@types/estree': 1.0.7 2650 | '@types/json-schema': 7.0.15 2651 | ajv: 6.12.6 2652 | chalk: 4.1.2 2653 | cross-spawn: 7.0.6 2654 | debug: 4.4.0 2655 | escape-string-regexp: 4.0.0 2656 | eslint-scope: 8.3.0 2657 | eslint-visitor-keys: 4.2.0 2658 | espree: 10.3.0 2659 | esquery: 1.6.0 2660 | esutils: 2.0.3 2661 | fast-deep-equal: 3.1.3 2662 | file-entry-cache: 8.0.0 2663 | find-up: 5.0.0 2664 | glob-parent: 6.0.2 2665 | ignore: 5.3.2 2666 | imurmurhash: 0.1.4 2667 | is-glob: 4.0.3 2668 | json-stable-stringify-without-jsonify: 1.0.1 2669 | lodash.merge: 4.6.2 2670 | minimatch: 3.1.2 2671 | natural-compare: 1.4.0 2672 | optionator: 0.9.4 2673 | zod: 3.24.4 2674 | transitivePeerDependencies: 2675 | - supports-color 2676 | 2677 | espree@10.3.0: 2678 | dependencies: 2679 | acorn: 8.14.1 2680 | acorn-jsx: 5.3.2(acorn@8.14.1) 2681 | eslint-visitor-keys: 4.2.0 2682 | 2683 | esquery@1.6.0: 2684 | dependencies: 2685 | estraverse: 5.3.0 2686 | 2687 | esrecurse@4.3.0: 2688 | dependencies: 2689 | estraverse: 5.3.0 2690 | 2691 | estraverse@5.3.0: {} 2692 | 2693 | esutils@2.0.3: {} 2694 | 2695 | etag@1.8.1: {} 2696 | 2697 | eventsource-parser@3.0.1: {} 2698 | 2699 | eventsource@3.0.7: 2700 | dependencies: 2701 | eventsource-parser: 3.0.1 2702 | 2703 | express-rate-limit@7.5.0(express@5.1.0): 2704 | dependencies: 2705 | express: 5.1.0 2706 | 2707 | express@5.1.0: 2708 | dependencies: 2709 | accepts: 2.0.0 2710 | body-parser: 2.2.0 2711 | content-disposition: 1.0.0 2712 | content-type: 1.0.5 2713 | cookie: 0.7.2 2714 | cookie-signature: 1.2.2 2715 | debug: 4.4.0 2716 | encodeurl: 2.0.0 2717 | escape-html: 1.0.3 2718 | etag: 1.8.1 2719 | finalhandler: 2.1.0 2720 | fresh: 2.0.0 2721 | http-errors: 2.0.0 2722 | merge-descriptors: 2.0.0 2723 | mime-types: 3.0.1 2724 | on-finished: 2.4.1 2725 | once: 1.4.0 2726 | parseurl: 1.3.3 2727 | proxy-addr: 2.0.7 2728 | qs: 6.14.0 2729 | range-parser: 1.2.1 2730 | router: 2.2.0 2731 | send: 1.2.0 2732 | serve-static: 2.2.0 2733 | statuses: 2.0.1 2734 | type-is: 2.0.1 2735 | vary: 1.1.2 2736 | transitivePeerDependencies: 2737 | - supports-color 2738 | 2739 | fast-deep-equal@3.1.3: {} 2740 | 2741 | fast-glob@3.3.1: 2742 | dependencies: 2743 | '@nodelib/fs.stat': 2.0.5 2744 | '@nodelib/fs.walk': 1.2.8 2745 | glob-parent: 5.1.2 2746 | merge2: 1.4.1 2747 | micromatch: 4.0.8 2748 | 2749 | fast-glob@3.3.3: 2750 | dependencies: 2751 | '@nodelib/fs.stat': 2.0.5 2752 | '@nodelib/fs.walk': 1.2.8 2753 | glob-parent: 5.1.2 2754 | merge2: 1.4.1 2755 | micromatch: 4.0.8 2756 | 2757 | fast-json-stable-stringify@2.1.0: {} 2758 | 2759 | fast-levenshtein@2.0.6: {} 2760 | 2761 | fastq@1.19.1: 2762 | dependencies: 2763 | reusify: 1.1.0 2764 | 2765 | fdir@6.4.4(picomatch@4.0.2): 2766 | optionalDependencies: 2767 | picomatch: 4.0.2 2768 | 2769 | file-entry-cache@8.0.0: 2770 | dependencies: 2771 | flat-cache: 4.0.1 2772 | 2773 | fill-range@7.1.1: 2774 | dependencies: 2775 | to-regex-range: 5.0.1 2776 | 2777 | finalhandler@2.1.0: 2778 | dependencies: 2779 | debug: 4.4.0 2780 | encodeurl: 2.0.0 2781 | escape-html: 1.0.3 2782 | on-finished: 2.4.1 2783 | parseurl: 1.3.3 2784 | statuses: 2.0.1 2785 | transitivePeerDependencies: 2786 | - supports-color 2787 | 2788 | find-up@5.0.0: 2789 | dependencies: 2790 | locate-path: 6.0.0 2791 | path-exists: 4.0.0 2792 | 2793 | flat-cache@4.0.1: 2794 | dependencies: 2795 | flatted: 3.3.3 2796 | keyv: 4.5.4 2797 | 2798 | flatted@3.3.3: {} 2799 | 2800 | for-each@0.3.5: 2801 | dependencies: 2802 | is-callable: 1.2.7 2803 | 2804 | forwarded@0.2.0: {} 2805 | 2806 | fresh@2.0.0: {} 2807 | 2808 | function-bind@1.1.2: {} 2809 | 2810 | function.prototype.name@1.1.8: 2811 | dependencies: 2812 | call-bind: 1.0.8 2813 | call-bound: 1.0.4 2814 | define-properties: 1.2.1 2815 | functions-have-names: 1.2.3 2816 | hasown: 2.0.2 2817 | is-callable: 1.2.7 2818 | 2819 | functions-have-names@1.2.3: {} 2820 | 2821 | get-intrinsic@1.3.0: 2822 | dependencies: 2823 | call-bind-apply-helpers: 1.0.2 2824 | es-define-property: 1.0.1 2825 | es-errors: 1.3.0 2826 | es-object-atoms: 1.1.1 2827 | function-bind: 1.1.2 2828 | get-proto: 1.0.1 2829 | gopd: 1.2.0 2830 | has-symbols: 1.1.0 2831 | hasown: 2.0.2 2832 | math-intrinsics: 1.1.0 2833 | 2834 | get-proto@1.0.1: 2835 | dependencies: 2836 | dunder-proto: 1.0.1 2837 | es-object-atoms: 1.1.1 2838 | 2839 | get-symbol-description@1.1.0: 2840 | dependencies: 2841 | call-bound: 1.0.4 2842 | es-errors: 1.3.0 2843 | get-intrinsic: 1.3.0 2844 | 2845 | get-tsconfig@4.10.0: 2846 | dependencies: 2847 | resolve-pkg-maps: 1.0.0 2848 | 2849 | glob-parent@5.1.2: 2850 | dependencies: 2851 | is-glob: 4.0.3 2852 | 2853 | glob-parent@6.0.2: 2854 | dependencies: 2855 | is-glob: 4.0.3 2856 | 2857 | globals@14.0.0: {} 2858 | 2859 | globalthis@1.0.4: 2860 | dependencies: 2861 | define-properties: 1.2.1 2862 | gopd: 1.2.0 2863 | 2864 | gopd@1.2.0: {} 2865 | 2866 | graphemer@1.4.0: {} 2867 | 2868 | has-bigints@1.1.0: {} 2869 | 2870 | has-flag@4.0.0: {} 2871 | 2872 | has-property-descriptors@1.0.2: 2873 | dependencies: 2874 | es-define-property: 1.0.1 2875 | 2876 | has-proto@1.2.0: 2877 | dependencies: 2878 | dunder-proto: 1.0.1 2879 | 2880 | has-symbols@1.1.0: {} 2881 | 2882 | has-tostringtag@1.0.2: 2883 | dependencies: 2884 | has-symbols: 1.1.0 2885 | 2886 | hasown@2.0.2: 2887 | dependencies: 2888 | function-bind: 1.1.2 2889 | 2890 | http-errors@2.0.0: 2891 | dependencies: 2892 | depd: 2.0.0 2893 | inherits: 2.0.4 2894 | setprototypeof: 1.2.0 2895 | statuses: 2.0.1 2896 | toidentifier: 1.0.1 2897 | 2898 | iconv-lite@0.6.3: 2899 | dependencies: 2900 | safer-buffer: 2.1.2 2901 | 2902 | ignore@5.3.2: {} 2903 | 2904 | ignore@7.0.4: {} 2905 | 2906 | import-fresh@3.3.1: 2907 | dependencies: 2908 | parent-module: 1.0.1 2909 | resolve-from: 4.0.0 2910 | 2911 | imurmurhash@0.1.4: {} 2912 | 2913 | inherits@2.0.4: {} 2914 | 2915 | internal-slot@1.1.0: 2916 | dependencies: 2917 | es-errors: 1.3.0 2918 | hasown: 2.0.2 2919 | side-channel: 1.1.0 2920 | 2921 | ipaddr.js@1.9.1: {} 2922 | 2923 | is-array-buffer@3.0.5: 2924 | dependencies: 2925 | call-bind: 1.0.8 2926 | call-bound: 1.0.4 2927 | get-intrinsic: 1.3.0 2928 | 2929 | is-arrayish@0.3.2: 2930 | optional: true 2931 | 2932 | is-async-function@2.1.1: 2933 | dependencies: 2934 | async-function: 1.0.0 2935 | call-bound: 1.0.4 2936 | get-proto: 1.0.1 2937 | has-tostringtag: 1.0.2 2938 | safe-regex-test: 1.1.0 2939 | 2940 | is-bigint@1.1.0: 2941 | dependencies: 2942 | has-bigints: 1.1.0 2943 | 2944 | is-boolean-object@1.2.2: 2945 | dependencies: 2946 | call-bound: 1.0.4 2947 | has-tostringtag: 1.0.2 2948 | 2949 | is-bun-module@2.0.0: 2950 | dependencies: 2951 | semver: 7.7.2 2952 | 2953 | is-callable@1.2.7: {} 2954 | 2955 | is-core-module@2.16.1: 2956 | dependencies: 2957 | hasown: 2.0.2 2958 | 2959 | is-data-view@1.0.2: 2960 | dependencies: 2961 | call-bound: 1.0.4 2962 | get-intrinsic: 1.3.0 2963 | is-typed-array: 1.1.15 2964 | 2965 | is-date-object@1.1.0: 2966 | dependencies: 2967 | call-bound: 1.0.4 2968 | has-tostringtag: 1.0.2 2969 | 2970 | is-extglob@2.1.1: {} 2971 | 2972 | is-finalizationregistry@1.1.1: 2973 | dependencies: 2974 | call-bound: 1.0.4 2975 | 2976 | is-generator-function@1.1.0: 2977 | dependencies: 2978 | call-bound: 1.0.4 2979 | get-proto: 1.0.1 2980 | has-tostringtag: 1.0.2 2981 | safe-regex-test: 1.1.0 2982 | 2983 | is-glob@4.0.3: 2984 | dependencies: 2985 | is-extglob: 2.1.1 2986 | 2987 | is-map@2.0.3: {} 2988 | 2989 | is-number-object@1.1.1: 2990 | dependencies: 2991 | call-bound: 1.0.4 2992 | has-tostringtag: 1.0.2 2993 | 2994 | is-number@7.0.0: {} 2995 | 2996 | is-promise@4.0.0: {} 2997 | 2998 | is-regex@1.2.1: 2999 | dependencies: 3000 | call-bound: 1.0.4 3001 | gopd: 1.2.0 3002 | has-tostringtag: 1.0.2 3003 | hasown: 2.0.2 3004 | 3005 | is-set@2.0.3: {} 3006 | 3007 | is-shared-array-buffer@1.0.4: 3008 | dependencies: 3009 | call-bound: 1.0.4 3010 | 3011 | is-string@1.1.1: 3012 | dependencies: 3013 | call-bound: 1.0.4 3014 | has-tostringtag: 1.0.2 3015 | 3016 | is-symbol@1.1.1: 3017 | dependencies: 3018 | call-bound: 1.0.4 3019 | has-symbols: 1.1.0 3020 | safe-regex-test: 1.1.0 3021 | 3022 | is-typed-array@1.1.15: 3023 | dependencies: 3024 | which-typed-array: 1.1.19 3025 | 3026 | is-weakmap@2.0.2: {} 3027 | 3028 | is-weakref@1.1.1: 3029 | dependencies: 3030 | call-bound: 1.0.4 3031 | 3032 | is-weakset@2.0.4: 3033 | dependencies: 3034 | call-bound: 1.0.4 3035 | get-intrinsic: 1.3.0 3036 | 3037 | isarray@2.0.5: {} 3038 | 3039 | isexe@2.0.0: {} 3040 | 3041 | iterator.prototype@1.1.5: 3042 | dependencies: 3043 | define-data-property: 1.1.4 3044 | es-object-atoms: 1.1.1 3045 | get-intrinsic: 1.3.0 3046 | get-proto: 1.0.1 3047 | has-symbols: 1.1.0 3048 | set-function-name: 2.0.2 3049 | 3050 | js-tokens@4.0.0: {} 3051 | 3052 | js-yaml@4.1.0: 3053 | dependencies: 3054 | argparse: 2.0.1 3055 | 3056 | json-buffer@3.0.1: {} 3057 | 3058 | json-schema-traverse@0.4.1: {} 3059 | 3060 | json-stable-stringify-without-jsonify@1.0.1: {} 3061 | 3062 | json5@1.0.2: 3063 | dependencies: 3064 | minimist: 1.2.8 3065 | 3066 | jsx-ast-utils@3.3.5: 3067 | dependencies: 3068 | array-includes: 3.1.8 3069 | array.prototype.flat: 1.3.3 3070 | object.assign: 4.1.7 3071 | object.values: 1.2.1 3072 | 3073 | keyv@4.5.4: 3074 | dependencies: 3075 | json-buffer: 3.0.1 3076 | 3077 | language-subtag-registry@0.3.23: {} 3078 | 3079 | language-tags@1.0.9: 3080 | dependencies: 3081 | language-subtag-registry: 0.3.23 3082 | 3083 | levn@0.4.1: 3084 | dependencies: 3085 | prelude-ls: 1.2.1 3086 | type-check: 0.4.0 3087 | 3088 | locate-path@6.0.0: 3089 | dependencies: 3090 | p-locate: 5.0.0 3091 | 3092 | lodash.merge@4.6.2: {} 3093 | 3094 | loose-envify@1.4.0: 3095 | dependencies: 3096 | js-tokens: 4.0.0 3097 | 3098 | math-intrinsics@1.1.0: {} 3099 | 3100 | media-typer@1.1.0: {} 3101 | 3102 | merge-descriptors@2.0.0: {} 3103 | 3104 | merge2@1.4.1: {} 3105 | 3106 | micromatch@4.0.8: 3107 | dependencies: 3108 | braces: 3.0.3 3109 | picomatch: 2.3.1 3110 | 3111 | mime-db@1.54.0: {} 3112 | 3113 | mime-types@3.0.1: 3114 | dependencies: 3115 | mime-db: 1.54.0 3116 | 3117 | minimatch@3.1.2: 3118 | dependencies: 3119 | brace-expansion: 1.1.11 3120 | 3121 | minimatch@9.0.5: 3122 | dependencies: 3123 | brace-expansion: 2.0.1 3124 | 3125 | minimist@1.2.8: {} 3126 | 3127 | ms@2.1.3: {} 3128 | 3129 | nanoid@3.3.11: {} 3130 | 3131 | napi-postinstall@0.2.4: {} 3132 | 3133 | natural-compare@1.4.0: {} 3134 | 3135 | negotiator@1.0.0: {} 3136 | 3137 | next@15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3138 | dependencies: 3139 | '@next/env': 15.3.2 3140 | '@swc/counter': 0.1.3 3141 | '@swc/helpers': 0.5.15 3142 | busboy: 1.6.0 3143 | caniuse-lite: 1.0.30001718 3144 | postcss: 8.4.31 3145 | react: 19.1.0 3146 | react-dom: 19.1.0(react@19.1.0) 3147 | styled-jsx: 5.1.6(react@19.1.0) 3148 | optionalDependencies: 3149 | '@next/swc-darwin-arm64': 15.3.2 3150 | '@next/swc-darwin-x64': 15.3.2 3151 | '@next/swc-linux-arm64-gnu': 15.3.2 3152 | '@next/swc-linux-arm64-musl': 15.3.2 3153 | '@next/swc-linux-x64-gnu': 15.3.2 3154 | '@next/swc-linux-x64-musl': 15.3.2 3155 | '@next/swc-win32-arm64-msvc': 15.3.2 3156 | '@next/swc-win32-x64-msvc': 15.3.2 3157 | sharp: 0.34.1 3158 | transitivePeerDependencies: 3159 | - '@babel/core' 3160 | - babel-plugin-macros 3161 | 3162 | object-assign@4.1.1: {} 3163 | 3164 | object-inspect@1.13.4: {} 3165 | 3166 | object-keys@1.1.1: {} 3167 | 3168 | object.assign@4.1.7: 3169 | dependencies: 3170 | call-bind: 1.0.8 3171 | call-bound: 1.0.4 3172 | define-properties: 1.2.1 3173 | es-object-atoms: 1.1.1 3174 | has-symbols: 1.1.0 3175 | object-keys: 1.1.1 3176 | 3177 | object.entries@1.1.9: 3178 | dependencies: 3179 | call-bind: 1.0.8 3180 | call-bound: 1.0.4 3181 | define-properties: 1.2.1 3182 | es-object-atoms: 1.1.1 3183 | 3184 | object.fromentries@2.0.8: 3185 | dependencies: 3186 | call-bind: 1.0.8 3187 | define-properties: 1.2.1 3188 | es-abstract: 1.23.9 3189 | es-object-atoms: 1.1.1 3190 | 3191 | object.groupby@1.0.3: 3192 | dependencies: 3193 | call-bind: 1.0.8 3194 | define-properties: 1.2.1 3195 | es-abstract: 1.23.9 3196 | 3197 | object.values@1.2.1: 3198 | dependencies: 3199 | call-bind: 1.0.8 3200 | call-bound: 1.0.4 3201 | define-properties: 1.2.1 3202 | es-object-atoms: 1.1.1 3203 | 3204 | on-finished@2.4.1: 3205 | dependencies: 3206 | ee-first: 1.1.1 3207 | 3208 | once@1.4.0: 3209 | dependencies: 3210 | wrappy: 1.0.2 3211 | 3212 | optionator@0.9.4: 3213 | dependencies: 3214 | deep-is: 0.1.4 3215 | fast-levenshtein: 2.0.6 3216 | levn: 0.4.1 3217 | prelude-ls: 1.2.1 3218 | type-check: 0.4.0 3219 | word-wrap: 1.2.5 3220 | 3221 | own-keys@1.0.1: 3222 | dependencies: 3223 | get-intrinsic: 1.3.0 3224 | object-keys: 1.1.1 3225 | safe-push-apply: 1.0.0 3226 | 3227 | p-limit@3.1.0: 3228 | dependencies: 3229 | yocto-queue: 0.1.0 3230 | 3231 | p-locate@5.0.0: 3232 | dependencies: 3233 | p-limit: 3.1.0 3234 | 3235 | parent-module@1.0.1: 3236 | dependencies: 3237 | callsites: 3.1.0 3238 | 3239 | parseurl@1.3.3: {} 3240 | 3241 | path-exists@4.0.0: {} 3242 | 3243 | path-key@3.1.1: {} 3244 | 3245 | path-parse@1.0.7: {} 3246 | 3247 | path-to-regexp@8.2.0: {} 3248 | 3249 | picocolors@1.1.1: {} 3250 | 3251 | picomatch@2.3.1: {} 3252 | 3253 | picomatch@4.0.2: {} 3254 | 3255 | pkce-challenge@5.0.0: {} 3256 | 3257 | possible-typed-array-names@1.1.0: {} 3258 | 3259 | postcss@8.4.31: 3260 | dependencies: 3261 | nanoid: 3.3.11 3262 | picocolors: 1.1.1 3263 | source-map-js: 1.2.1 3264 | 3265 | prelude-ls@1.2.1: {} 3266 | 3267 | prop-types@15.8.1: 3268 | dependencies: 3269 | loose-envify: 1.4.0 3270 | object-assign: 4.1.1 3271 | react-is: 16.13.1 3272 | 3273 | proxy-addr@2.0.7: 3274 | dependencies: 3275 | forwarded: 0.2.0 3276 | ipaddr.js: 1.9.1 3277 | 3278 | punycode@2.3.1: {} 3279 | 3280 | qs@6.14.0: 3281 | dependencies: 3282 | side-channel: 1.1.0 3283 | 3284 | queue-microtask@1.2.3: {} 3285 | 3286 | range-parser@1.2.1: {} 3287 | 3288 | raw-body@3.0.0: 3289 | dependencies: 3290 | bytes: 3.1.2 3291 | http-errors: 2.0.0 3292 | iconv-lite: 0.6.3 3293 | unpipe: 1.0.0 3294 | 3295 | react-dom@19.1.0(react@19.1.0): 3296 | dependencies: 3297 | react: 19.1.0 3298 | scheduler: 0.26.0 3299 | 3300 | react-is@16.13.1: {} 3301 | 3302 | react@19.1.0: {} 3303 | 3304 | reflect.getprototypeof@1.0.10: 3305 | dependencies: 3306 | call-bind: 1.0.8 3307 | define-properties: 1.2.1 3308 | es-abstract: 1.23.9 3309 | es-errors: 1.3.0 3310 | es-object-atoms: 1.1.1 3311 | get-intrinsic: 1.3.0 3312 | get-proto: 1.0.1 3313 | which-builtin-type: 1.2.1 3314 | 3315 | regexp.prototype.flags@1.5.4: 3316 | dependencies: 3317 | call-bind: 1.0.8 3318 | define-properties: 1.2.1 3319 | es-errors: 1.3.0 3320 | get-proto: 1.0.1 3321 | gopd: 1.2.0 3322 | set-function-name: 2.0.2 3323 | 3324 | resolve-from@4.0.0: {} 3325 | 3326 | resolve-pkg-maps@1.0.0: {} 3327 | 3328 | resolve@1.22.10: 3329 | dependencies: 3330 | is-core-module: 2.16.1 3331 | path-parse: 1.0.7 3332 | supports-preserve-symlinks-flag: 1.0.0 3333 | 3334 | resolve@2.0.0-next.5: 3335 | dependencies: 3336 | is-core-module: 2.16.1 3337 | path-parse: 1.0.7 3338 | supports-preserve-symlinks-flag: 1.0.0 3339 | 3340 | reusify@1.1.0: {} 3341 | 3342 | router@2.2.0: 3343 | dependencies: 3344 | debug: 4.4.0 3345 | depd: 2.0.0 3346 | is-promise: 4.0.0 3347 | parseurl: 1.3.3 3348 | path-to-regexp: 8.2.0 3349 | transitivePeerDependencies: 3350 | - supports-color 3351 | 3352 | run-parallel@1.2.0: 3353 | dependencies: 3354 | queue-microtask: 1.2.3 3355 | 3356 | safe-array-concat@1.1.3: 3357 | dependencies: 3358 | call-bind: 1.0.8 3359 | call-bound: 1.0.4 3360 | get-intrinsic: 1.3.0 3361 | has-symbols: 1.1.0 3362 | isarray: 2.0.5 3363 | 3364 | safe-buffer@5.2.1: {} 3365 | 3366 | safe-push-apply@1.0.0: 3367 | dependencies: 3368 | es-errors: 1.3.0 3369 | isarray: 2.0.5 3370 | 3371 | safe-regex-test@1.1.0: 3372 | dependencies: 3373 | call-bound: 1.0.4 3374 | es-errors: 1.3.0 3375 | is-regex: 1.2.1 3376 | 3377 | safer-buffer@2.1.2: {} 3378 | 3379 | scheduler@0.26.0: {} 3380 | 3381 | semver@6.3.1: {} 3382 | 3383 | semver@7.7.2: {} 3384 | 3385 | send@1.2.0: 3386 | dependencies: 3387 | debug: 4.4.0 3388 | encodeurl: 2.0.0 3389 | escape-html: 1.0.3 3390 | etag: 1.8.1 3391 | fresh: 2.0.0 3392 | http-errors: 2.0.0 3393 | mime-types: 3.0.1 3394 | ms: 2.1.3 3395 | on-finished: 2.4.1 3396 | range-parser: 1.2.1 3397 | statuses: 2.0.1 3398 | transitivePeerDependencies: 3399 | - supports-color 3400 | 3401 | serve-static@2.2.0: 3402 | dependencies: 3403 | encodeurl: 2.0.0 3404 | escape-html: 1.0.3 3405 | parseurl: 1.3.3 3406 | send: 1.2.0 3407 | transitivePeerDependencies: 3408 | - supports-color 3409 | 3410 | set-function-length@1.2.2: 3411 | dependencies: 3412 | define-data-property: 1.1.4 3413 | es-errors: 1.3.0 3414 | function-bind: 1.1.2 3415 | get-intrinsic: 1.3.0 3416 | gopd: 1.2.0 3417 | has-property-descriptors: 1.0.2 3418 | 3419 | set-function-name@2.0.2: 3420 | dependencies: 3421 | define-data-property: 1.1.4 3422 | es-errors: 1.3.0 3423 | functions-have-names: 1.2.3 3424 | has-property-descriptors: 1.0.2 3425 | 3426 | set-proto@1.0.0: 3427 | dependencies: 3428 | dunder-proto: 1.0.1 3429 | es-errors: 1.3.0 3430 | es-object-atoms: 1.1.1 3431 | 3432 | setprototypeof@1.2.0: {} 3433 | 3434 | sharp@0.34.1: 3435 | dependencies: 3436 | color: 4.2.3 3437 | detect-libc: 2.0.4 3438 | semver: 7.7.2 3439 | optionalDependencies: 3440 | '@img/sharp-darwin-arm64': 0.34.1 3441 | '@img/sharp-darwin-x64': 0.34.1 3442 | '@img/sharp-libvips-darwin-arm64': 1.1.0 3443 | '@img/sharp-libvips-darwin-x64': 1.1.0 3444 | '@img/sharp-libvips-linux-arm': 1.1.0 3445 | '@img/sharp-libvips-linux-arm64': 1.1.0 3446 | '@img/sharp-libvips-linux-ppc64': 1.1.0 3447 | '@img/sharp-libvips-linux-s390x': 1.1.0 3448 | '@img/sharp-libvips-linux-x64': 1.1.0 3449 | '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 3450 | '@img/sharp-libvips-linuxmusl-x64': 1.1.0 3451 | '@img/sharp-linux-arm': 0.34.1 3452 | '@img/sharp-linux-arm64': 0.34.1 3453 | '@img/sharp-linux-s390x': 0.34.1 3454 | '@img/sharp-linux-x64': 0.34.1 3455 | '@img/sharp-linuxmusl-arm64': 0.34.1 3456 | '@img/sharp-linuxmusl-x64': 0.34.1 3457 | '@img/sharp-wasm32': 0.34.1 3458 | '@img/sharp-win32-ia32': 0.34.1 3459 | '@img/sharp-win32-x64': 0.34.1 3460 | optional: true 3461 | 3462 | shebang-command@2.0.0: 3463 | dependencies: 3464 | shebang-regex: 3.0.0 3465 | 3466 | shebang-regex@3.0.0: {} 3467 | 3468 | side-channel-list@1.0.0: 3469 | dependencies: 3470 | es-errors: 1.3.0 3471 | object-inspect: 1.13.4 3472 | 3473 | side-channel-map@1.0.1: 3474 | dependencies: 3475 | call-bound: 1.0.4 3476 | es-errors: 1.3.0 3477 | get-intrinsic: 1.3.0 3478 | object-inspect: 1.13.4 3479 | 3480 | side-channel-weakmap@1.0.2: 3481 | dependencies: 3482 | call-bound: 1.0.4 3483 | es-errors: 1.3.0 3484 | get-intrinsic: 1.3.0 3485 | object-inspect: 1.13.4 3486 | side-channel-map: 1.0.1 3487 | 3488 | side-channel@1.1.0: 3489 | dependencies: 3490 | es-errors: 1.3.0 3491 | object-inspect: 1.13.4 3492 | side-channel-list: 1.0.0 3493 | side-channel-map: 1.0.1 3494 | side-channel-weakmap: 1.0.2 3495 | 3496 | simple-swizzle@0.2.2: 3497 | dependencies: 3498 | is-arrayish: 0.3.2 3499 | optional: true 3500 | 3501 | source-map-js@1.2.1: {} 3502 | 3503 | stable-hash@0.0.5: {} 3504 | 3505 | statuses@2.0.1: {} 3506 | 3507 | streamsearch@1.1.0: {} 3508 | 3509 | string.prototype.includes@2.0.1: 3510 | dependencies: 3511 | call-bind: 1.0.8 3512 | define-properties: 1.2.1 3513 | es-abstract: 1.23.9 3514 | 3515 | string.prototype.matchall@4.0.12: 3516 | dependencies: 3517 | call-bind: 1.0.8 3518 | call-bound: 1.0.4 3519 | define-properties: 1.2.1 3520 | es-abstract: 1.23.9 3521 | es-errors: 1.3.0 3522 | es-object-atoms: 1.1.1 3523 | get-intrinsic: 1.3.0 3524 | gopd: 1.2.0 3525 | has-symbols: 1.1.0 3526 | internal-slot: 1.1.0 3527 | regexp.prototype.flags: 1.5.4 3528 | set-function-name: 2.0.2 3529 | side-channel: 1.1.0 3530 | 3531 | string.prototype.repeat@1.0.0: 3532 | dependencies: 3533 | define-properties: 1.2.1 3534 | es-abstract: 1.23.9 3535 | 3536 | string.prototype.trim@1.2.10: 3537 | dependencies: 3538 | call-bind: 1.0.8 3539 | call-bound: 1.0.4 3540 | define-data-property: 1.1.4 3541 | define-properties: 1.2.1 3542 | es-abstract: 1.23.9 3543 | es-object-atoms: 1.1.1 3544 | has-property-descriptors: 1.0.2 3545 | 3546 | string.prototype.trimend@1.0.9: 3547 | dependencies: 3548 | call-bind: 1.0.8 3549 | call-bound: 1.0.4 3550 | define-properties: 1.2.1 3551 | es-object-atoms: 1.1.1 3552 | 3553 | string.prototype.trimstart@1.0.8: 3554 | dependencies: 3555 | call-bind: 1.0.8 3556 | define-properties: 1.2.1 3557 | es-object-atoms: 1.1.1 3558 | 3559 | strip-bom@3.0.0: {} 3560 | 3561 | strip-json-comments@3.1.1: {} 3562 | 3563 | styled-jsx@5.1.6(react@19.1.0): 3564 | dependencies: 3565 | client-only: 0.0.1 3566 | react: 19.1.0 3567 | 3568 | supports-color@7.2.0: 3569 | dependencies: 3570 | has-flag: 4.0.0 3571 | 3572 | supports-preserve-symlinks-flag@1.0.0: {} 3573 | 3574 | tinyglobby@0.2.13: 3575 | dependencies: 3576 | fdir: 6.4.4(picomatch@4.0.2) 3577 | picomatch: 4.0.2 3578 | 3579 | to-regex-range@5.0.1: 3580 | dependencies: 3581 | is-number: 7.0.0 3582 | 3583 | toidentifier@1.0.1: {} 3584 | 3585 | ts-api-utils@2.1.0(typescript@5.8.3): 3586 | dependencies: 3587 | typescript: 5.8.3 3588 | 3589 | tsconfig-paths@3.15.0: 3590 | dependencies: 3591 | '@types/json5': 0.0.29 3592 | json5: 1.0.2 3593 | minimist: 1.2.8 3594 | strip-bom: 3.0.0 3595 | 3596 | tslib@2.8.1: {} 3597 | 3598 | type-check@0.4.0: 3599 | dependencies: 3600 | prelude-ls: 1.2.1 3601 | 3602 | type-is@2.0.1: 3603 | dependencies: 3604 | content-type: 1.0.5 3605 | media-typer: 1.1.0 3606 | mime-types: 3.0.1 3607 | 3608 | typed-array-buffer@1.0.3: 3609 | dependencies: 3610 | call-bound: 1.0.4 3611 | es-errors: 1.3.0 3612 | is-typed-array: 1.1.15 3613 | 3614 | typed-array-byte-length@1.0.3: 3615 | dependencies: 3616 | call-bind: 1.0.8 3617 | for-each: 0.3.5 3618 | gopd: 1.2.0 3619 | has-proto: 1.2.0 3620 | is-typed-array: 1.1.15 3621 | 3622 | typed-array-byte-offset@1.0.4: 3623 | dependencies: 3624 | available-typed-arrays: 1.0.7 3625 | call-bind: 1.0.8 3626 | for-each: 0.3.5 3627 | gopd: 1.2.0 3628 | has-proto: 1.2.0 3629 | is-typed-array: 1.1.15 3630 | reflect.getprototypeof: 1.0.10 3631 | 3632 | typed-array-length@1.0.7: 3633 | dependencies: 3634 | call-bind: 1.0.8 3635 | for-each: 0.3.5 3636 | gopd: 1.2.0 3637 | is-typed-array: 1.1.15 3638 | possible-typed-array-names: 1.1.0 3639 | reflect.getprototypeof: 1.0.10 3640 | 3641 | typescript@5.8.3: {} 3642 | 3643 | unbox-primitive@1.1.0: 3644 | dependencies: 3645 | call-bound: 1.0.4 3646 | has-bigints: 1.1.0 3647 | has-symbols: 1.1.0 3648 | which-boxed-primitive: 1.1.1 3649 | 3650 | undici-types@6.21.0: {} 3651 | 3652 | unpipe@1.0.0: {} 3653 | 3654 | unrs-resolver@1.7.2: 3655 | dependencies: 3656 | napi-postinstall: 0.2.4 3657 | optionalDependencies: 3658 | '@unrs/resolver-binding-darwin-arm64': 1.7.2 3659 | '@unrs/resolver-binding-darwin-x64': 1.7.2 3660 | '@unrs/resolver-binding-freebsd-x64': 1.7.2 3661 | '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 3662 | '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 3663 | '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 3664 | '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 3665 | '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 3666 | '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 3667 | '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 3668 | '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 3669 | '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 3670 | '@unrs/resolver-binding-linux-x64-musl': 1.7.2 3671 | '@unrs/resolver-binding-wasm32-wasi': 1.7.2 3672 | '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 3673 | '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 3674 | '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 3675 | 3676 | uri-js@4.4.1: 3677 | dependencies: 3678 | punycode: 2.3.1 3679 | 3680 | vary@1.1.2: {} 3681 | 3682 | which-boxed-primitive@1.1.1: 3683 | dependencies: 3684 | is-bigint: 1.1.0 3685 | is-boolean-object: 1.2.2 3686 | is-number-object: 1.1.1 3687 | is-string: 1.1.1 3688 | is-symbol: 1.1.1 3689 | 3690 | which-builtin-type@1.2.1: 3691 | dependencies: 3692 | call-bound: 1.0.4 3693 | function.prototype.name: 1.1.8 3694 | has-tostringtag: 1.0.2 3695 | is-async-function: 2.1.1 3696 | is-date-object: 1.1.0 3697 | is-finalizationregistry: 1.1.1 3698 | is-generator-function: 1.1.0 3699 | is-regex: 1.2.1 3700 | is-weakref: 1.1.1 3701 | isarray: 2.0.5 3702 | which-boxed-primitive: 1.1.1 3703 | which-collection: 1.0.2 3704 | which-typed-array: 1.1.19 3705 | 3706 | which-collection@1.0.2: 3707 | dependencies: 3708 | is-map: 2.0.3 3709 | is-set: 2.0.3 3710 | is-weakmap: 2.0.2 3711 | is-weakset: 2.0.4 3712 | 3713 | which-typed-array@1.1.19: 3714 | dependencies: 3715 | available-typed-arrays: 1.0.7 3716 | call-bind: 1.0.8 3717 | call-bound: 1.0.4 3718 | for-each: 0.3.5 3719 | get-proto: 1.0.1 3720 | gopd: 1.2.0 3721 | has-tostringtag: 1.0.2 3722 | 3723 | which@2.0.2: 3724 | dependencies: 3725 | isexe: 2.0.0 3726 | 3727 | word-wrap@1.2.5: {} 3728 | 3729 | wrappy@1.0.2: {} 3730 | 3731 | yocto-queue@0.1.0: {} 3732 | 3733 | zod-to-json-schema@3.24.5(zod@3.24.4): 3734 | dependencies: 3735 | zod: 3.24.4 3736 | 3737 | zod@3.24.4: {} 3738 | -------------------------------------------------------------------------------- /next-app-mock/src/ClientSideScrollRestorer.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import {ScrollRestorer} from "../../dist" 3 | 4 | const ClientSideScrollRestorer = () => { 5 | return 6 | } 7 | export default ClientSideScrollRestorer 8 | -------------------------------------------------------------------------------- /next-app-mock/src/app/globals.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --max-width: 1100px; 3 | --border-radius: 12px; 4 | --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 5 | 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 6 | 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; 7 | 8 | --foreground-rgb: 0, 0, 0; 9 | --background-start-rgb: 214, 219, 220; 10 | --background-end-rgb: 255, 255, 255; 11 | 12 | --primary-glow: conic-gradient( 13 | from 180deg at 50% 50%, 14 | #16abff33 0deg, 15 | #0885ff33 55deg, 16 | #54d6ff33 120deg, 17 | #0071ff33 160deg, 18 | transparent 360deg 19 | ); 20 | --secondary-glow: radial-gradient( 21 | rgba(255, 255, 255, 1), 22 | rgba(255, 255, 255, 0) 23 | ); 24 | 25 | --tile-start-rgb: 239, 245, 249; 26 | --tile-end-rgb: 228, 232, 233; 27 | --tile-border: conic-gradient( 28 | #00000080, 29 | #00000040, 30 | #00000030, 31 | #00000020, 32 | #00000010, 33 | #00000010, 34 | #00000080 35 | ); 36 | 37 | --callout-rgb: 238, 240, 241; 38 | --callout-border-rgb: 172, 175, 176; 39 | --card-rgb: 180, 185, 188; 40 | --card-border-rgb: 131, 134, 135; 41 | } 42 | 43 | @media (prefers-color-scheme: dark) { 44 | :root { 45 | --foreground-rgb: 255, 255, 255; 46 | --background-start-rgb: 0, 0, 0; 47 | --background-end-rgb: 0, 0, 0; 48 | 49 | --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); 50 | --secondary-glow: linear-gradient( 51 | to bottom right, 52 | rgba(1, 65, 255, 0), 53 | rgba(1, 65, 255, 0), 54 | rgba(1, 65, 255, 0.3) 55 | ); 56 | 57 | --tile-start-rgb: 2, 13, 46; 58 | --tile-end-rgb: 2, 5, 19; 59 | --tile-border: conic-gradient( 60 | #ffffff80, 61 | #ffffff40, 62 | #ffffff30, 63 | #ffffff20, 64 | #ffffff10, 65 | #ffffff10, 66 | #ffffff80 67 | ); 68 | 69 | --callout-rgb: 20, 20, 20; 70 | --callout-border-rgb: 108, 108, 108; 71 | --card-rgb: 100, 100, 100; 72 | --card-border-rgb: 200, 200, 200; 73 | } 74 | } 75 | 76 | * { 77 | box-sizing: border-box; 78 | padding: 0; 79 | margin: 0; 80 | } 81 | 82 | html, 83 | body { 84 | max-width: 100vw; 85 | overflow-x: hidden; 86 | } 87 | 88 | body { 89 | color: rgb(var(--foreground-rgb)); 90 | background: linear-gradient( 91 | to bottom, 92 | transparent, 93 | rgb(var(--background-end-rgb)) 94 | ) 95 | rgb(var(--background-start-rgb)); 96 | } 97 | 98 | a { 99 | color: inherit; 100 | text-decoration: none; 101 | } 102 | 103 | @media (prefers-color-scheme: dark) { 104 | html { 105 | color-scheme: dark; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /next-app-mock/src/app/high-with-loading/SomeClient.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import { useEffect, useState } from "react" 3 | import { clearInterval } from "timers" 4 | 5 | const SomeClient = ()=>{ 6 | const [i,setI] = useState(0) 7 | useEffect(()=>{ 8 | const interval = setInterval(()=>{ 9 | setI(p=>p+1) 10 | },1000) 11 | return ()=>{ 12 | clearInterval(interval) 13 | } 14 | },[]) 15 | return
16 | ddd {i} 17 |
18 | 19 | } 20 | export default SomeClient -------------------------------------------------------------------------------- /next-app-mock/src/app/high-with-loading/loading.tsx: -------------------------------------------------------------------------------- 1 | 2 | import Link from 'next/link' 3 | const Loading = ()=>{ 4 | return
5 |
8 | dsfsdfds 9 |
10 | 11 | Lets-go to main 12 | 13 |
14 | } 15 | export default Loading -------------------------------------------------------------------------------- /next-app-mock/src/app/high-with-loading/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import { connection } from 'next/server' 3 | import { Suspense } from 'react' 4 | import SomeClient from './SomeClient' 5 | function delay(ms:number) { 6 | return new Promise((resolve) => { 7 | setTimeout(resolve, ms); 8 | }); 9 | } 10 | const Page = async ()=>{ 11 | await connection() 12 | await delay(1000) 13 | return
14 |
17 | dsfsdfds 18 |
19 | 20 | Lets-go to main 21 | 22 | 23 | 24 | 25 |
26 | } 27 | export default Page 28 | -------------------------------------------------------------------------------- /next-app-mock/src/app/high/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | const Page = ()=>{ 3 | return
4 |
7 | dsfsdfds 8 |
9 | 10 | Lets-go to main 11 | 12 |
13 | } 14 | export default Page 15 | -------------------------------------------------------------------------------- /next-app-mock/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import ClientSideScrollRestorer from "@/ClientSideScrollRestorer" 2 | import type {Metadata} from 'next' 3 | import {Inter} from 'next/font/google' 4 | import './globals.css' 5 | import {FunctionComponent, ReactNode, Suspense} from "react" 6 | 7 | const inter = Inter({subsets: ['latin']}) 8 | 9 | export const metadata: Metadata = { 10 | title: 'Create Next App', 11 | description: 'Generated by create next app', 12 | } 13 | const RootLayout: FunctionComponent<{ 14 | children: ReactNode 15 | }> = ({children}) => { 16 | return ( 17 | 18 | 19 | 20 | 21 | 22 | {children} 23 | 24 | 25 | ) 26 | } 27 | export default RootLayout 28 | -------------------------------------------------------------------------------- /next-app-mock/src/app/low-page/page.tsx: -------------------------------------------------------------------------------- 1 | const LowPage = ()=>{ 2 | return

3 | This is the low page 4 |

5 | } 6 | export default LowPage 7 | -------------------------------------------------------------------------------- /next-app-mock/src/app/page.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: space-between; 5 | align-items: center; 6 | padding: 6rem; 7 | min-height: 100vh; 8 | } 9 | 10 | .description { 11 | display: inherit; 12 | justify-content: inherit; 13 | align-items: inherit; 14 | font-size: 0.85rem; 15 | max-width: var(--max-width); 16 | width: 100%; 17 | z-index: 2; 18 | font-family: var(--font-mono); 19 | } 20 | 21 | .description a { 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | gap: 0.5rem; 26 | } 27 | 28 | .description p { 29 | position: relative; 30 | margin: 0; 31 | padding: 1rem; 32 | background-color: rgba(var(--callout-rgb), 0.5); 33 | border: 1px solid rgba(var(--callout-border-rgb), 0.3); 34 | border-radius: var(--border-radius); 35 | } 36 | 37 | .code { 38 | font-weight: 700; 39 | font-family: var(--font-mono); 40 | } 41 | 42 | .grid { 43 | display: grid; 44 | grid-template-columns: repeat(4, minmax(25%, auto)); 45 | max-width: 100%; 46 | width: var(--max-width); 47 | } 48 | 49 | .card { 50 | padding: 1rem 1.2rem; 51 | border-radius: var(--border-radius); 52 | background: rgba(var(--card-rgb), 0); 53 | border: 1px solid rgba(var(--card-border-rgb), 0); 54 | transition: background 200ms, border 200ms; 55 | } 56 | 57 | .card span { 58 | display: inline-block; 59 | transition: transform 200ms; 60 | } 61 | 62 | .card h2 { 63 | font-weight: 600; 64 | margin-bottom: 0.7rem; 65 | } 66 | 67 | .card p { 68 | margin: 0; 69 | opacity: 0.6; 70 | font-size: 0.9rem; 71 | line-height: 1.5; 72 | max-width: 30ch; 73 | } 74 | 75 | .center { 76 | display: flex; 77 | justify-content: center; 78 | align-items: center; 79 | position: relative; 80 | padding: 4rem 0; 81 | } 82 | 83 | .center::before { 84 | background: var(--secondary-glow); 85 | border-radius: 50%; 86 | width: 480px; 87 | height: 360px; 88 | margin-left: -400px; 89 | } 90 | 91 | .center::after { 92 | background: var(--primary-glow); 93 | width: 240px; 94 | height: 180px; 95 | z-index: -1; 96 | } 97 | 98 | .center::before, 99 | .center::after { 100 | content: ''; 101 | left: 50%; 102 | position: absolute; 103 | filter: blur(45px); 104 | transform: translateZ(0); 105 | } 106 | 107 | .logo { 108 | position: relative; 109 | } 110 | /* Enable hover only on non-touch devices */ 111 | @media (hover: hover) and (pointer: fine) { 112 | .card:hover { 113 | background: rgba(var(--card-rgb), 0.1); 114 | border: 1px solid rgba(var(--card-border-rgb), 0.15); 115 | } 116 | 117 | .card:hover span { 118 | transform: translateX(4px); 119 | } 120 | } 121 | 122 | @media (prefers-reduced-motion) { 123 | .card:hover span { 124 | transform: none; 125 | } 126 | } 127 | 128 | /* Mobile */ 129 | @media (max-width: 700px) { 130 | .content { 131 | padding: 4rem; 132 | } 133 | 134 | .grid { 135 | grid-template-columns: 1fr; 136 | margin-bottom: 120px; 137 | max-width: 320px; 138 | text-align: center; 139 | } 140 | 141 | .card { 142 | padding: 1rem 2.5rem; 143 | } 144 | 145 | .card h2 { 146 | margin-bottom: 0.5rem; 147 | } 148 | 149 | .center { 150 | padding: 8rem 0 6rem; 151 | } 152 | 153 | .center::before { 154 | transform: none; 155 | height: 300px; 156 | } 157 | 158 | .description { 159 | font-size: 0.8rem; 160 | } 161 | 162 | .description a { 163 | padding: 1rem; 164 | } 165 | 166 | .description p, 167 | .description div { 168 | display: flex; 169 | justify-content: center; 170 | position: fixed; 171 | width: 100%; 172 | } 173 | 174 | .description p { 175 | align-items: center; 176 | inset: 0 0 auto; 177 | padding: 2rem 1rem 1.4rem; 178 | border-radius: 0; 179 | border: none; 180 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); 181 | background: linear-gradient( 182 | to bottom, 183 | rgba(var(--background-start-rgb), 1), 184 | rgba(var(--callout-rgb), 0.5) 185 | ); 186 | background-clip: padding-box; 187 | backdrop-filter: blur(24px); 188 | } 189 | 190 | .description div { 191 | align-items: flex-end; 192 | pointer-events: none; 193 | inset: auto 0 0; 194 | padding: 2rem; 195 | height: 200px; 196 | background: linear-gradient( 197 | to bottom, 198 | transparent 0%, 199 | rgb(var(--background-end-rgb)) 40% 200 | ); 201 | z-index: 1; 202 | } 203 | } 204 | 205 | /* Tablet and Smaller Desktop */ 206 | @media (min-width: 701px) and (max-width: 1120px) { 207 | .grid { 208 | grid-template-columns: repeat(2, 50%); 209 | } 210 | } 211 | 212 | @media (prefers-color-scheme: dark) { 213 | .vercelLogo { 214 | filter: invert(1); 215 | } 216 | 217 | .logo { 218 | filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); 219 | } 220 | } 221 | 222 | @keyframes rotate { 223 | from { 224 | transform: rotate(360deg); 225 | } 226 | to { 227 | transform: rotate(0deg); 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /next-app-mock/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | const Page = ()=>{ 3 | return
4 |
7 | dsfsdfds 8 |
9 | 10 | Lets-go to low-page 11 | 12 | 13 | Lets-go without scroll 14 | 15 |
16 | } 17 | export default Page 18 | -------------------------------------------------------------------------------- /next-app-mock/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": { 3 | "name": "l-you", 4 | "email": "l-you@revotale.com", 5 | "url": "https://github.com/l-you" 6 | }, 7 | "version": "0.10.1", 8 | "name": "next-scroll-restorer", 9 | "main": "src/index.ts", 10 | "license": "MIT", 11 | "private": false, 12 | "sideEffects": false, 13 | "publishConfig": { 14 | "provenance": true, 15 | "access": "public", 16 | "main": "index.js", 17 | "directory": "dist", 18 | "exports": { 19 | "./package.json": "./package.json", 20 | ".": { 21 | "import": "./index.js", 22 | "require": "./index.cjs", 23 | "types": "./index.d.ts" 24 | } 25 | } 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "git+https://github.com/RevoTale/next-scroll-restorer.git" 30 | }, 31 | "type": "module", 32 | "scripts": { 33 | "build": "tsup && cp package.json README.md LICENSE dist/", 34 | "tsc": "tsc --noEmit", 35 | "changeset:version": "changeset version && git add --all", 36 | "changeset:publish": "changeset publish", 37 | "prepare": "pnpm build", 38 | "test": "pnpm lint && pnpm tsc && pnpm unit", 39 | "unit": "playwright test", 40 | "lint": "eslint .", 41 | "lint:fix": "eslint --fix ." 42 | }, 43 | "bugs": { 44 | "url": "https://github.com/RevoTale/next-scroll-restorer/issues" 45 | }, 46 | "devDependencies": { 47 | "@changesets/cli": "^2.29.4", 48 | "@playwright/test": "^1.52.0", 49 | "@swc/core": "^1.11.29", 50 | "@types/node": "^22.15.19", 51 | "@types/react": "^19.1.4", 52 | "changeset": "^0.2.6", 53 | "eslint": "^9.26.0", 54 | "eslint-config-love": "^120.0.0", 55 | "tsup": "^8.4.0", 56 | "typescript": "^5.8.3" 57 | }, 58 | "peerDependencies": { 59 | "next": "^15.0", 60 | "react": "^19.0" 61 | }, 62 | "packageManager": "pnpm@10.10.0" 63 | } 64 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from '@playwright/test' 2 | 3 | /** 4 | * Read environment variables from file. 5 | * https://github.com/motdotla/dotenv 6 | */ 7 | // require('dotenv').config(); 8 | 9 | /** 10 | * See https://playwright.dev/docs/test-configuration. 11 | */ 12 | const port = Number(process.env.PORT)||3033 13 | export default defineConfig({ 14 | webServer: { 15 | command: `pnpm -C ./next-app-mock build && pnpm -C ./next-app-mock start --port ${port}`, 16 | port: port 17 | }, 18 | use: { 19 | baseURL: `http://127.0.0.1:${port}`, 20 | trace: 'on-first-retry', 21 | }, 22 | testDir: './__tests__', 23 | /* Run tests in files in parallel */ 24 | fullyParallel: true, 25 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 26 | forbidOnly: !!process.env.CI, 27 | /* Retry on CI only */ 28 | retries: process.env.CI ? 2 : 0, 29 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 30 | reporter: [ ['html', { open: 'never' }] ], 31 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 32 | 33 | 34 | /* Configure projects for major browsers */ 35 | projects: [ 36 | { 37 | name: 'chromium', 38 | use: { ...devices['Desktop Chrome'] }, 39 | }, 40 | 41 | { 42 | name: 'firefox', 43 | use: { ...devices['Desktop Firefox'] }, 44 | }, 45 | 46 | { 47 | name: 'webkit', 48 | use: { ...devices['Desktop Safari'] }, 49 | }, 50 | ], 51 | }) 52 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | onlyBuiltDependencies: 2 | - '@swc/core' 3 | - esbuild 4 | - sharp 5 | -------------------------------------------------------------------------------- /src/ScrollRestorer.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import type { FunctionComponent } from "react" 3 | import useScrollRestorer from "./useScrollRestorer" 4 | 5 | const ScrollRestoration:FunctionComponent = () => { 6 | useScrollRestorer() 7 | return <> 8 | } 9 | export default ScrollRestoration 10 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import ScrollRestorer from "./ScrollRestorer" 2 | import useScrollRestorer from "./useScrollRestorer" 3 | export {ScrollRestorer,useScrollRestorer} 4 | -------------------------------------------------------------------------------- /src/storage.ts: -------------------------------------------------------------------------------- 1 | import { isRecord } from "./util" 2 | 3 | export type ScrollPos = [number, number] 4 | const uniq = 'revotale_nextjs_scroll_restoration' 5 | type HistoryKeys = 'x' | 'y'| 'memo_timestamp' | 'is_navigating_history' | 'popstate_timestamp' 6 | 7 | export const getKey = (pos:HistoryKeys ):string => `${uniq}_${pos}` 8 | export type HistoryState = Record | null 9 | const defaultX = 0 10 | const defaultY = 0 11 | export const setCurrentScrollHistory = ( [x, y]: ScrollPos):void => { 12 | x = Math.max(x, defaultX) 13 | y = Math.max(y, defaultY) //Sometime browsers make negative scroll 14 | const winState = window.history.state as unknown 15 | 16 | const newState: HistoryState = (isRecord(winState)?winState:null) ?? {} 17 | window.history.replaceState({ 18 | ...newState, 19 | [getKey('x')]: x, 20 | [getKey('y')]: y, 21 | [getKey('memo_timestamp')]:(new Date()).getTime() 22 | }, '') 23 | } 24 | const retrieveNum = (name: HistoryKeys,state:HistoryState):number|null => { 25 | 26 | if (state === null) { 27 | return null 28 | } 29 | const key = getKey(name) 30 | const {[key]:value} = state 31 | if (value === null) { 32 | return null 33 | } 34 | const num = Number(value) 35 | return isNaN(num) ? null : num 36 | } 37 | export const getScrollFromState = (state: HistoryState): ScrollPos | null => { 38 | 39 | 40 | const x = retrieveNum('x',state) 41 | const y = retrieveNum('y',state) 42 | return x !== null && y !== null ? [x, y] : null 43 | } 44 | export const getScrollTimestamp = (state: HistoryState):number|null=>retrieveNum('memo_timestamp',state) 45 | export const getPopstateTimestamp = (state: HistoryState):number|null=>retrieveNum('popstate_timestamp',state) 46 | export const getIsNavigatingHistory = (state: HistoryState):boolean=>state !== null?Boolean(state[getKey('is_navigating_history')]):false 47 | -------------------------------------------------------------------------------- /src/useScrollRestorer.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console -- console required for debugging. Its dropped with bundler on production. */ 2 | import {usePathname, useSearchParams} from "next/navigation" 3 | import {useEffect, useLayoutEffect, useRef,} from "react" 4 | import { 5 | getIsNavigatingHistory, getKey, getPopstateTimestamp, 6 | getScrollFromState, 7 | getScrollTimestamp, 8 | type HistoryState, 9 | type ScrollPos, 10 | setCurrentScrollHistory 11 | } from "./storage" 12 | import { isRecord } from "./util" 13 | 14 | const getWindowScroll = (): ScrollPos => [window.scrollX, window.scrollY] 15 | const memoizationIntervalLimit = 601//100 times per 30 seconds 16 | const safariBugWorkaroundTimeThreshold = 2000 //Safari reset scroll position to 0 0 after popstate for some reason. 17 | 18 | const getState = ():HistoryState => { 19 | const state = window.history.state as unknown 20 | return isRecord(state)?state:null 21 | } 22 | const restoreScrollFromState = (state: HistoryState):void => { 23 | const scroll = getScrollFromState(state) 24 | console.log(`Found scroll ${scroll?.toString()}. ${window.location.href}`) 25 | if (scroll !== null) { 26 | const [x, y] = scroll 27 | console.log(`Scroll restored to ${x} ${y}. Document height ${window.document.body.clientHeight}.`) 28 | window.scrollTo({ 29 | behavior: 'instant', 30 | left: x, 31 | top: y 32 | }) 33 | console.log(`Scroll is ${window.scrollX} ${window.scrollY} after restoring. ${window.innerHeight}`) 34 | } 35 | } 36 | const scrollMemoIntervalCountLimit = 2 37 | const restoreCurrentScrollPosition = ():void => { 38 | console.log(`Restoring current scroll position. ${window.location.href}`) 39 | restoreScrollFromState(getState()) 40 | } 41 | const defaultMemoInterval = 0 42 | const numericTrue = 1 43 | const defaultX = 0 44 | const defaultY = 0 45 | const useScrollRestorer = (): void => { 46 | const pathname = usePathname() 47 | const searchparams = useSearchParams() 48 | 49 | 50 | useLayoutEffect(() => { 51 | console.log('Restoring based on hooks.') 52 | restoreCurrentScrollPosition() 53 | }, [pathname, searchparams]) 54 | const scrollMemoTimeoutRef = useRef>(undefined) 55 | const scrollMemoCountInInterval = useRef(defaultMemoInterval)//Used to workaround instant scrollTo() calls.It's used to work around immediate scroll in tests and possible real world behaviour. 56 | const isSafariWorkaroundAllowedRef = useRef(false) 57 | useEffect(() => { 58 | window.history.scrollRestoration = 'manual' 59 | 60 | const navigationListener = ({state:eState}: PopStateEvent):void => { 61 | console.log('Popstate started.') 62 | cancelDelayedScrollMemoization() 63 | 64 | isSafariWorkaroundAllowedRef.current = true 65 | const state = (isRecord(eState)?eState:null) ?? {} 66 | window.history.replaceState({ 67 | ...state, 68 | [getKey('is_navigating_history')]: numericTrue, 69 | [getKey('popstate_timestamp')]: (new Date()).getTime() 70 | }, '') 71 | } 72 | 73 | 74 | /** 75 | * This is important to run as late as possible after navigation. 76 | * We could use something like `setTimeout(restoreCurrentScroll,500)`, but this is not a reactive approach. 77 | * useLayoutEffect + usePageHref hook is the latest reactive thing Next.js app can provide to use. 78 | * In Safari even with `window.history.scrollRestoration = 'manual'` scroll position is reset. 79 | */ 80 | const workaroundSafariBreaksScrollRestoration = ([x, y]: ScrollPos):boolean => { 81 | const state = getState() 82 | 83 | 84 | // Sometimes Safari scroll to the start because of unique behavior We restore it back. 85 | // This case cannot be tested with Playwright, or any other testing library. 86 | if ((x === defaultX && y === defaultY) && isSafariWorkaroundAllowedRef.current) { 87 | const isWorkaroundAllowed = (() => { 88 | const timeNavigated = getPopstateTimestamp(state) 89 | if (timeNavigated === null) { 90 | return false 91 | } 92 | return (((new Date()).getTime() - timeNavigated) < safariBugWorkaroundTimeThreshold) 93 | })() //Place here to prevent many computations 94 | const isNavHistory = getIsNavigatingHistory(state) 95 | console.log(`Check workaround for safari: ${x} ${y} ${isWorkaroundAllowed}. Is popstate ${isNavHistory}. ${window.location.href}`) 96 | if (isWorkaroundAllowed && isNavHistory) { 97 | console.log(`Reverting back scroll because browser tried to brake it..`) 98 | restoreCurrentScrollPosition() 99 | isSafariWorkaroundAllowedRef.current = false //Safari bug appears only once 100 | return true 101 | } 102 | } 103 | 104 | return false 105 | } 106 | const rememberScrollPosition = (pos: ScrollPos):void => { 107 | // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- it's stale index 108 | console.log(`Remember history scroll to ${pos[0]} ${pos[1]}. Href ${window.location.href}.`) 109 | cancelDelayedScrollMemoization() 110 | setCurrentScrollHistory(pos) 111 | } 112 | const unmountNavigationListener = () :void=> { 113 | console.log('Unmount popstate.') 114 | 115 | window.removeEventListener('popstate', navigationListener) 116 | } 117 | const mountNavigationListener = ():void => { 118 | console.log('Mount popstate.') 119 | 120 | window.addEventListener('popstate', navigationListener, { 121 | passive: true 122 | }) 123 | } 124 | 125 | const cancelDelayedScrollMemoization = ():void => { 126 | if (scrollMemoTimeoutRef.current !== undefined) { 127 | console.log(`Cancelled delayed memoization.`) 128 | clearTimeout(scrollMemoTimeoutRef.current) 129 | scrollMemoTimeoutRef.current = undefined 130 | } 131 | 132 | } 133 | 134 | const scrollMemoizationHandler = (pos: ScrollPos):void => { 135 | const isScrollMemoAllowedNow = ():boolean => { 136 | const timestamp = getScrollTimestamp(getState()) 137 | if (timestamp === null) { 138 | return true 139 | } 140 | return (new Date()).getTime() - timestamp > memoizationIntervalLimit 141 | } 142 | 143 | const isAllowedNow = isScrollMemoAllowedNow() 144 | console.log(`Handle scroll event. Memo allowed: ${isAllowedNow}.`) 145 | if (isAllowedNow) { 146 | scrollMemoCountInInterval.current = defaultMemoInterval 147 | } 148 | if (isAllowedNow || scrollMemoCountInInterval.current < scrollMemoIntervalCountLimit) { 149 | scrollMemoCountInInterval.current++ 150 | rememberScrollPosition(pos) 151 | } else { 152 | console.log(`Scroll memoization is not allowed. ${window.location.href}`) 153 | if (scrollMemoTimeoutRef.current === undefined) { 154 | // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- it's just a fixed index 155 | console.log(`Set delayed memoization ${pos[0]} ${pos[1]}`) 156 | scrollMemoTimeoutRef.current = setTimeout(() => { 157 | rememberScrollPosition(pos) 158 | scrollMemoCountInInterval.current = defaultMemoInterval 159 | scrollMemoTimeoutRef.current = undefined 160 | }, memoizationIntervalLimit) 161 | } 162 | 163 | } 164 | } 165 | const scrollListener = ():void => { 166 | cancelDelayedScrollMemoization() 167 | const scroll = getWindowScroll() 168 | 169 | console.log(`Scroll event ${scroll.toString()}. ${window.location.href}`) 170 | workaroundSafariBreaksScrollRestoration(scroll) 171 | 172 | scrollMemoizationHandler(scroll) 173 | 174 | 175 | } 176 | const mountScrollListener = () :void=> { 177 | console.log('Scroll listener mounted.') 178 | window.addEventListener('scroll', scrollListener, { 179 | passive: true 180 | }) 181 | } 182 | const unmountScrollListener = ():void => { 183 | console.log('Scroll listener unmounted.') 184 | window.removeEventListener('scroll', scrollListener) 185 | 186 | } 187 | mountNavigationListener() 188 | mountScrollListener() 189 | return () => { 190 | unmountNavigationListener() 191 | unmountScrollListener() 192 | cancelDelayedScrollMemoization() 193 | } 194 | }, []) 195 | } 196 | export default useScrollRestorer 197 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | function isRecord(value: unknown): value is Record { 2 | return ( 3 | typeof value === 'object' && 4 | value !== null && 5 | !Array.isArray(value) 6 | ); 7 | } 8 | export {isRecord} -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "esnext", 4 | "jsx": "react-jsx", 5 | "target": "ESNext", 6 | "lib": ["es6", "es7", "esnext", "dom"], 7 | "moduleResolution": "node", 8 | "noImplicitReturns": true, 9 | "strict": true, 10 | "strictFunctionTypes": true, 11 | "noUnusedLocals": true, 12 | "pretty": true, 13 | "allowSyntheticDefaultImports": true, 14 | "esModuleInterop": true, 15 | "downlevelIteration": true, 16 | "skipLibCheck": true, 17 | "listEmittedFiles": true, 18 | "allowJs": false, 19 | "declaration": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "noImplicitAny": true, 22 | "alwaysStrict": true, 23 | "noImplicitThis": true, 24 | "noUnusedParameters": true, 25 | "noFallthroughCasesInSwitch": true, 26 | "resolveJsonModule": true, 27 | "isolatedModules": true, 28 | "outDir": "dist", 29 | "noEmit": false, 30 | "emitDeclarationOnly": false, 31 | }, 32 | "include": ["./","./__tests__/**.spec.ts"], 33 | "exclude": ["next-app-mock/next.config.js"] 34 | } 35 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "esnext", 4 | "jsx": "react-jsx", 5 | "target": "ESNext", 6 | "lib": ["es6", "es7", "esnext", "dom"], 7 | "moduleResolution": "node", 8 | "noImplicitReturns": true, 9 | "strict": true, 10 | "strictFunctionTypes": true, 11 | "noUnusedLocals": true, 12 | "pretty": true, 13 | "allowSyntheticDefaultImports": true, 14 | "esModuleInterop": true, 15 | "downlevelIteration": true, 16 | "skipLibCheck": true, 17 | "listEmittedFiles": true, 18 | "allowJs": false, 19 | "declaration": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "noImplicitAny": true, 22 | "alwaysStrict": true, 23 | "noImplicitThis": true, 24 | "noUnusedParameters": true, 25 | "noFallthroughCasesInSwitch": true, 26 | "resolveJsonModule": true, 27 | "isolatedModules": true, 28 | "outDir": "dist", 29 | "noEmit": false, 30 | "emitDeclarationOnly": false, 31 | }, 32 | "include": ["src"] 33 | } 34 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup' 2 | 3 | export default defineConfig({ 4 | entry: ['src/**/*'], 5 | sourcemap: true, 6 | clean: true, 7 | format: ['cjs', 'esm'], 8 | dts: true, 9 | bundle: false, 10 | pure:"console.log" 11 | }) --------------------------------------------------------------------------------