├── .github
├── ISSUE_TEMPLATE
│ └── BUG-REPORT.yml
├── dependabot.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── biome.json
├── package-lock.json
├── package.json
├── src
├── HolyProgress.ts
├── __tests__
│ ├── hasSameQueryParameters.test.ts
│ ├── isSameHost.test.ts
│ ├── isSamePageAnchor.test.ts
│ └── toAbsoluteURL.test.ts
├── constants.ts
├── index.tsx
└── utils.ts
├── tsconfig.json
├── tsup.config.ts
└── vitest.config.ts
/.github/ISSUE_TEMPLATE/BUG-REPORT.yml:
--------------------------------------------------------------------------------
1 | name: 'Bug Report'
2 | description: Create a new ticket for a bug.
3 | title: 'bug:
'
4 | labels: ['kind/bug', 'bug/0-unknown']
5 | body:
6 | - type: textarea
7 | id: description
8 | attributes:
9 | label: 'Description'
10 | description: Please enter an explicit description of your issue
11 | placeholder: Short and explicit description of your incident...
12 | validations:
13 | required: true
14 | - type: textarea
15 | id: reprod
16 | attributes:
17 | label: 'Reproduction steps'
18 | description: Please enter an explicit description of your issue
19 | value: |
20 | 1. Go to '...'
21 | 2. Click on '....'
22 | 3. Scroll down to '....'
23 | 4. See error
24 | render: bash
25 | validations:
26 | required: true
27 | - type: textarea
28 | id: screenshot
29 | attributes:
30 | label: 'Screenshots'
31 | description: If applicable, add screenshots to help explain your problem.
32 | value: |
33 | 
34 | render: bash
35 | validations:
36 | required: false
37 | - type: textarea
38 | id: logs
39 | attributes:
40 | label: 'Logs'
41 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
42 | render: bash
43 | validations:
44 | required: false
45 | - type: dropdown
46 | id: browsers
47 | attributes:
48 | label: 'Browsers'
49 | description: What browsers are you seeing the problem on ?
50 | multiple: true
51 | options:
52 | - Firefox
53 | - Chrome
54 | - Safari
55 | - Microsoft Edge
56 | - Opera
57 | validations:
58 | required: true
59 | - type: dropdown
60 | id: os
61 | attributes:
62 | label: 'OS'
63 | description: What is the impacted environment ?
64 | multiple: true
65 | options:
66 | - Windows
67 | - Linux
68 | - Mac
69 | validations:
70 | required: false
71 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "npm"
4 | directory: "/"
5 | schedule:
6 | interval: "weekly"
7 | commit-message:
8 | prefix: "chore(deps/npm):"
9 | target-branch: "development"
10 | labels:
11 | - "dependencies"
12 | - "pkg-npm"
13 | - package-ecosystem: "github-actions"
14 | directory: "/"
15 | schedule:
16 | interval: "weekly"
17 | commit-message:
18 | prefix: "chore(deps/actions):"
19 | labels:
20 | - "dependencies"
21 | - "pkg-gh-actions"
22 | target-branch: "development"
23 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: Node.js CI
2 |
3 | on:
4 | push:
5 | branches: [main, dev]
6 | pull_request_target:
7 | branches: [main, dev]
8 | workflow_dispatch:
9 |
10 | jobs:
11 | unit:
12 | name: Vitest Unit Tests
13 | runs-on: ubuntu-latest
14 | timeout-minutes: 5
15 |
16 | strategy:
17 | matrix:
18 | node-version: [18, 20]
19 |
20 | steps:
21 | - uses: actions/checkout@v4
22 | - name: Use Node.js ${{ matrix.node-version }}
23 | uses: actions/setup-node@v4
24 | with:
25 | node-version: ${{ matrix.node-version }}
26 | cache: "npm"
27 | - name: Install all dependencies
28 | run: npm ci
29 | - name: Run Vitest Unit Tests
30 | run: npm run test
31 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Build
2 | dist/
3 |
4 | # Mac
5 | .DS_Store
6 |
7 | # Logs
8 | logs
9 | *.log
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 | lerna-debug.log*
14 | .pnpm-debug.log*
15 |
16 | # Diagnostic reports (https://nodejs.org/api/report.html)
17 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
18 |
19 | # Runtime data
20 | pids
21 | *.pid
22 | *.seed
23 | *.pid.lock
24 |
25 | # Directory for instrumented libs generated by jscoverage/JSCover
26 | lib-cov
27 |
28 | # Coverage directory used by tools like istanbul
29 | coverage
30 | *.lcov
31 |
32 | # nyc test coverage
33 | .nyc_output
34 |
35 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
36 | .grunt
37 |
38 | # Bower dependency directory (https://bower.io/)
39 | bower_components
40 |
41 | # node-waf configuration
42 | .lock-wscript
43 |
44 | # Compiled binary addons (https://nodejs.org/api/addons.html)
45 | build/Release
46 |
47 | # Dependency directories
48 | node_modules/
49 | jspm_packages/
50 |
51 | # Snowpack dependency directory (https://snowpack.dev/)
52 | web_modules/
53 |
54 | # TypeScript cache
55 | *.tsbuildinfo
56 |
57 | # Optional npm cache directory
58 | .npm
59 |
60 | # Optional eslint cache
61 | .eslintcache
62 |
63 | # Optional stylelint cache
64 | .stylelintcache
65 |
66 | # Microbundle cache
67 | .rpt2_cache/
68 | .rts2_cache_cjs/
69 | .rts2_cache_es/
70 | .rts2_cache_umd/
71 |
72 | # Optional REPL history
73 | .node_repl_history
74 |
75 | # Output of 'npm pack'
76 | *.tgz
77 |
78 | # Yarn Integrity file
79 | .yarn-integrity
80 |
81 | # dotenv environment variable files
82 | .env
83 | .env.development.local
84 | .env.test.local
85 | .env.production.local
86 | .env.local
87 |
88 | # parcel-bundler cache (https://parceljs.org/)
89 | .cache
90 | .parcel-cache
91 |
92 | # Next.js build output
93 | .next
94 | out
95 |
96 | # Nuxt.js build / generate output
97 | .nuxt
98 | dist
99 |
100 | # Gatsby files
101 | .cache/
102 | # Comment in the public line in if your project uses Gatsby and not Next.js
103 | # https://nextjs.org/blog/next-9-1#public-directory-support
104 | # public
105 |
106 | # vuepress build output
107 | .vuepress/dist
108 |
109 | # vuepress v2.x temp and cache directory
110 | .temp
111 | .cache
112 |
113 | # Docusaurus cache and generated files
114 | .docusaurus
115 |
116 | # Serverless directories
117 | .serverless/
118 |
119 | # FuseBox cache
120 | .fusebox/
121 |
122 | # DynamoDB Local files
123 | .dynamodb/
124 |
125 | # TernJS port file
126 | .tern-port
127 |
128 | # Stores VSCode versions used for testing VSCode extensions
129 | .vscode-test
130 |
131 | # yarn v2
132 | .yarn/cache
133 | .yarn/unplugged
134 | .yarn/build-state.yml
135 | .yarn/install-state.gz
136 | .pnp.*
137 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | hello@tomrumpf.com.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to Holy Loader
2 |
3 | First off, thanks for taking the time to contribute!
4 |
5 | All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions.
6 |
7 | > And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
8 | >
9 | > - Star the project
10 | > - Tweet about it
11 | > - Refer this project in your project's README
12 | > - Mention the project at local meetups and tell your friends/colleagues
13 |
14 | ## Table of Contents
15 |
16 | - [I Have a Question](#i-have-a-question)
17 | - [I Want To Contribute](#i-want-to-contribute)
18 | - [Reporting Bugs](#reporting-bugs)
19 | - [Suggesting Enhancements](#suggesting-enhancements)
20 |
21 | ## I Have a Question
22 |
23 | > If you want to ask a question, we assume that you have read the available [Documentation](https://github.com/tomcru/holy-loader#readme).
24 |
25 | Before you ask a question, it is best to search for existing [Issues](https://github.com/tomcru/holy-loader/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.
26 |
27 | If you then still feel the need to ask a question and need clarification, we recommend the following:
28 |
29 | - Open an [Issue](https://github.com/tomcru/holy-loader/issues/new).
30 | - Provide as much context as you can about what you're running into.
31 |
32 | We will then take care of the issue as soon as possible.
33 |
34 | ## I Want To Contribute
35 |
36 | ### Reporting Bugs
37 |
38 | #### Before Submitting a Bug Report
39 |
40 | A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
41 |
42 | - Make sure that you are using the latest version.
43 | - Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://github.com/tomcru/holy-loader#readme). If you are looking for support, you might want to check [this section](#i-have-a-question)).
44 | - To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/tomcru/holy-loader/labels/kind%2Fbug).
45 |
46 | #### How Do I Submit a Good Bug Report?
47 |
48 | > You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to hello@tomrumpf.com.
49 |
50 | We use GitHub issues to track bugs and errors. If you run into an issue with the project:
51 |
52 | - Open an [Issue](https://github.com/tomcru/holy-loader/issues/new).
53 | - Explain the behavior you would expect and the actual behavior.
54 | - Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
55 |
56 | Once it's filed:
57 |
58 | - The project team will label the issue accordingly.
59 | - A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `bug/1-unconfirmed`. Bugs with the `bug/1-unconfirmed` tag will not be addressed until they are reproduced.
60 | - If the team is able to reproduce the issue, it will be marked `bug/2-confirmed`, as well as possibly other tags, and the issue will be left to be implemented by someone.
61 |
62 | ### Suggesting Enhancements
63 |
64 | This section guides you through submitting an enhancement suggestion for Holy Loader, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
65 |
66 | #### Before Submitting an Enhancement
67 |
68 | - Make sure that you are using the latest version.
69 | - Read the [documentation](https://github.com/tomcru/holy-loader#readme) carefully and find out if the functionality is already covered, maybe by an individual configuration.
70 | - Perform a [search](https://github.com/tomcru/holy-loader/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
71 | - Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
72 |
73 | #### How Do I Submit a Good Enhancement Suggestion?
74 |
75 | Enhancement suggestions are tracked as [GitHub issues](https://github.com/tomcru/holy-loader/issues).
76 |
77 | - Use a **clear and descriptive title** for the issue to identify the suggestion.
78 | - Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
79 | - **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
80 | - **Explain why this enhancement would be useful** to most Holy Loader users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
81 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Tom Rumpf
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 |
--------------------------------------------------------------------------------
/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | # Description
2 |
3 | Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change.
4 |
5 | Fixes # (issue)
6 |
7 | ## Type of change
8 |
9 | Please delete options that are not relevant.
10 |
11 | - [ ] Bug fix (non-breaking change which fixes an issue)
12 | - [ ] New feature (non-breaking change which adds functionality)
13 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
14 | - [ ] This change requires a documentation update
15 |
16 | # Checklist:
17 |
18 | - [ ] My code follows the style guidelines of this project
19 | - [ ] I have performed a self-review of my code
20 | - [ ] I have commented my code, particularly in hard-to-understand areas
21 | - [ ] I have made corresponding changes to the documentation
22 | - [ ] My changes generate no new warnings
23 | - [ ] I have added tests that prove my fix is effective or that my feature works
24 | - [ ] New and existing unit tests pass with my changes
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | Holy Loader
4 |
5 |
6 |
7 |
8 | > Holy Loader is a lightweight and customizable top-loading progress bar component, specifically designed for React applications and optimized for Next.js with app router.
9 |
10 | Want to see it in use? Visit: [GameGator](https://gamegator.net).
11 |
12 | Also check out [Holy Time](https://github.com/badosz0/holy-time), yet another (type-safe) date time library.
13 |
14 | ## Features
15 |
16 | - Easy to integrate with any React application.
17 | - Highly customizable with sensible defaults.
18 | - Utilizes a custom implementation for smooth, aesthetic progress indications.
19 | - Supports dynamic configuration for color, height, speed, easing, and more.
20 | - **Manual controls**: Start & stop the loader yourself.
21 | - **i18n ready**: Supports `ltr` (left-to-right) & `rtl` (right-to-left) layouts with the `dir` prop.
22 |
23 | ## Installation
24 |
25 | To install Holy Loader, run the following command in your project directory:
26 |
27 | ```bash
28 | npm install holy-loader
29 | ```
30 |
31 | OR
32 |
33 | ```bash
34 | yarn add holy-loader
35 | ```
36 |
37 | ## Usage
38 |
39 | To use Holy Loader in your Next.js application using the app router:
40 |
41 | ```typescript
42 | import HolyLoader from "holy-loader";
43 |
44 | export default function RootLayout({ children }) {
45 | return (
46 |
47 |
48 | {children}
49 |
50 | );
51 | }
52 | ```
53 |
54 | To use Holy Loader in your Next.js application using the pages router:
55 |
56 | ```typescript
57 | import HolyLoader from "holy-loader";
58 |
59 | export default function App({ Component, pageProps }) {
60 | return (
61 | <>
62 |
63 | ;
64 | >
65 | );
66 | }
67 | ```
68 |
69 | ### Custom Configuration
70 |
71 | ```typescript
72 | import HolyLoader from "holy-loader";
73 |
74 | export default function RootLayout({ children }) {
75 | return (
76 |
77 |
84 | {children}
85 |
86 | );
87 | }
88 | ```
89 |
90 | ### Manual Control (Client Components)
91 |
92 | Have an async operation before an eventual route change? You might be interested in holy-loader's manual controls. These only work in client components!
93 |
94 | ```typescript
95 | 'use client';
96 |
97 | import { startHolyLoader, stopHolyLoader } from 'holy-loader';
98 |
99 | try {
100 | startHolyLoader();
101 | await signOut()
102 | } catch (error) {
103 | stopHolyLoader();
104 | } finally {
105 | stopHolyLoader();
106 | /* OR */
107 | router.push('/');
108 | }
109 | ```
110 |
111 | ## Common issues
112 |
113 | Prevent triggering the loader when clicking a Button within a Next link:
114 |
115 | ```typescript
116 | onClick={(e) => {
117 | e.preventDefault();
118 | e.nativeEvent.stopImmediatePropagation();
119 | }}
120 | ```
121 |
122 | ## API
123 |
124 | `` accepts the following props for customization:
125 |
126 | | Prop | Type | Description | Default |
127 | |----------------------|----------------------|--------------------------------------------------------------------------------------------------------------|--------------|
128 | | `color` | `string` | Specifies the color of the top-loading bar. Accepts any valid CSS `background` value, including gradients. | `#59a2ff` |
129 | | `initialPosition` | `number` | Sets the initial position of the top-loading bar as a percentage of the total width. | `0.08` |
130 | | `height` | `number` or `string` | Defines the height of the top-loading bar in pixels or CSS unit. | `4px` |
131 | | `easing` | `string` | Specifies the easing function to use for the loading animation. Accepts any valid CSS easing string. | `ease` |
132 | | `speed` | `number` | Sets the animation speed of the top-loading bar in milliseconds. | `200` |
133 | | `zIndex` | `number` | Defines the z-index property of the top-loading bar, controlling its stacking order. | `2147483647` |
134 | | `boxShadow` | `string` | Sets the box-shadow property of the top-loading bar. Turned off by default. | `null` |
135 | | `showSpinner` | `boolean` | Determines whether to accompany the loading bar with a spinner. Turned off by default. | `false` |
136 | | `ignoreSearchParams` | `boolean` | Determines whether to ignore search parameters in the URL when triggering the loader. Turned off by default. | `false` |
137 | | `dir` | `ltr` or `rtl` | Sets the direction of the top-loading bar. | `ltr` |
138 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
3 | "files": {
4 | "include": ["src/**/*.ts"],
5 | "ignore": ["dist", ".github", "node_modules"]
6 | },
7 | "formatter": {
8 | "enabled": true,
9 | "formatWithErrors": false,
10 | "indentStyle": "space",
11 | "indentWidth": 2,
12 | "lineEnding": "lf",
13 | "lineWidth": 120,
14 | "attributePosition": "auto"
15 | },
16 | "organizeImports": { "enabled": true },
17 | "linter": {
18 | "enabled": true,
19 | "rules": {
20 | "recommended": true,
21 | "style": {
22 | "noParameterAssign": "off"
23 | }
24 | }
25 | },
26 | "javascript": {
27 | "formatter": {
28 | "lineWidth": 80,
29 | "jsxQuoteStyle": "double",
30 | "quoteProperties": "asNeeded",
31 | "trailingCommas": "all",
32 | "semicolons": "always",
33 | "arrowParentheses": "always",
34 | "bracketSpacing": true,
35 | "bracketSameLine": false,
36 | "quoteStyle": "single",
37 | "attributePosition": "auto"
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "holy-loader",
3 | "version": "2.3.13",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "holy-loader",
9 | "version": "2.3.13",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@biomejs/biome": "^1.9.0",
13 | "@types/react": "^18.2.43",
14 | "react": "^18.2.0",
15 | "tsup": "^8.0.1",
16 | "typescript": "^5.6.2",
17 | "vitest": "^2.1.1"
18 | },
19 | "peerDependencies": {
20 | "react": ">= 16.0.0"
21 | }
22 | },
23 | "node_modules/@biomejs/biome": {
24 | "version": "1.9.0",
25 | "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.0.tgz",
26 | "integrity": "sha512-NlWh2F1wbxB3O/wE+aohGL0BziTS6e+6+dyFvpdeqLsbQZY7EsiklFb9W5Xs41U4vEmY7ANgdNp+oVDij6sQdA==",
27 | "dev": true,
28 | "hasInstallScript": true,
29 | "license": "MIT OR Apache-2.0",
30 | "bin": {
31 | "biome": "bin/biome"
32 | },
33 | "engines": {
34 | "node": ">=14.21.3"
35 | },
36 | "funding": {
37 | "type": "opencollective",
38 | "url": "https://opencollective.com/biome"
39 | },
40 | "optionalDependencies": {
41 | "@biomejs/cli-darwin-arm64": "1.9.0",
42 | "@biomejs/cli-darwin-x64": "1.9.0",
43 | "@biomejs/cli-linux-arm64": "1.9.0",
44 | "@biomejs/cli-linux-arm64-musl": "1.9.0",
45 | "@biomejs/cli-linux-x64": "1.9.0",
46 | "@biomejs/cli-linux-x64-musl": "1.9.0",
47 | "@biomejs/cli-win32-arm64": "1.9.0",
48 | "@biomejs/cli-win32-x64": "1.9.0"
49 | }
50 | },
51 | "node_modules/@biomejs/cli-darwin-arm64": {
52 | "version": "1.9.0",
53 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.0.tgz",
54 | "integrity": "sha512-2w9v/NRtYSmodx5QWQ49OGcyGKSECdWKbzc7n532Iq5sBhkKk996fd19icT6BuL54f01KFKRCRibAW+A2rg1Kw==",
55 | "cpu": [
56 | "arm64"
57 | ],
58 | "dev": true,
59 | "license": "MIT OR Apache-2.0",
60 | "optional": true,
61 | "os": [
62 | "darwin"
63 | ],
64 | "engines": {
65 | "node": ">=14.21.3"
66 | }
67 | },
68 | "node_modules/@biomejs/cli-darwin-x64": {
69 | "version": "1.9.0",
70 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.0.tgz",
71 | "integrity": "sha512-fBVt8jJQi0zX0SJ1C+tdzUbRpuX/07sgtBXEhunWRkPjdi6W/2S1sYHQ1wKn4OKiRAKfHM2Cf2FNO7hQvY61dA==",
72 | "cpu": [
73 | "x64"
74 | ],
75 | "dev": true,
76 | "license": "MIT OR Apache-2.0",
77 | "optional": true,
78 | "os": [
79 | "darwin"
80 | ],
81 | "engines": {
82 | "node": ">=14.21.3"
83 | }
84 | },
85 | "node_modules/@biomejs/cli-linux-arm64": {
86 | "version": "1.9.0",
87 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.0.tgz",
88 | "integrity": "sha512-l8U2lcqsl9yKPP5WUdIrKH//C1pWyM2cSUfcTBn6GSvXmsSjBNEdGSdM4Wfne777Oe/9ONaD1Ga53U2HksHHLw==",
89 | "cpu": [
90 | "arm64"
91 | ],
92 | "dev": true,
93 | "license": "MIT OR Apache-2.0",
94 | "optional": true,
95 | "os": [
96 | "linux"
97 | ],
98 | "engines": {
99 | "node": ">=14.21.3"
100 | }
101 | },
102 | "node_modules/@biomejs/cli-linux-arm64-musl": {
103 | "version": "1.9.0",
104 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.0.tgz",
105 | "integrity": "sha512-Jy84mZ4vcppdmWMgQWOCfd8qIVC/vHmlaS5gy7GXkdWlBKSQ56YxEXTU58MHTbZ16LwJQpK2IulqRCC/rqWLBA==",
106 | "cpu": [
107 | "arm64"
108 | ],
109 | "dev": true,
110 | "license": "MIT OR Apache-2.0",
111 | "optional": true,
112 | "os": [
113 | "linux"
114 | ],
115 | "engines": {
116 | "node": ">=14.21.3"
117 | }
118 | },
119 | "node_modules/@biomejs/cli-linux-x64": {
120 | "version": "1.9.0",
121 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.0.tgz",
122 | "integrity": "sha512-8jAzjrrJTj510pwq4aVs7ZKkOvEy1D+nzl9DKvrPh4TOyUw5Ie+0EDwXGE2RAkCKHkGNOQBZ78WtIdsATgz5sA==",
123 | "cpu": [
124 | "x64"
125 | ],
126 | "dev": true,
127 | "license": "MIT OR Apache-2.0",
128 | "optional": true,
129 | "os": [
130 | "linux"
131 | ],
132 | "engines": {
133 | "node": ">=14.21.3"
134 | }
135 | },
136 | "node_modules/@biomejs/cli-linux-x64-musl": {
137 | "version": "1.9.0",
138 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.0.tgz",
139 | "integrity": "sha512-N3enoFoIrkB6qJWyYfTiYmFdB1R/Mrij1dd1xBHqxxCKZY9GRkEswRX3F1Uqzo5T+9Iu8nAQobDqI/ygicYy/Q==",
140 | "cpu": [
141 | "x64"
142 | ],
143 | "dev": true,
144 | "license": "MIT OR Apache-2.0",
145 | "optional": true,
146 | "os": [
147 | "linux"
148 | ],
149 | "engines": {
150 | "node": ">=14.21.3"
151 | }
152 | },
153 | "node_modules/@biomejs/cli-win32-arm64": {
154 | "version": "1.9.0",
155 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.0.tgz",
156 | "integrity": "sha512-AIjwJTGfdWGMRluSQ9pDB29nzce077dfHh0/HMqzztKzgD3spyuo2R9VoaFpbR0hLHPWEH6g6OxxDO7hfkXNkQ==",
157 | "cpu": [
158 | "arm64"
159 | ],
160 | "dev": true,
161 | "license": "MIT OR Apache-2.0",
162 | "optional": true,
163 | "os": [
164 | "win32"
165 | ],
166 | "engines": {
167 | "node": ">=14.21.3"
168 | }
169 | },
170 | "node_modules/@biomejs/cli-win32-x64": {
171 | "version": "1.9.0",
172 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.0.tgz",
173 | "integrity": "sha512-4/4wTjNSoyNkm1SzcUaStDx46baX1VJRXtUoeEHjX9LfedR5N3qwZz5KfrRUnCd2fl5bmXK1CwMqKBkoF6zEiA==",
174 | "cpu": [
175 | "x64"
176 | ],
177 | "dev": true,
178 | "license": "MIT OR Apache-2.0",
179 | "optional": true,
180 | "os": [
181 | "win32"
182 | ],
183 | "engines": {
184 | "node": ">=14.21.3"
185 | }
186 | },
187 | "node_modules/@esbuild/aix-ppc64": {
188 | "version": "0.23.1",
189 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz",
190 | "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==",
191 | "cpu": [
192 | "ppc64"
193 | ],
194 | "dev": true,
195 | "license": "MIT",
196 | "optional": true,
197 | "os": [
198 | "aix"
199 | ],
200 | "engines": {
201 | "node": ">=18"
202 | }
203 | },
204 | "node_modules/@esbuild/android-arm": {
205 | "version": "0.23.1",
206 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz",
207 | "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==",
208 | "cpu": [
209 | "arm"
210 | ],
211 | "dev": true,
212 | "license": "MIT",
213 | "optional": true,
214 | "os": [
215 | "android"
216 | ],
217 | "engines": {
218 | "node": ">=18"
219 | }
220 | },
221 | "node_modules/@esbuild/android-arm64": {
222 | "version": "0.23.1",
223 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz",
224 | "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==",
225 | "cpu": [
226 | "arm64"
227 | ],
228 | "dev": true,
229 | "license": "MIT",
230 | "optional": true,
231 | "os": [
232 | "android"
233 | ],
234 | "engines": {
235 | "node": ">=18"
236 | }
237 | },
238 | "node_modules/@esbuild/android-x64": {
239 | "version": "0.23.1",
240 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz",
241 | "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==",
242 | "cpu": [
243 | "x64"
244 | ],
245 | "dev": true,
246 | "license": "MIT",
247 | "optional": true,
248 | "os": [
249 | "android"
250 | ],
251 | "engines": {
252 | "node": ">=18"
253 | }
254 | },
255 | "node_modules/@esbuild/darwin-arm64": {
256 | "version": "0.23.1",
257 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz",
258 | "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==",
259 | "cpu": [
260 | "arm64"
261 | ],
262 | "dev": true,
263 | "license": "MIT",
264 | "optional": true,
265 | "os": [
266 | "darwin"
267 | ],
268 | "engines": {
269 | "node": ">=18"
270 | }
271 | },
272 | "node_modules/@esbuild/darwin-x64": {
273 | "version": "0.23.1",
274 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz",
275 | "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==",
276 | "cpu": [
277 | "x64"
278 | ],
279 | "dev": true,
280 | "license": "MIT",
281 | "optional": true,
282 | "os": [
283 | "darwin"
284 | ],
285 | "engines": {
286 | "node": ">=18"
287 | }
288 | },
289 | "node_modules/@esbuild/freebsd-arm64": {
290 | "version": "0.23.1",
291 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz",
292 | "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==",
293 | "cpu": [
294 | "arm64"
295 | ],
296 | "dev": true,
297 | "license": "MIT",
298 | "optional": true,
299 | "os": [
300 | "freebsd"
301 | ],
302 | "engines": {
303 | "node": ">=18"
304 | }
305 | },
306 | "node_modules/@esbuild/freebsd-x64": {
307 | "version": "0.23.1",
308 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz",
309 | "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==",
310 | "cpu": [
311 | "x64"
312 | ],
313 | "dev": true,
314 | "license": "MIT",
315 | "optional": true,
316 | "os": [
317 | "freebsd"
318 | ],
319 | "engines": {
320 | "node": ">=18"
321 | }
322 | },
323 | "node_modules/@esbuild/linux-arm": {
324 | "version": "0.23.1",
325 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz",
326 | "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==",
327 | "cpu": [
328 | "arm"
329 | ],
330 | "dev": true,
331 | "license": "MIT",
332 | "optional": true,
333 | "os": [
334 | "linux"
335 | ],
336 | "engines": {
337 | "node": ">=18"
338 | }
339 | },
340 | "node_modules/@esbuild/linux-arm64": {
341 | "version": "0.23.1",
342 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz",
343 | "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==",
344 | "cpu": [
345 | "arm64"
346 | ],
347 | "dev": true,
348 | "license": "MIT",
349 | "optional": true,
350 | "os": [
351 | "linux"
352 | ],
353 | "engines": {
354 | "node": ">=18"
355 | }
356 | },
357 | "node_modules/@esbuild/linux-ia32": {
358 | "version": "0.23.1",
359 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz",
360 | "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==",
361 | "cpu": [
362 | "ia32"
363 | ],
364 | "dev": true,
365 | "license": "MIT",
366 | "optional": true,
367 | "os": [
368 | "linux"
369 | ],
370 | "engines": {
371 | "node": ">=18"
372 | }
373 | },
374 | "node_modules/@esbuild/linux-loong64": {
375 | "version": "0.23.1",
376 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz",
377 | "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==",
378 | "cpu": [
379 | "loong64"
380 | ],
381 | "dev": true,
382 | "license": "MIT",
383 | "optional": true,
384 | "os": [
385 | "linux"
386 | ],
387 | "engines": {
388 | "node": ">=18"
389 | }
390 | },
391 | "node_modules/@esbuild/linux-mips64el": {
392 | "version": "0.23.1",
393 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz",
394 | "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==",
395 | "cpu": [
396 | "mips64el"
397 | ],
398 | "dev": true,
399 | "license": "MIT",
400 | "optional": true,
401 | "os": [
402 | "linux"
403 | ],
404 | "engines": {
405 | "node": ">=18"
406 | }
407 | },
408 | "node_modules/@esbuild/linux-ppc64": {
409 | "version": "0.23.1",
410 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz",
411 | "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==",
412 | "cpu": [
413 | "ppc64"
414 | ],
415 | "dev": true,
416 | "license": "MIT",
417 | "optional": true,
418 | "os": [
419 | "linux"
420 | ],
421 | "engines": {
422 | "node": ">=18"
423 | }
424 | },
425 | "node_modules/@esbuild/linux-riscv64": {
426 | "version": "0.23.1",
427 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz",
428 | "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==",
429 | "cpu": [
430 | "riscv64"
431 | ],
432 | "dev": true,
433 | "license": "MIT",
434 | "optional": true,
435 | "os": [
436 | "linux"
437 | ],
438 | "engines": {
439 | "node": ">=18"
440 | }
441 | },
442 | "node_modules/@esbuild/linux-s390x": {
443 | "version": "0.23.1",
444 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz",
445 | "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==",
446 | "cpu": [
447 | "s390x"
448 | ],
449 | "dev": true,
450 | "license": "MIT",
451 | "optional": true,
452 | "os": [
453 | "linux"
454 | ],
455 | "engines": {
456 | "node": ">=18"
457 | }
458 | },
459 | "node_modules/@esbuild/linux-x64": {
460 | "version": "0.23.1",
461 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz",
462 | "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==",
463 | "cpu": [
464 | "x64"
465 | ],
466 | "dev": true,
467 | "license": "MIT",
468 | "optional": true,
469 | "os": [
470 | "linux"
471 | ],
472 | "engines": {
473 | "node": ">=18"
474 | }
475 | },
476 | "node_modules/@esbuild/netbsd-x64": {
477 | "version": "0.23.1",
478 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz",
479 | "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==",
480 | "cpu": [
481 | "x64"
482 | ],
483 | "dev": true,
484 | "license": "MIT",
485 | "optional": true,
486 | "os": [
487 | "netbsd"
488 | ],
489 | "engines": {
490 | "node": ">=18"
491 | }
492 | },
493 | "node_modules/@esbuild/openbsd-arm64": {
494 | "version": "0.23.1",
495 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz",
496 | "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==",
497 | "cpu": [
498 | "arm64"
499 | ],
500 | "dev": true,
501 | "license": "MIT",
502 | "optional": true,
503 | "os": [
504 | "openbsd"
505 | ],
506 | "engines": {
507 | "node": ">=18"
508 | }
509 | },
510 | "node_modules/@esbuild/openbsd-x64": {
511 | "version": "0.23.1",
512 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz",
513 | "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==",
514 | "cpu": [
515 | "x64"
516 | ],
517 | "dev": true,
518 | "license": "MIT",
519 | "optional": true,
520 | "os": [
521 | "openbsd"
522 | ],
523 | "engines": {
524 | "node": ">=18"
525 | }
526 | },
527 | "node_modules/@esbuild/sunos-x64": {
528 | "version": "0.23.1",
529 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz",
530 | "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==",
531 | "cpu": [
532 | "x64"
533 | ],
534 | "dev": true,
535 | "license": "MIT",
536 | "optional": true,
537 | "os": [
538 | "sunos"
539 | ],
540 | "engines": {
541 | "node": ">=18"
542 | }
543 | },
544 | "node_modules/@esbuild/win32-arm64": {
545 | "version": "0.23.1",
546 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz",
547 | "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==",
548 | "cpu": [
549 | "arm64"
550 | ],
551 | "dev": true,
552 | "license": "MIT",
553 | "optional": true,
554 | "os": [
555 | "win32"
556 | ],
557 | "engines": {
558 | "node": ">=18"
559 | }
560 | },
561 | "node_modules/@esbuild/win32-ia32": {
562 | "version": "0.23.1",
563 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz",
564 | "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==",
565 | "cpu": [
566 | "ia32"
567 | ],
568 | "dev": true,
569 | "license": "MIT",
570 | "optional": true,
571 | "os": [
572 | "win32"
573 | ],
574 | "engines": {
575 | "node": ">=18"
576 | }
577 | },
578 | "node_modules/@esbuild/win32-x64": {
579 | "version": "0.23.1",
580 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz",
581 | "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==",
582 | "cpu": [
583 | "x64"
584 | ],
585 | "dev": true,
586 | "license": "MIT",
587 | "optional": true,
588 | "os": [
589 | "win32"
590 | ],
591 | "engines": {
592 | "node": ">=18"
593 | }
594 | },
595 | "node_modules/@isaacs/cliui": {
596 | "version": "8.0.2",
597 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
598 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
599 | "dev": true,
600 | "license": "ISC",
601 | "dependencies": {
602 | "string-width": "^5.1.2",
603 | "string-width-cjs": "npm:string-width@^4.2.0",
604 | "strip-ansi": "^7.0.1",
605 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
606 | "wrap-ansi": "^8.1.0",
607 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
608 | },
609 | "engines": {
610 | "node": ">=12"
611 | }
612 | },
613 | "node_modules/@jridgewell/gen-mapping": {
614 | "version": "0.3.5",
615 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
616 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
617 | "dev": true,
618 | "license": "MIT",
619 | "dependencies": {
620 | "@jridgewell/set-array": "^1.2.1",
621 | "@jridgewell/sourcemap-codec": "^1.4.10",
622 | "@jridgewell/trace-mapping": "^0.3.24"
623 | },
624 | "engines": {
625 | "node": ">=6.0.0"
626 | }
627 | },
628 | "node_modules/@jridgewell/resolve-uri": {
629 | "version": "3.1.2",
630 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
631 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
632 | "dev": true,
633 | "license": "MIT",
634 | "engines": {
635 | "node": ">=6.0.0"
636 | }
637 | },
638 | "node_modules/@jridgewell/set-array": {
639 | "version": "1.2.1",
640 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
641 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
642 | "dev": true,
643 | "license": "MIT",
644 | "engines": {
645 | "node": ">=6.0.0"
646 | }
647 | },
648 | "node_modules/@jridgewell/sourcemap-codec": {
649 | "version": "1.5.0",
650 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
651 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
652 | "dev": true,
653 | "license": "MIT"
654 | },
655 | "node_modules/@jridgewell/trace-mapping": {
656 | "version": "0.3.25",
657 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
658 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
659 | "dev": true,
660 | "license": "MIT",
661 | "dependencies": {
662 | "@jridgewell/resolve-uri": "^3.1.0",
663 | "@jridgewell/sourcemap-codec": "^1.4.14"
664 | }
665 | },
666 | "node_modules/@nodelib/fs.scandir": {
667 | "version": "2.1.5",
668 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
669 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
670 | "dev": true,
671 | "license": "MIT",
672 | "dependencies": {
673 | "@nodelib/fs.stat": "2.0.5",
674 | "run-parallel": "^1.1.9"
675 | },
676 | "engines": {
677 | "node": ">= 8"
678 | }
679 | },
680 | "node_modules/@nodelib/fs.stat": {
681 | "version": "2.0.5",
682 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
683 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
684 | "dev": true,
685 | "license": "MIT",
686 | "engines": {
687 | "node": ">= 8"
688 | }
689 | },
690 | "node_modules/@nodelib/fs.walk": {
691 | "version": "1.2.8",
692 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
693 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
694 | "dev": true,
695 | "license": "MIT",
696 | "dependencies": {
697 | "@nodelib/fs.scandir": "2.1.5",
698 | "fastq": "^1.6.0"
699 | },
700 | "engines": {
701 | "node": ">= 8"
702 | }
703 | },
704 | "node_modules/@pkgjs/parseargs": {
705 | "version": "0.11.0",
706 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
707 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
708 | "dev": true,
709 | "license": "MIT",
710 | "optional": true,
711 | "engines": {
712 | "node": ">=14"
713 | }
714 | },
715 | "node_modules/@rollup/rollup-android-arm-eabi": {
716 | "version": "4.21.3",
717 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz",
718 | "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==",
719 | "cpu": [
720 | "arm"
721 | ],
722 | "dev": true,
723 | "license": "MIT",
724 | "optional": true,
725 | "os": [
726 | "android"
727 | ]
728 | },
729 | "node_modules/@rollup/rollup-android-arm64": {
730 | "version": "4.21.3",
731 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz",
732 | "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==",
733 | "cpu": [
734 | "arm64"
735 | ],
736 | "dev": true,
737 | "license": "MIT",
738 | "optional": true,
739 | "os": [
740 | "android"
741 | ]
742 | },
743 | "node_modules/@rollup/rollup-darwin-arm64": {
744 | "version": "4.21.3",
745 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz",
746 | "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==",
747 | "cpu": [
748 | "arm64"
749 | ],
750 | "dev": true,
751 | "license": "MIT",
752 | "optional": true,
753 | "os": [
754 | "darwin"
755 | ]
756 | },
757 | "node_modules/@rollup/rollup-darwin-x64": {
758 | "version": "4.21.3",
759 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz",
760 | "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==",
761 | "cpu": [
762 | "x64"
763 | ],
764 | "dev": true,
765 | "license": "MIT",
766 | "optional": true,
767 | "os": [
768 | "darwin"
769 | ]
770 | },
771 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
772 | "version": "4.21.3",
773 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz",
774 | "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==",
775 | "cpu": [
776 | "arm"
777 | ],
778 | "dev": true,
779 | "license": "MIT",
780 | "optional": true,
781 | "os": [
782 | "linux"
783 | ]
784 | },
785 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
786 | "version": "4.21.3",
787 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz",
788 | "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==",
789 | "cpu": [
790 | "arm"
791 | ],
792 | "dev": true,
793 | "license": "MIT",
794 | "optional": true,
795 | "os": [
796 | "linux"
797 | ]
798 | },
799 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
800 | "version": "4.21.3",
801 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz",
802 | "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==",
803 | "cpu": [
804 | "arm64"
805 | ],
806 | "dev": true,
807 | "license": "MIT",
808 | "optional": true,
809 | "os": [
810 | "linux"
811 | ]
812 | },
813 | "node_modules/@rollup/rollup-linux-arm64-musl": {
814 | "version": "4.21.3",
815 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz",
816 | "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==",
817 | "cpu": [
818 | "arm64"
819 | ],
820 | "dev": true,
821 | "license": "MIT",
822 | "optional": true,
823 | "os": [
824 | "linux"
825 | ]
826 | },
827 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
828 | "version": "4.21.3",
829 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz",
830 | "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==",
831 | "cpu": [
832 | "ppc64"
833 | ],
834 | "dev": true,
835 | "license": "MIT",
836 | "optional": true,
837 | "os": [
838 | "linux"
839 | ]
840 | },
841 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
842 | "version": "4.21.3",
843 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz",
844 | "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==",
845 | "cpu": [
846 | "riscv64"
847 | ],
848 | "dev": true,
849 | "license": "MIT",
850 | "optional": true,
851 | "os": [
852 | "linux"
853 | ]
854 | },
855 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
856 | "version": "4.21.3",
857 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz",
858 | "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==",
859 | "cpu": [
860 | "s390x"
861 | ],
862 | "dev": true,
863 | "license": "MIT",
864 | "optional": true,
865 | "os": [
866 | "linux"
867 | ]
868 | },
869 | "node_modules/@rollup/rollup-linux-x64-gnu": {
870 | "version": "4.21.3",
871 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz",
872 | "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==",
873 | "cpu": [
874 | "x64"
875 | ],
876 | "dev": true,
877 | "license": "MIT",
878 | "optional": true,
879 | "os": [
880 | "linux"
881 | ]
882 | },
883 | "node_modules/@rollup/rollup-linux-x64-musl": {
884 | "version": "4.21.3",
885 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz",
886 | "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==",
887 | "cpu": [
888 | "x64"
889 | ],
890 | "dev": true,
891 | "license": "MIT",
892 | "optional": true,
893 | "os": [
894 | "linux"
895 | ]
896 | },
897 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
898 | "version": "4.21.3",
899 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz",
900 | "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==",
901 | "cpu": [
902 | "arm64"
903 | ],
904 | "dev": true,
905 | "license": "MIT",
906 | "optional": true,
907 | "os": [
908 | "win32"
909 | ]
910 | },
911 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
912 | "version": "4.21.3",
913 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz",
914 | "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==",
915 | "cpu": [
916 | "ia32"
917 | ],
918 | "dev": true,
919 | "license": "MIT",
920 | "optional": true,
921 | "os": [
922 | "win32"
923 | ]
924 | },
925 | "node_modules/@rollup/rollup-win32-x64-msvc": {
926 | "version": "4.21.3",
927 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz",
928 | "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==",
929 | "cpu": [
930 | "x64"
931 | ],
932 | "dev": true,
933 | "license": "MIT",
934 | "optional": true,
935 | "os": [
936 | "win32"
937 | ]
938 | },
939 | "node_modules/@types/estree": {
940 | "version": "1.0.5",
941 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
942 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
943 | "dev": true,
944 | "license": "MIT"
945 | },
946 | "node_modules/@types/prop-types": {
947 | "version": "15.7.12",
948 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
949 | "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
950 | "dev": true,
951 | "license": "MIT"
952 | },
953 | "node_modules/@types/react": {
954 | "version": "18.3.5",
955 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz",
956 | "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==",
957 | "dev": true,
958 | "license": "MIT",
959 | "dependencies": {
960 | "@types/prop-types": "*",
961 | "csstype": "^3.0.2"
962 | }
963 | },
964 | "node_modules/@vitest/expect": {
965 | "version": "2.1.1",
966 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz",
967 | "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==",
968 | "dev": true,
969 | "license": "MIT",
970 | "dependencies": {
971 | "@vitest/spy": "2.1.1",
972 | "@vitest/utils": "2.1.1",
973 | "chai": "^5.1.1",
974 | "tinyrainbow": "^1.2.0"
975 | },
976 | "funding": {
977 | "url": "https://opencollective.com/vitest"
978 | }
979 | },
980 | "node_modules/@vitest/mocker": {
981 | "version": "2.1.1",
982 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz",
983 | "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==",
984 | "dev": true,
985 | "license": "MIT",
986 | "dependencies": {
987 | "@vitest/spy": "^2.1.0-beta.1",
988 | "estree-walker": "^3.0.3",
989 | "magic-string": "^0.30.11"
990 | },
991 | "funding": {
992 | "url": "https://opencollective.com/vitest"
993 | },
994 | "peerDependencies": {
995 | "@vitest/spy": "2.1.1",
996 | "msw": "^2.3.5",
997 | "vite": "^5.0.0"
998 | },
999 | "peerDependenciesMeta": {
1000 | "msw": {
1001 | "optional": true
1002 | },
1003 | "vite": {
1004 | "optional": true
1005 | }
1006 | }
1007 | },
1008 | "node_modules/@vitest/pretty-format": {
1009 | "version": "2.1.1",
1010 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz",
1011 | "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==",
1012 | "dev": true,
1013 | "license": "MIT",
1014 | "dependencies": {
1015 | "tinyrainbow": "^1.2.0"
1016 | },
1017 | "funding": {
1018 | "url": "https://opencollective.com/vitest"
1019 | }
1020 | },
1021 | "node_modules/@vitest/runner": {
1022 | "version": "2.1.1",
1023 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz",
1024 | "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==",
1025 | "dev": true,
1026 | "license": "MIT",
1027 | "dependencies": {
1028 | "@vitest/utils": "2.1.1",
1029 | "pathe": "^1.1.2"
1030 | },
1031 | "funding": {
1032 | "url": "https://opencollective.com/vitest"
1033 | }
1034 | },
1035 | "node_modules/@vitest/snapshot": {
1036 | "version": "2.1.1",
1037 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz",
1038 | "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==",
1039 | "dev": true,
1040 | "license": "MIT",
1041 | "dependencies": {
1042 | "@vitest/pretty-format": "2.1.1",
1043 | "magic-string": "^0.30.11",
1044 | "pathe": "^1.1.2"
1045 | },
1046 | "funding": {
1047 | "url": "https://opencollective.com/vitest"
1048 | }
1049 | },
1050 | "node_modules/@vitest/spy": {
1051 | "version": "2.1.1",
1052 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz",
1053 | "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==",
1054 | "dev": true,
1055 | "license": "MIT",
1056 | "dependencies": {
1057 | "tinyspy": "^3.0.0"
1058 | },
1059 | "funding": {
1060 | "url": "https://opencollective.com/vitest"
1061 | }
1062 | },
1063 | "node_modules/@vitest/utils": {
1064 | "version": "2.1.1",
1065 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz",
1066 | "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==",
1067 | "dev": true,
1068 | "license": "MIT",
1069 | "dependencies": {
1070 | "@vitest/pretty-format": "2.1.1",
1071 | "loupe": "^3.1.1",
1072 | "tinyrainbow": "^1.2.0"
1073 | },
1074 | "funding": {
1075 | "url": "https://opencollective.com/vitest"
1076 | }
1077 | },
1078 | "node_modules/ansi-regex": {
1079 | "version": "6.1.0",
1080 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
1081 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
1082 | "dev": true,
1083 | "license": "MIT",
1084 | "engines": {
1085 | "node": ">=12"
1086 | },
1087 | "funding": {
1088 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1089 | }
1090 | },
1091 | "node_modules/any-promise": {
1092 | "version": "1.3.0",
1093 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1094 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1095 | "dev": true,
1096 | "license": "MIT"
1097 | },
1098 | "node_modules/anymatch": {
1099 | "version": "3.1.3",
1100 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1101 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1102 | "dev": true,
1103 | "license": "ISC",
1104 | "dependencies": {
1105 | "normalize-path": "^3.0.0",
1106 | "picomatch": "^2.0.4"
1107 | },
1108 | "engines": {
1109 | "node": ">= 8"
1110 | }
1111 | },
1112 | "node_modules/array-union": {
1113 | "version": "2.1.0",
1114 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
1115 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
1116 | "dev": true,
1117 | "license": "MIT",
1118 | "engines": {
1119 | "node": ">=8"
1120 | }
1121 | },
1122 | "node_modules/assertion-error": {
1123 | "version": "2.0.1",
1124 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
1125 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
1126 | "dev": true,
1127 | "license": "MIT",
1128 | "engines": {
1129 | "node": ">=12"
1130 | }
1131 | },
1132 | "node_modules/balanced-match": {
1133 | "version": "1.0.2",
1134 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1135 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1136 | "dev": true,
1137 | "license": "MIT"
1138 | },
1139 | "node_modules/binary-extensions": {
1140 | "version": "2.3.0",
1141 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1142 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1143 | "dev": true,
1144 | "license": "MIT",
1145 | "engines": {
1146 | "node": ">=8"
1147 | },
1148 | "funding": {
1149 | "url": "https://github.com/sponsors/sindresorhus"
1150 | }
1151 | },
1152 | "node_modules/brace-expansion": {
1153 | "version": "2.0.1",
1154 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1155 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1156 | "dev": true,
1157 | "license": "MIT",
1158 | "dependencies": {
1159 | "balanced-match": "^1.0.0"
1160 | }
1161 | },
1162 | "node_modules/braces": {
1163 | "version": "3.0.3",
1164 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1165 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1166 | "dev": true,
1167 | "license": "MIT",
1168 | "dependencies": {
1169 | "fill-range": "^7.1.1"
1170 | },
1171 | "engines": {
1172 | "node": ">=8"
1173 | }
1174 | },
1175 | "node_modules/bundle-require": {
1176 | "version": "5.0.0",
1177 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz",
1178 | "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==",
1179 | "dev": true,
1180 | "license": "MIT",
1181 | "dependencies": {
1182 | "load-tsconfig": "^0.2.3"
1183 | },
1184 | "engines": {
1185 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1186 | },
1187 | "peerDependencies": {
1188 | "esbuild": ">=0.18"
1189 | }
1190 | },
1191 | "node_modules/cac": {
1192 | "version": "6.7.14",
1193 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
1194 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
1195 | "dev": true,
1196 | "license": "MIT",
1197 | "engines": {
1198 | "node": ">=8"
1199 | }
1200 | },
1201 | "node_modules/chai": {
1202 | "version": "5.1.1",
1203 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
1204 | "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
1205 | "dev": true,
1206 | "license": "MIT",
1207 | "dependencies": {
1208 | "assertion-error": "^2.0.1",
1209 | "check-error": "^2.1.1",
1210 | "deep-eql": "^5.0.1",
1211 | "loupe": "^3.1.0",
1212 | "pathval": "^2.0.0"
1213 | },
1214 | "engines": {
1215 | "node": ">=12"
1216 | }
1217 | },
1218 | "node_modules/check-error": {
1219 | "version": "2.1.1",
1220 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
1221 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
1222 | "dev": true,
1223 | "license": "MIT",
1224 | "engines": {
1225 | "node": ">= 16"
1226 | }
1227 | },
1228 | "node_modules/chokidar": {
1229 | "version": "3.6.0",
1230 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1231 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1232 | "dev": true,
1233 | "license": "MIT",
1234 | "dependencies": {
1235 | "anymatch": "~3.1.2",
1236 | "braces": "~3.0.2",
1237 | "glob-parent": "~5.1.2",
1238 | "is-binary-path": "~2.1.0",
1239 | "is-glob": "~4.0.1",
1240 | "normalize-path": "~3.0.0",
1241 | "readdirp": "~3.6.0"
1242 | },
1243 | "engines": {
1244 | "node": ">= 8.10.0"
1245 | },
1246 | "funding": {
1247 | "url": "https://paulmillr.com/funding/"
1248 | },
1249 | "optionalDependencies": {
1250 | "fsevents": "~2.3.2"
1251 | }
1252 | },
1253 | "node_modules/color-convert": {
1254 | "version": "2.0.1",
1255 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1256 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1257 | "dev": true,
1258 | "license": "MIT",
1259 | "dependencies": {
1260 | "color-name": "~1.1.4"
1261 | },
1262 | "engines": {
1263 | "node": ">=7.0.0"
1264 | }
1265 | },
1266 | "node_modules/color-name": {
1267 | "version": "1.1.4",
1268 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1269 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1270 | "dev": true,
1271 | "license": "MIT"
1272 | },
1273 | "node_modules/commander": {
1274 | "version": "4.1.1",
1275 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1276 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1277 | "dev": true,
1278 | "license": "MIT",
1279 | "engines": {
1280 | "node": ">= 6"
1281 | }
1282 | },
1283 | "node_modules/consola": {
1284 | "version": "3.2.3",
1285 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
1286 | "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
1287 | "dev": true,
1288 | "license": "MIT",
1289 | "engines": {
1290 | "node": "^14.18.0 || >=16.10.0"
1291 | }
1292 | },
1293 | "node_modules/cross-spawn": {
1294 | "version": "7.0.3",
1295 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1296 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1297 | "dev": true,
1298 | "license": "MIT",
1299 | "dependencies": {
1300 | "path-key": "^3.1.0",
1301 | "shebang-command": "^2.0.0",
1302 | "which": "^2.0.1"
1303 | },
1304 | "engines": {
1305 | "node": ">= 8"
1306 | }
1307 | },
1308 | "node_modules/csstype": {
1309 | "version": "3.1.3",
1310 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1311 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1312 | "dev": true,
1313 | "license": "MIT"
1314 | },
1315 | "node_modules/debug": {
1316 | "version": "4.3.7",
1317 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1318 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1319 | "dev": true,
1320 | "license": "MIT",
1321 | "dependencies": {
1322 | "ms": "^2.1.3"
1323 | },
1324 | "engines": {
1325 | "node": ">=6.0"
1326 | },
1327 | "peerDependenciesMeta": {
1328 | "supports-color": {
1329 | "optional": true
1330 | }
1331 | }
1332 | },
1333 | "node_modules/deep-eql": {
1334 | "version": "5.0.2",
1335 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
1336 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
1337 | "dev": true,
1338 | "license": "MIT",
1339 | "engines": {
1340 | "node": ">=6"
1341 | }
1342 | },
1343 | "node_modules/dir-glob": {
1344 | "version": "3.0.1",
1345 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
1346 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
1347 | "dev": true,
1348 | "license": "MIT",
1349 | "dependencies": {
1350 | "path-type": "^4.0.0"
1351 | },
1352 | "engines": {
1353 | "node": ">=8"
1354 | }
1355 | },
1356 | "node_modules/eastasianwidth": {
1357 | "version": "0.2.0",
1358 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1359 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1360 | "dev": true,
1361 | "license": "MIT"
1362 | },
1363 | "node_modules/emoji-regex": {
1364 | "version": "9.2.2",
1365 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1366 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1367 | "dev": true,
1368 | "license": "MIT"
1369 | },
1370 | "node_modules/esbuild": {
1371 | "version": "0.23.1",
1372 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz",
1373 | "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==",
1374 | "dev": true,
1375 | "hasInstallScript": true,
1376 | "license": "MIT",
1377 | "bin": {
1378 | "esbuild": "bin/esbuild"
1379 | },
1380 | "engines": {
1381 | "node": ">=18"
1382 | },
1383 | "optionalDependencies": {
1384 | "@esbuild/aix-ppc64": "0.23.1",
1385 | "@esbuild/android-arm": "0.23.1",
1386 | "@esbuild/android-arm64": "0.23.1",
1387 | "@esbuild/android-x64": "0.23.1",
1388 | "@esbuild/darwin-arm64": "0.23.1",
1389 | "@esbuild/darwin-x64": "0.23.1",
1390 | "@esbuild/freebsd-arm64": "0.23.1",
1391 | "@esbuild/freebsd-x64": "0.23.1",
1392 | "@esbuild/linux-arm": "0.23.1",
1393 | "@esbuild/linux-arm64": "0.23.1",
1394 | "@esbuild/linux-ia32": "0.23.1",
1395 | "@esbuild/linux-loong64": "0.23.1",
1396 | "@esbuild/linux-mips64el": "0.23.1",
1397 | "@esbuild/linux-ppc64": "0.23.1",
1398 | "@esbuild/linux-riscv64": "0.23.1",
1399 | "@esbuild/linux-s390x": "0.23.1",
1400 | "@esbuild/linux-x64": "0.23.1",
1401 | "@esbuild/netbsd-x64": "0.23.1",
1402 | "@esbuild/openbsd-arm64": "0.23.1",
1403 | "@esbuild/openbsd-x64": "0.23.1",
1404 | "@esbuild/sunos-x64": "0.23.1",
1405 | "@esbuild/win32-arm64": "0.23.1",
1406 | "@esbuild/win32-ia32": "0.23.1",
1407 | "@esbuild/win32-x64": "0.23.1"
1408 | }
1409 | },
1410 | "node_modules/estree-walker": {
1411 | "version": "3.0.3",
1412 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1413 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1414 | "dev": true,
1415 | "license": "MIT",
1416 | "dependencies": {
1417 | "@types/estree": "^1.0.0"
1418 | }
1419 | },
1420 | "node_modules/execa": {
1421 | "version": "5.1.1",
1422 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
1423 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
1424 | "dev": true,
1425 | "license": "MIT",
1426 | "dependencies": {
1427 | "cross-spawn": "^7.0.3",
1428 | "get-stream": "^6.0.0",
1429 | "human-signals": "^2.1.0",
1430 | "is-stream": "^2.0.0",
1431 | "merge-stream": "^2.0.0",
1432 | "npm-run-path": "^4.0.1",
1433 | "onetime": "^5.1.2",
1434 | "signal-exit": "^3.0.3",
1435 | "strip-final-newline": "^2.0.0"
1436 | },
1437 | "engines": {
1438 | "node": ">=10"
1439 | },
1440 | "funding": {
1441 | "url": "https://github.com/sindresorhus/execa?sponsor=1"
1442 | }
1443 | },
1444 | "node_modules/fast-glob": {
1445 | "version": "3.3.2",
1446 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
1447 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
1448 | "dev": true,
1449 | "license": "MIT",
1450 | "dependencies": {
1451 | "@nodelib/fs.stat": "^2.0.2",
1452 | "@nodelib/fs.walk": "^1.2.3",
1453 | "glob-parent": "^5.1.2",
1454 | "merge2": "^1.3.0",
1455 | "micromatch": "^4.0.4"
1456 | },
1457 | "engines": {
1458 | "node": ">=8.6.0"
1459 | }
1460 | },
1461 | "node_modules/fastq": {
1462 | "version": "1.17.1",
1463 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
1464 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
1465 | "dev": true,
1466 | "license": "ISC",
1467 | "dependencies": {
1468 | "reusify": "^1.0.4"
1469 | }
1470 | },
1471 | "node_modules/fill-range": {
1472 | "version": "7.1.1",
1473 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1474 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1475 | "dev": true,
1476 | "license": "MIT",
1477 | "dependencies": {
1478 | "to-regex-range": "^5.0.1"
1479 | },
1480 | "engines": {
1481 | "node": ">=8"
1482 | }
1483 | },
1484 | "node_modules/foreground-child": {
1485 | "version": "3.3.0",
1486 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
1487 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
1488 | "dev": true,
1489 | "license": "ISC",
1490 | "dependencies": {
1491 | "cross-spawn": "^7.0.0",
1492 | "signal-exit": "^4.0.1"
1493 | },
1494 | "engines": {
1495 | "node": ">=14"
1496 | },
1497 | "funding": {
1498 | "url": "https://github.com/sponsors/isaacs"
1499 | }
1500 | },
1501 | "node_modules/foreground-child/node_modules/signal-exit": {
1502 | "version": "4.1.0",
1503 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1504 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1505 | "dev": true,
1506 | "license": "ISC",
1507 | "engines": {
1508 | "node": ">=14"
1509 | },
1510 | "funding": {
1511 | "url": "https://github.com/sponsors/isaacs"
1512 | }
1513 | },
1514 | "node_modules/fsevents": {
1515 | "version": "2.3.3",
1516 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1517 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1518 | "dev": true,
1519 | "hasInstallScript": true,
1520 | "license": "MIT",
1521 | "optional": true,
1522 | "os": [
1523 | "darwin"
1524 | ],
1525 | "engines": {
1526 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1527 | }
1528 | },
1529 | "node_modules/get-func-name": {
1530 | "version": "2.0.2",
1531 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
1532 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
1533 | "dev": true,
1534 | "license": "MIT",
1535 | "engines": {
1536 | "node": "*"
1537 | }
1538 | },
1539 | "node_modules/get-stream": {
1540 | "version": "6.0.1",
1541 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
1542 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
1543 | "dev": true,
1544 | "license": "MIT",
1545 | "engines": {
1546 | "node": ">=10"
1547 | },
1548 | "funding": {
1549 | "url": "https://github.com/sponsors/sindresorhus"
1550 | }
1551 | },
1552 | "node_modules/glob": {
1553 | "version": "10.4.5",
1554 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
1555 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
1556 | "dev": true,
1557 | "license": "ISC",
1558 | "dependencies": {
1559 | "foreground-child": "^3.1.0",
1560 | "jackspeak": "^3.1.2",
1561 | "minimatch": "^9.0.4",
1562 | "minipass": "^7.1.2",
1563 | "package-json-from-dist": "^1.0.0",
1564 | "path-scurry": "^1.11.1"
1565 | },
1566 | "bin": {
1567 | "glob": "dist/esm/bin.mjs"
1568 | },
1569 | "funding": {
1570 | "url": "https://github.com/sponsors/isaacs"
1571 | }
1572 | },
1573 | "node_modules/glob-parent": {
1574 | "version": "5.1.2",
1575 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1576 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1577 | "dev": true,
1578 | "license": "ISC",
1579 | "dependencies": {
1580 | "is-glob": "^4.0.1"
1581 | },
1582 | "engines": {
1583 | "node": ">= 6"
1584 | }
1585 | },
1586 | "node_modules/globby": {
1587 | "version": "11.1.0",
1588 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1589 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1590 | "dev": true,
1591 | "license": "MIT",
1592 | "dependencies": {
1593 | "array-union": "^2.1.0",
1594 | "dir-glob": "^3.0.1",
1595 | "fast-glob": "^3.2.9",
1596 | "ignore": "^5.2.0",
1597 | "merge2": "^1.4.1",
1598 | "slash": "^3.0.0"
1599 | },
1600 | "engines": {
1601 | "node": ">=10"
1602 | },
1603 | "funding": {
1604 | "url": "https://github.com/sponsors/sindresorhus"
1605 | }
1606 | },
1607 | "node_modules/human-signals": {
1608 | "version": "2.1.0",
1609 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1610 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1611 | "dev": true,
1612 | "license": "Apache-2.0",
1613 | "engines": {
1614 | "node": ">=10.17.0"
1615 | }
1616 | },
1617 | "node_modules/ignore": {
1618 | "version": "5.3.2",
1619 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
1620 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
1621 | "dev": true,
1622 | "license": "MIT",
1623 | "engines": {
1624 | "node": ">= 4"
1625 | }
1626 | },
1627 | "node_modules/is-binary-path": {
1628 | "version": "2.1.0",
1629 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1630 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1631 | "dev": true,
1632 | "license": "MIT",
1633 | "dependencies": {
1634 | "binary-extensions": "^2.0.0"
1635 | },
1636 | "engines": {
1637 | "node": ">=8"
1638 | }
1639 | },
1640 | "node_modules/is-extglob": {
1641 | "version": "2.1.1",
1642 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1643 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1644 | "dev": true,
1645 | "license": "MIT",
1646 | "engines": {
1647 | "node": ">=0.10.0"
1648 | }
1649 | },
1650 | "node_modules/is-fullwidth-code-point": {
1651 | "version": "3.0.0",
1652 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1653 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1654 | "dev": true,
1655 | "license": "MIT",
1656 | "engines": {
1657 | "node": ">=8"
1658 | }
1659 | },
1660 | "node_modules/is-glob": {
1661 | "version": "4.0.3",
1662 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1663 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1664 | "dev": true,
1665 | "license": "MIT",
1666 | "dependencies": {
1667 | "is-extglob": "^2.1.1"
1668 | },
1669 | "engines": {
1670 | "node": ">=0.10.0"
1671 | }
1672 | },
1673 | "node_modules/is-number": {
1674 | "version": "7.0.0",
1675 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1676 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1677 | "dev": true,
1678 | "license": "MIT",
1679 | "engines": {
1680 | "node": ">=0.12.0"
1681 | }
1682 | },
1683 | "node_modules/is-stream": {
1684 | "version": "2.0.1",
1685 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
1686 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
1687 | "dev": true,
1688 | "license": "MIT",
1689 | "engines": {
1690 | "node": ">=8"
1691 | },
1692 | "funding": {
1693 | "url": "https://github.com/sponsors/sindresorhus"
1694 | }
1695 | },
1696 | "node_modules/isexe": {
1697 | "version": "2.0.0",
1698 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1699 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1700 | "dev": true,
1701 | "license": "ISC"
1702 | },
1703 | "node_modules/jackspeak": {
1704 | "version": "3.4.3",
1705 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
1706 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
1707 | "dev": true,
1708 | "license": "BlueOak-1.0.0",
1709 | "dependencies": {
1710 | "@isaacs/cliui": "^8.0.2"
1711 | },
1712 | "funding": {
1713 | "url": "https://github.com/sponsors/isaacs"
1714 | },
1715 | "optionalDependencies": {
1716 | "@pkgjs/parseargs": "^0.11.0"
1717 | }
1718 | },
1719 | "node_modules/joycon": {
1720 | "version": "3.1.1",
1721 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
1722 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
1723 | "dev": true,
1724 | "license": "MIT",
1725 | "engines": {
1726 | "node": ">=10"
1727 | }
1728 | },
1729 | "node_modules/js-tokens": {
1730 | "version": "4.0.0",
1731 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1732 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1733 | "dev": true,
1734 | "license": "MIT"
1735 | },
1736 | "node_modules/lilconfig": {
1737 | "version": "3.1.2",
1738 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
1739 | "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
1740 | "dev": true,
1741 | "license": "MIT",
1742 | "engines": {
1743 | "node": ">=14"
1744 | },
1745 | "funding": {
1746 | "url": "https://github.com/sponsors/antonk52"
1747 | }
1748 | },
1749 | "node_modules/lines-and-columns": {
1750 | "version": "1.2.4",
1751 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1752 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1753 | "dev": true,
1754 | "license": "MIT"
1755 | },
1756 | "node_modules/load-tsconfig": {
1757 | "version": "0.2.5",
1758 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
1759 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
1760 | "dev": true,
1761 | "license": "MIT",
1762 | "engines": {
1763 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1764 | }
1765 | },
1766 | "node_modules/lodash.sortby": {
1767 | "version": "4.7.0",
1768 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
1769 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
1770 | "dev": true,
1771 | "license": "MIT"
1772 | },
1773 | "node_modules/loose-envify": {
1774 | "version": "1.4.0",
1775 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1776 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1777 | "dev": true,
1778 | "license": "MIT",
1779 | "dependencies": {
1780 | "js-tokens": "^3.0.0 || ^4.0.0"
1781 | },
1782 | "bin": {
1783 | "loose-envify": "cli.js"
1784 | }
1785 | },
1786 | "node_modules/loupe": {
1787 | "version": "3.1.1",
1788 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz",
1789 | "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==",
1790 | "dev": true,
1791 | "license": "MIT",
1792 | "dependencies": {
1793 | "get-func-name": "^2.0.1"
1794 | }
1795 | },
1796 | "node_modules/lru-cache": {
1797 | "version": "10.4.3",
1798 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
1799 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
1800 | "dev": true,
1801 | "license": "ISC"
1802 | },
1803 | "node_modules/magic-string": {
1804 | "version": "0.30.11",
1805 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
1806 | "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
1807 | "dev": true,
1808 | "license": "MIT",
1809 | "dependencies": {
1810 | "@jridgewell/sourcemap-codec": "^1.5.0"
1811 | }
1812 | },
1813 | "node_modules/merge-stream": {
1814 | "version": "2.0.0",
1815 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1816 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1817 | "dev": true,
1818 | "license": "MIT"
1819 | },
1820 | "node_modules/merge2": {
1821 | "version": "1.4.1",
1822 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1823 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1824 | "dev": true,
1825 | "license": "MIT",
1826 | "engines": {
1827 | "node": ">= 8"
1828 | }
1829 | },
1830 | "node_modules/micromatch": {
1831 | "version": "4.0.8",
1832 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1833 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1834 | "dev": true,
1835 | "license": "MIT",
1836 | "dependencies": {
1837 | "braces": "^3.0.3",
1838 | "picomatch": "^2.3.1"
1839 | },
1840 | "engines": {
1841 | "node": ">=8.6"
1842 | }
1843 | },
1844 | "node_modules/mimic-fn": {
1845 | "version": "2.1.0",
1846 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1847 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1848 | "dev": true,
1849 | "license": "MIT",
1850 | "engines": {
1851 | "node": ">=6"
1852 | }
1853 | },
1854 | "node_modules/minimatch": {
1855 | "version": "9.0.5",
1856 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1857 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1858 | "dev": true,
1859 | "license": "ISC",
1860 | "dependencies": {
1861 | "brace-expansion": "^2.0.1"
1862 | },
1863 | "engines": {
1864 | "node": ">=16 || 14 >=14.17"
1865 | },
1866 | "funding": {
1867 | "url": "https://github.com/sponsors/isaacs"
1868 | }
1869 | },
1870 | "node_modules/minipass": {
1871 | "version": "7.1.2",
1872 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
1873 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
1874 | "dev": true,
1875 | "license": "ISC",
1876 | "engines": {
1877 | "node": ">=16 || 14 >=14.17"
1878 | }
1879 | },
1880 | "node_modules/ms": {
1881 | "version": "2.1.3",
1882 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1883 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1884 | "dev": true,
1885 | "license": "MIT"
1886 | },
1887 | "node_modules/mz": {
1888 | "version": "2.7.0",
1889 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1890 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1891 | "dev": true,
1892 | "license": "MIT",
1893 | "dependencies": {
1894 | "any-promise": "^1.0.0",
1895 | "object-assign": "^4.0.1",
1896 | "thenify-all": "^1.0.0"
1897 | }
1898 | },
1899 | "node_modules/nanoid": {
1900 | "version": "3.3.7",
1901 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1902 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1903 | "dev": true,
1904 | "funding": [
1905 | {
1906 | "type": "github",
1907 | "url": "https://github.com/sponsors/ai"
1908 | }
1909 | ],
1910 | "license": "MIT",
1911 | "bin": {
1912 | "nanoid": "bin/nanoid.cjs"
1913 | },
1914 | "engines": {
1915 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1916 | }
1917 | },
1918 | "node_modules/normalize-path": {
1919 | "version": "3.0.0",
1920 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1921 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1922 | "dev": true,
1923 | "license": "MIT",
1924 | "engines": {
1925 | "node": ">=0.10.0"
1926 | }
1927 | },
1928 | "node_modules/npm-run-path": {
1929 | "version": "4.0.1",
1930 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1931 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1932 | "dev": true,
1933 | "license": "MIT",
1934 | "dependencies": {
1935 | "path-key": "^3.0.0"
1936 | },
1937 | "engines": {
1938 | "node": ">=8"
1939 | }
1940 | },
1941 | "node_modules/object-assign": {
1942 | "version": "4.1.1",
1943 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1944 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1945 | "dev": true,
1946 | "license": "MIT",
1947 | "engines": {
1948 | "node": ">=0.10.0"
1949 | }
1950 | },
1951 | "node_modules/onetime": {
1952 | "version": "5.1.2",
1953 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1954 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1955 | "dev": true,
1956 | "license": "MIT",
1957 | "dependencies": {
1958 | "mimic-fn": "^2.1.0"
1959 | },
1960 | "engines": {
1961 | "node": ">=6"
1962 | },
1963 | "funding": {
1964 | "url": "https://github.com/sponsors/sindresorhus"
1965 | }
1966 | },
1967 | "node_modules/package-json-from-dist": {
1968 | "version": "1.0.0",
1969 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
1970 | "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
1971 | "dev": true,
1972 | "license": "BlueOak-1.0.0"
1973 | },
1974 | "node_modules/path-key": {
1975 | "version": "3.1.1",
1976 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1977 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1978 | "dev": true,
1979 | "license": "MIT",
1980 | "engines": {
1981 | "node": ">=8"
1982 | }
1983 | },
1984 | "node_modules/path-scurry": {
1985 | "version": "1.11.1",
1986 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
1987 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
1988 | "dev": true,
1989 | "license": "BlueOak-1.0.0",
1990 | "dependencies": {
1991 | "lru-cache": "^10.2.0",
1992 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1993 | },
1994 | "engines": {
1995 | "node": ">=16 || 14 >=14.18"
1996 | },
1997 | "funding": {
1998 | "url": "https://github.com/sponsors/isaacs"
1999 | }
2000 | },
2001 | "node_modules/path-type": {
2002 | "version": "4.0.0",
2003 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2004 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2005 | "dev": true,
2006 | "license": "MIT",
2007 | "engines": {
2008 | "node": ">=8"
2009 | }
2010 | },
2011 | "node_modules/pathe": {
2012 | "version": "1.1.2",
2013 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
2014 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
2015 | "dev": true,
2016 | "license": "MIT"
2017 | },
2018 | "node_modules/pathval": {
2019 | "version": "2.0.0",
2020 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
2021 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
2022 | "dev": true,
2023 | "license": "MIT",
2024 | "engines": {
2025 | "node": ">= 14.16"
2026 | }
2027 | },
2028 | "node_modules/picocolors": {
2029 | "version": "1.1.0",
2030 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
2031 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
2032 | "dev": true,
2033 | "license": "ISC"
2034 | },
2035 | "node_modules/picomatch": {
2036 | "version": "2.3.1",
2037 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2038 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2039 | "dev": true,
2040 | "license": "MIT",
2041 | "engines": {
2042 | "node": ">=8.6"
2043 | },
2044 | "funding": {
2045 | "url": "https://github.com/sponsors/jonschlinkert"
2046 | }
2047 | },
2048 | "node_modules/pirates": {
2049 | "version": "4.0.6",
2050 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
2051 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
2052 | "dev": true,
2053 | "license": "MIT",
2054 | "engines": {
2055 | "node": ">= 6"
2056 | }
2057 | },
2058 | "node_modules/postcss": {
2059 | "version": "8.4.47",
2060 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
2061 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
2062 | "dev": true,
2063 | "funding": [
2064 | {
2065 | "type": "opencollective",
2066 | "url": "https://opencollective.com/postcss/"
2067 | },
2068 | {
2069 | "type": "tidelift",
2070 | "url": "https://tidelift.com/funding/github/npm/postcss"
2071 | },
2072 | {
2073 | "type": "github",
2074 | "url": "https://github.com/sponsors/ai"
2075 | }
2076 | ],
2077 | "license": "MIT",
2078 | "dependencies": {
2079 | "nanoid": "^3.3.7",
2080 | "picocolors": "^1.1.0",
2081 | "source-map-js": "^1.2.1"
2082 | },
2083 | "engines": {
2084 | "node": "^10 || ^12 || >=14"
2085 | }
2086 | },
2087 | "node_modules/postcss-load-config": {
2088 | "version": "6.0.1",
2089 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
2090 | "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
2091 | "dev": true,
2092 | "funding": [
2093 | {
2094 | "type": "opencollective",
2095 | "url": "https://opencollective.com/postcss/"
2096 | },
2097 | {
2098 | "type": "github",
2099 | "url": "https://github.com/sponsors/ai"
2100 | }
2101 | ],
2102 | "license": "MIT",
2103 | "dependencies": {
2104 | "lilconfig": "^3.1.1"
2105 | },
2106 | "engines": {
2107 | "node": ">= 18"
2108 | },
2109 | "peerDependencies": {
2110 | "jiti": ">=1.21.0",
2111 | "postcss": ">=8.0.9",
2112 | "tsx": "^4.8.1",
2113 | "yaml": "^2.4.2"
2114 | },
2115 | "peerDependenciesMeta": {
2116 | "jiti": {
2117 | "optional": true
2118 | },
2119 | "postcss": {
2120 | "optional": true
2121 | },
2122 | "tsx": {
2123 | "optional": true
2124 | },
2125 | "yaml": {
2126 | "optional": true
2127 | }
2128 | }
2129 | },
2130 | "node_modules/punycode": {
2131 | "version": "2.3.1",
2132 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2133 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2134 | "dev": true,
2135 | "license": "MIT",
2136 | "engines": {
2137 | "node": ">=6"
2138 | }
2139 | },
2140 | "node_modules/queue-microtask": {
2141 | "version": "1.2.3",
2142 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2143 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2144 | "dev": true,
2145 | "funding": [
2146 | {
2147 | "type": "github",
2148 | "url": "https://github.com/sponsors/feross"
2149 | },
2150 | {
2151 | "type": "patreon",
2152 | "url": "https://www.patreon.com/feross"
2153 | },
2154 | {
2155 | "type": "consulting",
2156 | "url": "https://feross.org/support"
2157 | }
2158 | ],
2159 | "license": "MIT"
2160 | },
2161 | "node_modules/react": {
2162 | "version": "18.3.1",
2163 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2164 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2165 | "dev": true,
2166 | "license": "MIT",
2167 | "dependencies": {
2168 | "loose-envify": "^1.1.0"
2169 | },
2170 | "engines": {
2171 | "node": ">=0.10.0"
2172 | }
2173 | },
2174 | "node_modules/readdirp": {
2175 | "version": "3.6.0",
2176 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2177 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2178 | "dev": true,
2179 | "license": "MIT",
2180 | "dependencies": {
2181 | "picomatch": "^2.2.1"
2182 | },
2183 | "engines": {
2184 | "node": ">=8.10.0"
2185 | }
2186 | },
2187 | "node_modules/resolve-from": {
2188 | "version": "5.0.0",
2189 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
2190 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
2191 | "dev": true,
2192 | "license": "MIT",
2193 | "engines": {
2194 | "node": ">=8"
2195 | }
2196 | },
2197 | "node_modules/reusify": {
2198 | "version": "1.0.4",
2199 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2200 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2201 | "dev": true,
2202 | "license": "MIT",
2203 | "engines": {
2204 | "iojs": ">=1.0.0",
2205 | "node": ">=0.10.0"
2206 | }
2207 | },
2208 | "node_modules/rollup": {
2209 | "version": "4.21.3",
2210 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz",
2211 | "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==",
2212 | "dev": true,
2213 | "license": "MIT",
2214 | "dependencies": {
2215 | "@types/estree": "1.0.5"
2216 | },
2217 | "bin": {
2218 | "rollup": "dist/bin/rollup"
2219 | },
2220 | "engines": {
2221 | "node": ">=18.0.0",
2222 | "npm": ">=8.0.0"
2223 | },
2224 | "optionalDependencies": {
2225 | "@rollup/rollup-android-arm-eabi": "4.21.3",
2226 | "@rollup/rollup-android-arm64": "4.21.3",
2227 | "@rollup/rollup-darwin-arm64": "4.21.3",
2228 | "@rollup/rollup-darwin-x64": "4.21.3",
2229 | "@rollup/rollup-linux-arm-gnueabihf": "4.21.3",
2230 | "@rollup/rollup-linux-arm-musleabihf": "4.21.3",
2231 | "@rollup/rollup-linux-arm64-gnu": "4.21.3",
2232 | "@rollup/rollup-linux-arm64-musl": "4.21.3",
2233 | "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3",
2234 | "@rollup/rollup-linux-riscv64-gnu": "4.21.3",
2235 | "@rollup/rollup-linux-s390x-gnu": "4.21.3",
2236 | "@rollup/rollup-linux-x64-gnu": "4.21.3",
2237 | "@rollup/rollup-linux-x64-musl": "4.21.3",
2238 | "@rollup/rollup-win32-arm64-msvc": "4.21.3",
2239 | "@rollup/rollup-win32-ia32-msvc": "4.21.3",
2240 | "@rollup/rollup-win32-x64-msvc": "4.21.3",
2241 | "fsevents": "~2.3.2"
2242 | }
2243 | },
2244 | "node_modules/run-parallel": {
2245 | "version": "1.2.0",
2246 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2247 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2248 | "dev": true,
2249 | "funding": [
2250 | {
2251 | "type": "github",
2252 | "url": "https://github.com/sponsors/feross"
2253 | },
2254 | {
2255 | "type": "patreon",
2256 | "url": "https://www.patreon.com/feross"
2257 | },
2258 | {
2259 | "type": "consulting",
2260 | "url": "https://feross.org/support"
2261 | }
2262 | ],
2263 | "license": "MIT",
2264 | "dependencies": {
2265 | "queue-microtask": "^1.2.2"
2266 | }
2267 | },
2268 | "node_modules/shebang-command": {
2269 | "version": "2.0.0",
2270 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2271 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2272 | "dev": true,
2273 | "license": "MIT",
2274 | "dependencies": {
2275 | "shebang-regex": "^3.0.0"
2276 | },
2277 | "engines": {
2278 | "node": ">=8"
2279 | }
2280 | },
2281 | "node_modules/shebang-regex": {
2282 | "version": "3.0.0",
2283 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2284 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2285 | "dev": true,
2286 | "license": "MIT",
2287 | "engines": {
2288 | "node": ">=8"
2289 | }
2290 | },
2291 | "node_modules/siginfo": {
2292 | "version": "2.0.0",
2293 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
2294 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
2295 | "dev": true,
2296 | "license": "ISC"
2297 | },
2298 | "node_modules/signal-exit": {
2299 | "version": "3.0.7",
2300 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
2301 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
2302 | "dev": true,
2303 | "license": "ISC"
2304 | },
2305 | "node_modules/slash": {
2306 | "version": "3.0.0",
2307 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
2308 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
2309 | "dev": true,
2310 | "license": "MIT",
2311 | "engines": {
2312 | "node": ">=8"
2313 | }
2314 | },
2315 | "node_modules/source-map": {
2316 | "version": "0.8.0-beta.0",
2317 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
2318 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
2319 | "dev": true,
2320 | "license": "BSD-3-Clause",
2321 | "dependencies": {
2322 | "whatwg-url": "^7.0.0"
2323 | },
2324 | "engines": {
2325 | "node": ">= 8"
2326 | }
2327 | },
2328 | "node_modules/source-map-js": {
2329 | "version": "1.2.1",
2330 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2331 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2332 | "dev": true,
2333 | "license": "BSD-3-Clause",
2334 | "engines": {
2335 | "node": ">=0.10.0"
2336 | }
2337 | },
2338 | "node_modules/stackback": {
2339 | "version": "0.0.2",
2340 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
2341 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
2342 | "dev": true,
2343 | "license": "MIT"
2344 | },
2345 | "node_modules/std-env": {
2346 | "version": "3.7.0",
2347 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
2348 | "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
2349 | "dev": true,
2350 | "license": "MIT"
2351 | },
2352 | "node_modules/string-width": {
2353 | "version": "5.1.2",
2354 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2355 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2356 | "dev": true,
2357 | "license": "MIT",
2358 | "dependencies": {
2359 | "eastasianwidth": "^0.2.0",
2360 | "emoji-regex": "^9.2.2",
2361 | "strip-ansi": "^7.0.1"
2362 | },
2363 | "engines": {
2364 | "node": ">=12"
2365 | },
2366 | "funding": {
2367 | "url": "https://github.com/sponsors/sindresorhus"
2368 | }
2369 | },
2370 | "node_modules/string-width-cjs": {
2371 | "name": "string-width",
2372 | "version": "4.2.3",
2373 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2374 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2375 | "dev": true,
2376 | "license": "MIT",
2377 | "dependencies": {
2378 | "emoji-regex": "^8.0.0",
2379 | "is-fullwidth-code-point": "^3.0.0",
2380 | "strip-ansi": "^6.0.1"
2381 | },
2382 | "engines": {
2383 | "node": ">=8"
2384 | }
2385 | },
2386 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
2387 | "version": "5.0.1",
2388 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2389 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2390 | "dev": true,
2391 | "license": "MIT",
2392 | "engines": {
2393 | "node": ">=8"
2394 | }
2395 | },
2396 | "node_modules/string-width-cjs/node_modules/emoji-regex": {
2397 | "version": "8.0.0",
2398 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2399 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2400 | "dev": true,
2401 | "license": "MIT"
2402 | },
2403 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
2404 | "version": "6.0.1",
2405 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2406 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2407 | "dev": true,
2408 | "license": "MIT",
2409 | "dependencies": {
2410 | "ansi-regex": "^5.0.1"
2411 | },
2412 | "engines": {
2413 | "node": ">=8"
2414 | }
2415 | },
2416 | "node_modules/strip-ansi": {
2417 | "version": "7.1.0",
2418 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2419 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2420 | "dev": true,
2421 | "license": "MIT",
2422 | "dependencies": {
2423 | "ansi-regex": "^6.0.1"
2424 | },
2425 | "engines": {
2426 | "node": ">=12"
2427 | },
2428 | "funding": {
2429 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2430 | }
2431 | },
2432 | "node_modules/strip-ansi-cjs": {
2433 | "name": "strip-ansi",
2434 | "version": "6.0.1",
2435 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2436 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2437 | "dev": true,
2438 | "license": "MIT",
2439 | "dependencies": {
2440 | "ansi-regex": "^5.0.1"
2441 | },
2442 | "engines": {
2443 | "node": ">=8"
2444 | }
2445 | },
2446 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2447 | "version": "5.0.1",
2448 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2449 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2450 | "dev": true,
2451 | "license": "MIT",
2452 | "engines": {
2453 | "node": ">=8"
2454 | }
2455 | },
2456 | "node_modules/strip-final-newline": {
2457 | "version": "2.0.0",
2458 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2459 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2460 | "dev": true,
2461 | "license": "MIT",
2462 | "engines": {
2463 | "node": ">=6"
2464 | }
2465 | },
2466 | "node_modules/sucrase": {
2467 | "version": "3.35.0",
2468 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2469 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
2470 | "dev": true,
2471 | "license": "MIT",
2472 | "dependencies": {
2473 | "@jridgewell/gen-mapping": "^0.3.2",
2474 | "commander": "^4.0.0",
2475 | "glob": "^10.3.10",
2476 | "lines-and-columns": "^1.1.6",
2477 | "mz": "^2.7.0",
2478 | "pirates": "^4.0.1",
2479 | "ts-interface-checker": "^0.1.9"
2480 | },
2481 | "bin": {
2482 | "sucrase": "bin/sucrase",
2483 | "sucrase-node": "bin/sucrase-node"
2484 | },
2485 | "engines": {
2486 | "node": ">=16 || 14 >=14.17"
2487 | }
2488 | },
2489 | "node_modules/thenify": {
2490 | "version": "3.3.1",
2491 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2492 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2493 | "dev": true,
2494 | "license": "MIT",
2495 | "dependencies": {
2496 | "any-promise": "^1.0.0"
2497 | }
2498 | },
2499 | "node_modules/thenify-all": {
2500 | "version": "1.6.0",
2501 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2502 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2503 | "dev": true,
2504 | "license": "MIT",
2505 | "dependencies": {
2506 | "thenify": ">= 3.1.0 < 4"
2507 | },
2508 | "engines": {
2509 | "node": ">=0.8"
2510 | }
2511 | },
2512 | "node_modules/tinybench": {
2513 | "version": "2.9.0",
2514 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
2515 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
2516 | "dev": true,
2517 | "license": "MIT"
2518 | },
2519 | "node_modules/tinyexec": {
2520 | "version": "0.3.0",
2521 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
2522 | "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==",
2523 | "dev": true,
2524 | "license": "MIT"
2525 | },
2526 | "node_modules/tinypool": {
2527 | "version": "1.0.1",
2528 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz",
2529 | "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==",
2530 | "dev": true,
2531 | "license": "MIT",
2532 | "engines": {
2533 | "node": "^18.0.0 || >=20.0.0"
2534 | }
2535 | },
2536 | "node_modules/tinyrainbow": {
2537 | "version": "1.2.0",
2538 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
2539 | "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
2540 | "dev": true,
2541 | "license": "MIT",
2542 | "engines": {
2543 | "node": ">=14.0.0"
2544 | }
2545 | },
2546 | "node_modules/tinyspy": {
2547 | "version": "3.0.2",
2548 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
2549 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
2550 | "dev": true,
2551 | "license": "MIT",
2552 | "engines": {
2553 | "node": ">=14.0.0"
2554 | }
2555 | },
2556 | "node_modules/to-regex-range": {
2557 | "version": "5.0.1",
2558 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2559 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2560 | "dev": true,
2561 | "license": "MIT",
2562 | "dependencies": {
2563 | "is-number": "^7.0.0"
2564 | },
2565 | "engines": {
2566 | "node": ">=8.0"
2567 | }
2568 | },
2569 | "node_modules/tr46": {
2570 | "version": "1.0.1",
2571 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
2572 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
2573 | "dev": true,
2574 | "license": "MIT",
2575 | "dependencies": {
2576 | "punycode": "^2.1.0"
2577 | }
2578 | },
2579 | "node_modules/tree-kill": {
2580 | "version": "1.2.2",
2581 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
2582 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
2583 | "dev": true,
2584 | "license": "MIT",
2585 | "bin": {
2586 | "tree-kill": "cli.js"
2587 | }
2588 | },
2589 | "node_modules/ts-interface-checker": {
2590 | "version": "0.1.13",
2591 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2592 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2593 | "dev": true,
2594 | "license": "Apache-2.0"
2595 | },
2596 | "node_modules/tsup": {
2597 | "version": "8.2.4",
2598 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.2.4.tgz",
2599 | "integrity": "sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==",
2600 | "dev": true,
2601 | "license": "MIT",
2602 | "dependencies": {
2603 | "bundle-require": "^5.0.0",
2604 | "cac": "^6.7.14",
2605 | "chokidar": "^3.6.0",
2606 | "consola": "^3.2.3",
2607 | "debug": "^4.3.5",
2608 | "esbuild": "^0.23.0",
2609 | "execa": "^5.1.1",
2610 | "globby": "^11.1.0",
2611 | "joycon": "^3.1.1",
2612 | "picocolors": "^1.0.1",
2613 | "postcss-load-config": "^6.0.1",
2614 | "resolve-from": "^5.0.0",
2615 | "rollup": "^4.19.0",
2616 | "source-map": "0.8.0-beta.0",
2617 | "sucrase": "^3.35.0",
2618 | "tree-kill": "^1.2.2"
2619 | },
2620 | "bin": {
2621 | "tsup": "dist/cli-default.js",
2622 | "tsup-node": "dist/cli-node.js"
2623 | },
2624 | "engines": {
2625 | "node": ">=18"
2626 | },
2627 | "peerDependencies": {
2628 | "@microsoft/api-extractor": "^7.36.0",
2629 | "@swc/core": "^1",
2630 | "postcss": "^8.4.12",
2631 | "typescript": ">=4.5.0"
2632 | },
2633 | "peerDependenciesMeta": {
2634 | "@microsoft/api-extractor": {
2635 | "optional": true
2636 | },
2637 | "@swc/core": {
2638 | "optional": true
2639 | },
2640 | "postcss": {
2641 | "optional": true
2642 | },
2643 | "typescript": {
2644 | "optional": true
2645 | }
2646 | }
2647 | },
2648 | "node_modules/typescript": {
2649 | "version": "5.6.2",
2650 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
2651 | "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
2652 | "dev": true,
2653 | "license": "Apache-2.0",
2654 | "bin": {
2655 | "tsc": "bin/tsc",
2656 | "tsserver": "bin/tsserver"
2657 | },
2658 | "engines": {
2659 | "node": ">=14.17"
2660 | }
2661 | },
2662 | "node_modules/vite": {
2663 | "version": "5.4.5",
2664 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz",
2665 | "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==",
2666 | "dev": true,
2667 | "license": "MIT",
2668 | "dependencies": {
2669 | "esbuild": "^0.21.3",
2670 | "postcss": "^8.4.43",
2671 | "rollup": "^4.20.0"
2672 | },
2673 | "bin": {
2674 | "vite": "bin/vite.js"
2675 | },
2676 | "engines": {
2677 | "node": "^18.0.0 || >=20.0.0"
2678 | },
2679 | "funding": {
2680 | "url": "https://github.com/vitejs/vite?sponsor=1"
2681 | },
2682 | "optionalDependencies": {
2683 | "fsevents": "~2.3.3"
2684 | },
2685 | "peerDependencies": {
2686 | "@types/node": "^18.0.0 || >=20.0.0",
2687 | "less": "*",
2688 | "lightningcss": "^1.21.0",
2689 | "sass": "*",
2690 | "sass-embedded": "*",
2691 | "stylus": "*",
2692 | "sugarss": "*",
2693 | "terser": "^5.4.0"
2694 | },
2695 | "peerDependenciesMeta": {
2696 | "@types/node": {
2697 | "optional": true
2698 | },
2699 | "less": {
2700 | "optional": true
2701 | },
2702 | "lightningcss": {
2703 | "optional": true
2704 | },
2705 | "sass": {
2706 | "optional": true
2707 | },
2708 | "sass-embedded": {
2709 | "optional": true
2710 | },
2711 | "stylus": {
2712 | "optional": true
2713 | },
2714 | "sugarss": {
2715 | "optional": true
2716 | },
2717 | "terser": {
2718 | "optional": true
2719 | }
2720 | }
2721 | },
2722 | "node_modules/vite-node": {
2723 | "version": "2.1.1",
2724 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz",
2725 | "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==",
2726 | "dev": true,
2727 | "license": "MIT",
2728 | "dependencies": {
2729 | "cac": "^6.7.14",
2730 | "debug": "^4.3.6",
2731 | "pathe": "^1.1.2",
2732 | "vite": "^5.0.0"
2733 | },
2734 | "bin": {
2735 | "vite-node": "vite-node.mjs"
2736 | },
2737 | "engines": {
2738 | "node": "^18.0.0 || >=20.0.0"
2739 | },
2740 | "funding": {
2741 | "url": "https://opencollective.com/vitest"
2742 | }
2743 | },
2744 | "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
2745 | "version": "0.21.5",
2746 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
2747 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
2748 | "cpu": [
2749 | "ppc64"
2750 | ],
2751 | "dev": true,
2752 | "license": "MIT",
2753 | "optional": true,
2754 | "os": [
2755 | "aix"
2756 | ],
2757 | "engines": {
2758 | "node": ">=12"
2759 | }
2760 | },
2761 | "node_modules/vite/node_modules/@esbuild/android-arm": {
2762 | "version": "0.21.5",
2763 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
2764 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
2765 | "cpu": [
2766 | "arm"
2767 | ],
2768 | "dev": true,
2769 | "license": "MIT",
2770 | "optional": true,
2771 | "os": [
2772 | "android"
2773 | ],
2774 | "engines": {
2775 | "node": ">=12"
2776 | }
2777 | },
2778 | "node_modules/vite/node_modules/@esbuild/android-arm64": {
2779 | "version": "0.21.5",
2780 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
2781 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
2782 | "cpu": [
2783 | "arm64"
2784 | ],
2785 | "dev": true,
2786 | "license": "MIT",
2787 | "optional": true,
2788 | "os": [
2789 | "android"
2790 | ],
2791 | "engines": {
2792 | "node": ">=12"
2793 | }
2794 | },
2795 | "node_modules/vite/node_modules/@esbuild/android-x64": {
2796 | "version": "0.21.5",
2797 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
2798 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
2799 | "cpu": [
2800 | "x64"
2801 | ],
2802 | "dev": true,
2803 | "license": "MIT",
2804 | "optional": true,
2805 | "os": [
2806 | "android"
2807 | ],
2808 | "engines": {
2809 | "node": ">=12"
2810 | }
2811 | },
2812 | "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
2813 | "version": "0.21.5",
2814 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
2815 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
2816 | "cpu": [
2817 | "arm64"
2818 | ],
2819 | "dev": true,
2820 | "license": "MIT",
2821 | "optional": true,
2822 | "os": [
2823 | "darwin"
2824 | ],
2825 | "engines": {
2826 | "node": ">=12"
2827 | }
2828 | },
2829 | "node_modules/vite/node_modules/@esbuild/darwin-x64": {
2830 | "version": "0.21.5",
2831 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
2832 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
2833 | "cpu": [
2834 | "x64"
2835 | ],
2836 | "dev": true,
2837 | "license": "MIT",
2838 | "optional": true,
2839 | "os": [
2840 | "darwin"
2841 | ],
2842 | "engines": {
2843 | "node": ">=12"
2844 | }
2845 | },
2846 | "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
2847 | "version": "0.21.5",
2848 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
2849 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
2850 | "cpu": [
2851 | "arm64"
2852 | ],
2853 | "dev": true,
2854 | "license": "MIT",
2855 | "optional": true,
2856 | "os": [
2857 | "freebsd"
2858 | ],
2859 | "engines": {
2860 | "node": ">=12"
2861 | }
2862 | },
2863 | "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
2864 | "version": "0.21.5",
2865 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
2866 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
2867 | "cpu": [
2868 | "x64"
2869 | ],
2870 | "dev": true,
2871 | "license": "MIT",
2872 | "optional": true,
2873 | "os": [
2874 | "freebsd"
2875 | ],
2876 | "engines": {
2877 | "node": ">=12"
2878 | }
2879 | },
2880 | "node_modules/vite/node_modules/@esbuild/linux-arm": {
2881 | "version": "0.21.5",
2882 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
2883 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
2884 | "cpu": [
2885 | "arm"
2886 | ],
2887 | "dev": true,
2888 | "license": "MIT",
2889 | "optional": true,
2890 | "os": [
2891 | "linux"
2892 | ],
2893 | "engines": {
2894 | "node": ">=12"
2895 | }
2896 | },
2897 | "node_modules/vite/node_modules/@esbuild/linux-arm64": {
2898 | "version": "0.21.5",
2899 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
2900 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
2901 | "cpu": [
2902 | "arm64"
2903 | ],
2904 | "dev": true,
2905 | "license": "MIT",
2906 | "optional": true,
2907 | "os": [
2908 | "linux"
2909 | ],
2910 | "engines": {
2911 | "node": ">=12"
2912 | }
2913 | },
2914 | "node_modules/vite/node_modules/@esbuild/linux-ia32": {
2915 | "version": "0.21.5",
2916 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
2917 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
2918 | "cpu": [
2919 | "ia32"
2920 | ],
2921 | "dev": true,
2922 | "license": "MIT",
2923 | "optional": true,
2924 | "os": [
2925 | "linux"
2926 | ],
2927 | "engines": {
2928 | "node": ">=12"
2929 | }
2930 | },
2931 | "node_modules/vite/node_modules/@esbuild/linux-loong64": {
2932 | "version": "0.21.5",
2933 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
2934 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
2935 | "cpu": [
2936 | "loong64"
2937 | ],
2938 | "dev": true,
2939 | "license": "MIT",
2940 | "optional": true,
2941 | "os": [
2942 | "linux"
2943 | ],
2944 | "engines": {
2945 | "node": ">=12"
2946 | }
2947 | },
2948 | "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
2949 | "version": "0.21.5",
2950 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
2951 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
2952 | "cpu": [
2953 | "mips64el"
2954 | ],
2955 | "dev": true,
2956 | "license": "MIT",
2957 | "optional": true,
2958 | "os": [
2959 | "linux"
2960 | ],
2961 | "engines": {
2962 | "node": ">=12"
2963 | }
2964 | },
2965 | "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
2966 | "version": "0.21.5",
2967 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
2968 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
2969 | "cpu": [
2970 | "ppc64"
2971 | ],
2972 | "dev": true,
2973 | "license": "MIT",
2974 | "optional": true,
2975 | "os": [
2976 | "linux"
2977 | ],
2978 | "engines": {
2979 | "node": ">=12"
2980 | }
2981 | },
2982 | "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
2983 | "version": "0.21.5",
2984 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
2985 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
2986 | "cpu": [
2987 | "riscv64"
2988 | ],
2989 | "dev": true,
2990 | "license": "MIT",
2991 | "optional": true,
2992 | "os": [
2993 | "linux"
2994 | ],
2995 | "engines": {
2996 | "node": ">=12"
2997 | }
2998 | },
2999 | "node_modules/vite/node_modules/@esbuild/linux-s390x": {
3000 | "version": "0.21.5",
3001 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
3002 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
3003 | "cpu": [
3004 | "s390x"
3005 | ],
3006 | "dev": true,
3007 | "license": "MIT",
3008 | "optional": true,
3009 | "os": [
3010 | "linux"
3011 | ],
3012 | "engines": {
3013 | "node": ">=12"
3014 | }
3015 | },
3016 | "node_modules/vite/node_modules/@esbuild/linux-x64": {
3017 | "version": "0.21.5",
3018 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
3019 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
3020 | "cpu": [
3021 | "x64"
3022 | ],
3023 | "dev": true,
3024 | "license": "MIT",
3025 | "optional": true,
3026 | "os": [
3027 | "linux"
3028 | ],
3029 | "engines": {
3030 | "node": ">=12"
3031 | }
3032 | },
3033 | "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
3034 | "version": "0.21.5",
3035 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
3036 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
3037 | "cpu": [
3038 | "x64"
3039 | ],
3040 | "dev": true,
3041 | "license": "MIT",
3042 | "optional": true,
3043 | "os": [
3044 | "netbsd"
3045 | ],
3046 | "engines": {
3047 | "node": ">=12"
3048 | }
3049 | },
3050 | "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
3051 | "version": "0.21.5",
3052 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
3053 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
3054 | "cpu": [
3055 | "x64"
3056 | ],
3057 | "dev": true,
3058 | "license": "MIT",
3059 | "optional": true,
3060 | "os": [
3061 | "openbsd"
3062 | ],
3063 | "engines": {
3064 | "node": ">=12"
3065 | }
3066 | },
3067 | "node_modules/vite/node_modules/@esbuild/sunos-x64": {
3068 | "version": "0.21.5",
3069 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
3070 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
3071 | "cpu": [
3072 | "x64"
3073 | ],
3074 | "dev": true,
3075 | "license": "MIT",
3076 | "optional": true,
3077 | "os": [
3078 | "sunos"
3079 | ],
3080 | "engines": {
3081 | "node": ">=12"
3082 | }
3083 | },
3084 | "node_modules/vite/node_modules/@esbuild/win32-arm64": {
3085 | "version": "0.21.5",
3086 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
3087 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
3088 | "cpu": [
3089 | "arm64"
3090 | ],
3091 | "dev": true,
3092 | "license": "MIT",
3093 | "optional": true,
3094 | "os": [
3095 | "win32"
3096 | ],
3097 | "engines": {
3098 | "node": ">=12"
3099 | }
3100 | },
3101 | "node_modules/vite/node_modules/@esbuild/win32-ia32": {
3102 | "version": "0.21.5",
3103 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
3104 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
3105 | "cpu": [
3106 | "ia32"
3107 | ],
3108 | "dev": true,
3109 | "license": "MIT",
3110 | "optional": true,
3111 | "os": [
3112 | "win32"
3113 | ],
3114 | "engines": {
3115 | "node": ">=12"
3116 | }
3117 | },
3118 | "node_modules/vite/node_modules/@esbuild/win32-x64": {
3119 | "version": "0.21.5",
3120 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
3121 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
3122 | "cpu": [
3123 | "x64"
3124 | ],
3125 | "dev": true,
3126 | "license": "MIT",
3127 | "optional": true,
3128 | "os": [
3129 | "win32"
3130 | ],
3131 | "engines": {
3132 | "node": ">=12"
3133 | }
3134 | },
3135 | "node_modules/vite/node_modules/esbuild": {
3136 | "version": "0.21.5",
3137 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
3138 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
3139 | "dev": true,
3140 | "hasInstallScript": true,
3141 | "license": "MIT",
3142 | "bin": {
3143 | "esbuild": "bin/esbuild"
3144 | },
3145 | "engines": {
3146 | "node": ">=12"
3147 | },
3148 | "optionalDependencies": {
3149 | "@esbuild/aix-ppc64": "0.21.5",
3150 | "@esbuild/android-arm": "0.21.5",
3151 | "@esbuild/android-arm64": "0.21.5",
3152 | "@esbuild/android-x64": "0.21.5",
3153 | "@esbuild/darwin-arm64": "0.21.5",
3154 | "@esbuild/darwin-x64": "0.21.5",
3155 | "@esbuild/freebsd-arm64": "0.21.5",
3156 | "@esbuild/freebsd-x64": "0.21.5",
3157 | "@esbuild/linux-arm": "0.21.5",
3158 | "@esbuild/linux-arm64": "0.21.5",
3159 | "@esbuild/linux-ia32": "0.21.5",
3160 | "@esbuild/linux-loong64": "0.21.5",
3161 | "@esbuild/linux-mips64el": "0.21.5",
3162 | "@esbuild/linux-ppc64": "0.21.5",
3163 | "@esbuild/linux-riscv64": "0.21.5",
3164 | "@esbuild/linux-s390x": "0.21.5",
3165 | "@esbuild/linux-x64": "0.21.5",
3166 | "@esbuild/netbsd-x64": "0.21.5",
3167 | "@esbuild/openbsd-x64": "0.21.5",
3168 | "@esbuild/sunos-x64": "0.21.5",
3169 | "@esbuild/win32-arm64": "0.21.5",
3170 | "@esbuild/win32-ia32": "0.21.5",
3171 | "@esbuild/win32-x64": "0.21.5"
3172 | }
3173 | },
3174 | "node_modules/vitest": {
3175 | "version": "2.1.1",
3176 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz",
3177 | "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==",
3178 | "dev": true,
3179 | "license": "MIT",
3180 | "dependencies": {
3181 | "@vitest/expect": "2.1.1",
3182 | "@vitest/mocker": "2.1.1",
3183 | "@vitest/pretty-format": "^2.1.1",
3184 | "@vitest/runner": "2.1.1",
3185 | "@vitest/snapshot": "2.1.1",
3186 | "@vitest/spy": "2.1.1",
3187 | "@vitest/utils": "2.1.1",
3188 | "chai": "^5.1.1",
3189 | "debug": "^4.3.6",
3190 | "magic-string": "^0.30.11",
3191 | "pathe": "^1.1.2",
3192 | "std-env": "^3.7.0",
3193 | "tinybench": "^2.9.0",
3194 | "tinyexec": "^0.3.0",
3195 | "tinypool": "^1.0.0",
3196 | "tinyrainbow": "^1.2.0",
3197 | "vite": "^5.0.0",
3198 | "vite-node": "2.1.1",
3199 | "why-is-node-running": "^2.3.0"
3200 | },
3201 | "bin": {
3202 | "vitest": "vitest.mjs"
3203 | },
3204 | "engines": {
3205 | "node": "^18.0.0 || >=20.0.0"
3206 | },
3207 | "funding": {
3208 | "url": "https://opencollective.com/vitest"
3209 | },
3210 | "peerDependencies": {
3211 | "@edge-runtime/vm": "*",
3212 | "@types/node": "^18.0.0 || >=20.0.0",
3213 | "@vitest/browser": "2.1.1",
3214 | "@vitest/ui": "2.1.1",
3215 | "happy-dom": "*",
3216 | "jsdom": "*"
3217 | },
3218 | "peerDependenciesMeta": {
3219 | "@edge-runtime/vm": {
3220 | "optional": true
3221 | },
3222 | "@types/node": {
3223 | "optional": true
3224 | },
3225 | "@vitest/browser": {
3226 | "optional": true
3227 | },
3228 | "@vitest/ui": {
3229 | "optional": true
3230 | },
3231 | "happy-dom": {
3232 | "optional": true
3233 | },
3234 | "jsdom": {
3235 | "optional": true
3236 | }
3237 | }
3238 | },
3239 | "node_modules/webidl-conversions": {
3240 | "version": "4.0.2",
3241 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
3242 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
3243 | "dev": true,
3244 | "license": "BSD-2-Clause"
3245 | },
3246 | "node_modules/whatwg-url": {
3247 | "version": "7.1.0",
3248 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
3249 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
3250 | "dev": true,
3251 | "license": "MIT",
3252 | "dependencies": {
3253 | "lodash.sortby": "^4.7.0",
3254 | "tr46": "^1.0.1",
3255 | "webidl-conversions": "^4.0.2"
3256 | }
3257 | },
3258 | "node_modules/which": {
3259 | "version": "2.0.2",
3260 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3261 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3262 | "dev": true,
3263 | "license": "ISC",
3264 | "dependencies": {
3265 | "isexe": "^2.0.0"
3266 | },
3267 | "bin": {
3268 | "node-which": "bin/node-which"
3269 | },
3270 | "engines": {
3271 | "node": ">= 8"
3272 | }
3273 | },
3274 | "node_modules/why-is-node-running": {
3275 | "version": "2.3.0",
3276 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
3277 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
3278 | "dev": true,
3279 | "license": "MIT",
3280 | "dependencies": {
3281 | "siginfo": "^2.0.0",
3282 | "stackback": "0.0.2"
3283 | },
3284 | "bin": {
3285 | "why-is-node-running": "cli.js"
3286 | },
3287 | "engines": {
3288 | "node": ">=8"
3289 | }
3290 | },
3291 | "node_modules/wrap-ansi": {
3292 | "version": "8.1.0",
3293 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
3294 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
3295 | "dev": true,
3296 | "license": "MIT",
3297 | "dependencies": {
3298 | "ansi-styles": "^6.1.0",
3299 | "string-width": "^5.0.1",
3300 | "strip-ansi": "^7.0.1"
3301 | },
3302 | "engines": {
3303 | "node": ">=12"
3304 | },
3305 | "funding": {
3306 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3307 | }
3308 | },
3309 | "node_modules/wrap-ansi-cjs": {
3310 | "name": "wrap-ansi",
3311 | "version": "7.0.0",
3312 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3313 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3314 | "dev": true,
3315 | "license": "MIT",
3316 | "dependencies": {
3317 | "ansi-styles": "^4.0.0",
3318 | "string-width": "^4.1.0",
3319 | "strip-ansi": "^6.0.0"
3320 | },
3321 | "engines": {
3322 | "node": ">=10"
3323 | },
3324 | "funding": {
3325 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3326 | }
3327 | },
3328 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
3329 | "version": "5.0.1",
3330 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3331 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3332 | "dev": true,
3333 | "license": "MIT",
3334 | "engines": {
3335 | "node": ">=8"
3336 | }
3337 | },
3338 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
3339 | "version": "4.3.0",
3340 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3341 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3342 | "dev": true,
3343 | "license": "MIT",
3344 | "dependencies": {
3345 | "color-convert": "^2.0.1"
3346 | },
3347 | "engines": {
3348 | "node": ">=8"
3349 | },
3350 | "funding": {
3351 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3352 | }
3353 | },
3354 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
3355 | "version": "8.0.0",
3356 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3357 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3358 | "dev": true,
3359 | "license": "MIT"
3360 | },
3361 | "node_modules/wrap-ansi-cjs/node_modules/string-width": {
3362 | "version": "4.2.3",
3363 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3364 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3365 | "dev": true,
3366 | "license": "MIT",
3367 | "dependencies": {
3368 | "emoji-regex": "^8.0.0",
3369 | "is-fullwidth-code-point": "^3.0.0",
3370 | "strip-ansi": "^6.0.1"
3371 | },
3372 | "engines": {
3373 | "node": ">=8"
3374 | }
3375 | },
3376 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
3377 | "version": "6.0.1",
3378 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3379 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3380 | "dev": true,
3381 | "license": "MIT",
3382 | "dependencies": {
3383 | "ansi-regex": "^5.0.1"
3384 | },
3385 | "engines": {
3386 | "node": ">=8"
3387 | }
3388 | },
3389 | "node_modules/wrap-ansi/node_modules/ansi-styles": {
3390 | "version": "6.2.1",
3391 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
3392 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
3393 | "dev": true,
3394 | "license": "MIT",
3395 | "engines": {
3396 | "node": ">=12"
3397 | },
3398 | "funding": {
3399 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3400 | }
3401 | }
3402 | }
3403 | }
3404 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "holy-loader",
3 | "version": "2.3.13",
4 | "description": "Holy Loader is a lightweight, customizable top-loading progress bar component for React applications.",
5 | "type": "module",
6 | "main": "./dist/index.cjs",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "license": "MIT",
10 | "keywords": [
11 | "react",
12 | "react-loader",
13 | "progress-bar",
14 | "loading-indicator",
15 | "nprogress",
16 | "react-progress-bar",
17 | "web-performance",
18 | "user-interface",
19 | "top-loader",
20 | "loading-bar",
21 | "ui-components",
22 | "react-ui",
23 | "react-component",
24 | "front-end",
25 | "website-interactivity",
26 | "asynchronous-loading",
27 | "page-load",
28 | "nextjs",
29 | "single-page-application"
30 | ],
31 | "exports": {
32 | "import": {
33 | "types": "./dist/index.d.ts",
34 | "import": "./dist/index.js"
35 | },
36 | "require": {
37 | "types": "./dist/index.d.cts",
38 | "require": "./dist/index.cjs"
39 | }
40 | },
41 | "scripts": {
42 | "build": "tsup",
43 | "lint": "biome check --write",
44 | "test": "vitest -c ./vitest.config.ts"
45 | },
46 | "files": [
47 | "dist/**/*.js*",
48 | "dist/**/*.cjs*",
49 | "dist/**/*.mjs*",
50 | "dist/**/*.d*"
51 | ],
52 | "bugs": {
53 | "url": "https://github.com/tomcru/holy-loader/issues"
54 | },
55 | "homepage": "https://github.com/tomcru/holy-loader#readme",
56 | "repository": {
57 | "type": "git",
58 | "url": "git+https://github.com/tomcru/holy-loader.git"
59 | },
60 | "author": {
61 | "name": "Tom Rumpf",
62 | "email": "hello@tomrumpf.com",
63 | "url": "https://github.com/tomcru"
64 | },
65 | "peerDependencies": {
66 | "react": ">= 16.0.0"
67 | },
68 | "devDependencies": {
69 | "@biomejs/biome": "^1.9.0",
70 | "@types/react": "^18.2.43",
71 | "react": "^18.2.0",
72 | "tsup": "^8.0.1",
73 | "typescript": "^5.6.2",
74 | "vitest": "^2.1.1"
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/HolyProgress.ts:
--------------------------------------------------------------------------------
1 | import { DEFAULTS } from './constants';
2 | import { clamp, queue, repaintElement } from './utils';
3 |
4 | type HolyProgressProps = {
5 | /**
6 | * Specifies the minimum value for the progress bar to start at.
7 | * Default: 0.08 (8% of the total width)
8 | */
9 | initialPosition: number;
10 |
11 | /**
12 | * Specifies the CSS easing type for the progress bar animation.
13 | * Default: 'linear'
14 | */
15 | easing: string;
16 |
17 | /**
18 | * Specifies the speed of the progress bar animation in milliseconds.
19 | * Default: 200
20 | */
21 | speed: number;
22 |
23 | /**
24 | * Specifies the color of the progress bar.
25 | * Default: '#59a2ff'
26 | */
27 | color: string;
28 |
29 | /**
30 | * Specifies the height of the progress bar in either pixels (number) or css unit (string).
31 | * Default: 4
32 | */
33 | height: number | string;
34 |
35 | /**
36 | * Specifies the z-index of the progress bar.
37 | * Default: 2147483647
38 | */
39 | zIndex: number;
40 |
41 | /**
42 | * Specifies the shadow effect to be applied to the progress bar.
43 | * For example: "0 0 10px #59a2ff, 0 0 5px #59a2ff"
44 | */
45 | boxShadow?: string;
46 |
47 | /**
48 | * Specifies whether to accompany the loading bar with a spinner.
49 | * Default: false
50 | */
51 | showSpinner?: boolean;
52 |
53 | /**
54 | * Specifies the direction of the loading bar.
55 | * Default: "ltr"
56 | */
57 | dir?: 'ltr' | 'rtl';
58 | };
59 |
60 | type TransformStrategy = 'translate3d' | 'translate' | 'margin';
61 |
62 | /**
63 | * Class representing a HolyProgress bar.
64 | * @class
65 | * @classdesc A flexible, customizable progress bar for web applications.
66 | */
67 | export class HolyProgress {
68 | private readonly settings: HolyProgressProps;
69 |
70 | /**
71 | * The progres of the bar as a number between 0 and 1.
72 | * If 0 is reached, the status is null
73 | */
74 | private progressN: number | null;
75 |
76 | private bar: HTMLElement | null;
77 |
78 | /**
79 | * Create a HolyProgress instance.
80 | * @param {Partial} [customSettings] - Optional custom settings to override defaults.
81 | */
82 | constructor(customSettings?: Partial) {
83 | this.settings = { ...DEFAULTS, ...customSettings };
84 | this.progressN = null;
85 | this.bar = null;
86 | }
87 |
88 | /**
89 | * Sets the progress to a specific value.
90 | * @private
91 | * @param {number} n - The new progress value (0 to 1).
92 | * @returns {HolyProgress} The current instance for chaining methods.
93 | */
94 | private readonly setTo = (n: number): HolyProgress => {
95 | const isStarted = typeof this.progressN === 'number';
96 |
97 | n = clamp(n, this.settings.initialPosition, 1);
98 |
99 | this.progressN = n === 1 ? null : n;
100 |
101 | const progressBar = this.getOrCreateBar(!isStarted);
102 |
103 | if (!progressBar) {
104 | return this;
105 | }
106 |
107 | repaintElement(progressBar);
108 |
109 | queue((next) => {
110 | if (!this.bar) {
111 | return;
112 | }
113 |
114 | Object.assign(this.bar.style, this.barPositionCSS(n), {
115 | transition: `all ${this.settings.speed}ms ${this.settings.easing}`,
116 | });
117 |
118 | if (n === 1) {
119 | progressBar.style.transition = 'none';
120 | progressBar.style.opacity = '1';
121 | repaintElement(progressBar);
122 |
123 | setTimeout(() => {
124 | progressBar.style.transition = `all ${this.settings.speed}ms linear`;
125 | progressBar.style.opacity = '0';
126 | setTimeout(() => {
127 | this.removeBarFromDOM();
128 | next();
129 | }, this.settings.speed);
130 |
131 | this.removeSpinnerFromDOM();
132 | }, this.settings.speed);
133 | } else {
134 | setTimeout(next, this.settings.speed);
135 | }
136 | });
137 | return this;
138 | };
139 |
140 | /**
141 | * Converts a progress value (0 to 1) into a percentage representation.
142 | * Used for calculating the visual width of the progress bar.
143 | * @private
144 | * @param {number} n - The progress value to convert.
145 | * @returns {number} The percentage representation of the progress value.
146 | */
147 | private readonly toBarPercentage = (n: number): number =>
148 | this.settings.dir === 'ltr' ? (-1 + n) * 100 : (1 - n) * 100;
149 |
150 | /**
151 | * Initiates the progress bar's movement. If already started, it continues from the current position.
152 | * Automatically handles automatic incrementation ('trickle') if enabled.
153 | * @public
154 | * @returns {HolyProgress} The current instance for chaining methods.
155 | */
156 | public readonly start = (): HolyProgress => {
157 | if (this.progressN === null) {
158 | this.setTo(0);
159 |
160 | this.startTrickle();
161 |
162 | if (this.settings.showSpinner === true) {
163 | this.createSpinner();
164 | }
165 | }
166 |
167 | return this;
168 | };
169 |
170 | /**
171 | * Performs automatic incrementation of the progress bar.
172 | * This function is recursive and continues to increment the progress at intervals defined by `speed`.
173 | * @private
174 | */
175 | private readonly startTrickle = (): void => {
176 | const run = (): void => {
177 | if (this.progressN === null) return;
178 |
179 | this.incrementStatus();
180 | setTimeout(run, this.settings.speed);
181 | };
182 |
183 | setTimeout(run, this.settings.speed);
184 | };
185 |
186 | /**
187 | * Completes the progress, moving it to 100%
188 | * @public
189 | * @returns {HolyProgress} The current instance for chaining methods.
190 | */
191 | public readonly complete = (): HolyProgress => this.setTo(1);
192 |
193 | /**
194 | * Calculates an increment value based on the current status of the progress.
195 | * This is used to determine the amount of progress to add during automatic incrementation.
196 | * @private
197 | * @param {number} status - The current progress status.
198 | * @returns {number} The calculated increment value.
199 | */
200 | private readonly calculateIncrement = (status: number): number => {
201 | const base = 0.1;
202 | const scale = 5;
203 | return base * Math.exp(-scale * status);
204 | };
205 |
206 | /**
207 | * Increments the progress bar by a specified amount, or by an amount determined by `calculateIncrement` if not specified.
208 | * @private
209 | * @param {number} [amount] - The amount to increment the progress bar.
210 | * @returns {HolyProgress} The current instance for chaining methods.
211 | */
212 | private readonly incrementStatus = (amount?: number): HolyProgress => {
213 | if (this.progressN === null) {
214 | return this.start();
215 | }
216 |
217 | if (this.progressN > 1) {
218 | return this;
219 | }
220 |
221 | if (typeof amount !== 'number') {
222 | amount = this.calculateIncrement(this.progressN);
223 | }
224 |
225 | /**
226 | * Do not clamp to 1 - the progress bar can only fully finish by being set to 1 by the user.
227 | * This prevents the progress bar completing itself by incrementing to 1 before an action has been completed or a page loaded.
228 | */
229 | this.progressN = clamp(this.progressN + amount, 0, 0.994);
230 |
231 | return this.setTo(this.progressN);
232 | };
233 |
234 | /**
235 | * Creates and initializes a new progress bar element in the DOM.
236 | * It sets up the necessary styles and appends the element to the document body.
237 | * @private
238 | * @param {boolean} fromStart - Indicates if the bar is created from the start position.
239 | * @returns {HTMLElement | null} The created progress bar element, or null if creation fails.
240 | */
241 | private readonly createBar = (fromStart: boolean): HTMLElement | null => {
242 | const barContainer = document.createElement('div');
243 | barContainer.id = 'holy-progress';
244 | barContainer.style.pointerEvents = 'none';
245 | barContainer.innerHTML = '';
246 |
247 | this.bar = barContainer.querySelector(
248 | '[role="bar"]',
249 | ) satisfies HTMLElement | null;
250 |
251 | if (!this.bar) {
252 | return null;
253 | }
254 |
255 | const percentage = this.toBarPercentage(
256 | fromStart ? 0 : (this.progressN ?? 0),
257 | );
258 |
259 | this.bar.style.background = this.settings.color;
260 | if (typeof this.settings.height === 'number') {
261 | this.bar.style.height = `${this.settings.height}px`;
262 | } else {
263 | this.bar.style.height = this.settings.height;
264 | }
265 | this.bar.style.zIndex = this.settings.zIndex.toString();
266 | this.bar.style.position = 'fixed';
267 | this.bar.style.width = '100%';
268 | this.bar.style.top = '0';
269 | this.bar.style.left = '0';
270 | this.bar.style.transition = 'all 0 linear';
271 | this.bar.style.transform = `translate3d(${percentage}%,0,0)`;
272 | this.bar.style.boxShadow = this.settings.boxShadow ?? '';
273 |
274 | document.body.appendChild(barContainer);
275 |
276 | return barContainer;
277 | };
278 |
279 | /**
280 | * Creates and initializes a new spinner element in the DOM.
281 | * It sets up the necessary styles and appends the element to the document body.
282 | * @private
283 | * @returns {void}
284 | */
285 | private readonly createSpinner = (): void => {
286 | /** only createSpinner if it doesn't exist */
287 | if (document.getElementById('holy-progress-spinner') !== null) {
288 | return;
289 | }
290 |
291 | const spinner = document.createElement('div');
292 | spinner.id = 'holy-progress-spinner';
293 | spinner.style.pointerEvents = 'none';
294 |
295 | spinner.style.display = 'block';
296 | spinner.style.position = 'fixed';
297 | spinner.style.zIndex = this.settings.zIndex.toString();
298 | spinner.style.top = '15px';
299 | spinner.style.right = '15px';
300 |
301 | spinner.style.width = '18px';
302 | spinner.style.height = '18px';
303 | spinner.style.boxSizing = 'border-box';
304 |
305 | spinner.style.border = 'solid 2px transparent';
306 | spinner.style.borderTopColor = this.settings.color;
307 | spinner.style.borderLeftColor = this.settings.color;
308 | spinner.style.borderRadius = '50%';
309 | spinner.style.animation = 'holy-progress-spinner 400ms linear infinite';
310 |
311 | const keyframes = `
312 | @keyframes holy-progress-spinner {
313 | 0% { transform: rotate(0deg); }
314 | 100% { transform: rotate(360deg); }
315 | }
316 | `;
317 |
318 | const style = document.createElement('style');
319 | style.innerHTML = keyframes;
320 | spinner.appendChild(style);
321 |
322 | document.body.appendChild(spinner);
323 | };
324 |
325 | private readonly getOrCreateBar = (fromStart: boolean): HTMLElement | null =>
326 | document.getElementById('holy-progress') ?? this.createBar(fromStart);
327 |
328 | private readonly removeBarFromDOM = (): void =>
329 | document.getElementById('holy-progress')?.remove();
330 |
331 | private readonly removeSpinnerFromDOM = (): void =>
332 | document.getElementById('holy-progress-spinner')?.remove();
333 |
334 | /**
335 | * Determines the most suitable CSS positioning strategy based on browser capabilities.
336 | * Checks for transform properties with vendor prefixes and standard un-prefixed properties.
337 | * @private
338 | * @returns {TransformStrategy} - The optimal CSS positioning strategy ('translate3d', 'translate', or 'margin').
339 | */
340 | private readonly getTransformStrategy = (): TransformStrategy => {
341 | const style = document.body.style;
342 | const prefixes = ['Webkit', 'Moz', 'ms', 'O', ''];
343 | let transformProp = '';
344 |
345 | for (let i = 0; i < prefixes.length; i++) {
346 | if (`${prefixes[i]}Transform` in style) {
347 | transformProp = prefixes[i];
348 | break;
349 | }
350 | }
351 |
352 | if (transformProp !== '' && `${transformProp}Perspective` in style) {
353 | return 'translate3d';
354 | }
355 | if (transformProp !== '') {
356 | return 'translate';
357 | }
358 | return 'margin';
359 | };
360 |
361 | /**
362 | * Generates the CSS for the progress bar position based on the detected positioning strategy.
363 | * Dynamically sets the transform or margin-left properties for the bar's position.
364 | * @private
365 | * @param {number} n - Position value of the bar, as a number between 0 and 1.
366 | * @returns {Object} - CSS styles for the progress bar.
367 | */
368 | private readonly barPositionCSS = (n: number): Record => {
369 | const transformStrategy = this.getTransformStrategy();
370 | const barPosition = `${this.toBarPercentage(n)}%`;
371 |
372 | if (transformStrategy === 'translate3d') {
373 | return { transform: `translate3d(${barPosition},0,0)` };
374 | }
375 | if (transformStrategy === 'translate') {
376 | return { transform: `translate(${barPosition},0)` };
377 | }
378 | return { marginLeft: barPosition };
379 | };
380 | }
381 |
--------------------------------------------------------------------------------
/src/__tests__/hasSameQueryParameters.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, expect, it } from 'vitest';
2 | import { hasSameQueryParameters } from '../utils';
3 |
4 | globalThis.window = {
5 | // @ts-expect-error - we don't need to implement all of the window object
6 | location: {
7 | href: 'https://example.com/',
8 | },
9 | };
10 |
11 | describe('hasSameQueryParameters', () => {
12 | it('should return true for the same search parameters', () => {
13 | const currentUrl = 'https://example.com/page?a=1&b=2';
14 | const newUrl = 'https://example.com/page?a=1&b=2';
15 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(true);
16 | });
17 |
18 | it('should return false when new URL has different search parameters', () => {
19 | const currentUrl = 'https://example.com/page?a=1&b=2';
20 | const newUrl = 'https://example.com/page?a=1&b=3';
21 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(false);
22 | });
23 |
24 | it('should return true when both URLs have no search parameters', () => {
25 | const currentUrl = 'https://example.com/page';
26 | const newUrl = 'https://example.com/page';
27 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(true);
28 | });
29 |
30 | it('should return false when first URL is missing search parameters', () => {
31 | const currentUrl = 'https://example.com/page';
32 | const newUrl = 'https://example.com/page?a=1&b=2';
33 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(false);
34 | });
35 |
36 | it('should return false when second URL is missing search parameters', () => {
37 | const currentUrl = 'https://example.com/page?a=1&b=2';
38 | const newUrl = 'https://example.com/page';
39 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(false);
40 | });
41 |
42 | it('should work with URL object as second parameter', () => {
43 | const currentUrl = 'https://example.com/page?a=1&b=2';
44 | const newUrl = new URL('https://example.com/page?a=1&b=2');
45 | expect(hasSameQueryParameters(currentUrl, newUrl)).toBe(true);
46 | });
47 | });
48 |
--------------------------------------------------------------------------------
/src/__tests__/isSameHost.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, expect, it } from 'vitest';
2 | import { isSameHost } from '../utils';
3 |
4 | globalThis.window = {
5 | // @ts-expect-error - we don't need to implement all of the window object
6 | location: {
7 | href: 'https://example.com/',
8 | },
9 | };
10 |
11 | describe('isSameHost', () => {
12 | it('should return true for URLs with the same host', () => {
13 | expect(
14 | isSameHost('https://example.com/page1', 'https://example.com/page2'),
15 | ).toBe(true);
16 | expect(isSameHost('http://example.com', 'https://example.com/about')).toBe(
17 | true,
18 | );
19 | expect(
20 | isSameHost('https://example.com/', 'http://example.com/contact'),
21 | ).toBe(true);
22 | expect(
23 | isSameHost('https://main.example.com:3000', 'https://main.example.com'),
24 | ).toBe(true);
25 | });
26 |
27 | it('should return true for URLs with and without www', () => {
28 | expect(isSameHost('https://www.example.com', 'https://example.com')).toBe(
29 | true,
30 | );
31 | expect(
32 | isSameHost('http://www.example.com/about', 'http://example.com/about'),
33 | ).toBe(true);
34 | expect(
35 | isSameHost(
36 | 'https://www.main.example.com/contact',
37 | 'https://main.example.com',
38 | ),
39 | );
40 | });
41 |
42 | it('should return false for URLs with different hosts', () => {
43 | expect(
44 | isSameHost(
45 | 'http://example.com',
46 | 'https://www.instagram.com/gamegatornet/',
47 | ),
48 | ).toBe(false);
49 | expect(
50 | isSameHost(
51 | 'http://main.example.com',
52 | 'https://www.instagram.com/gamegatornet/',
53 | ),
54 | ).toBe(false);
55 | expect(
56 | isSameHost('http://subdomain.example.com', 'http://example.com'),
57 | ).toBe(false);
58 | expect(isSameHost('https://example.com:3000', 'https://example.net')).toBe(
59 | false,
60 | );
61 | });
62 |
63 | it('should handle relative URLs correctly', () => {
64 | expect(isSameHost('/page1', '/page2')).toBe(true);
65 | expect(isSameHost('/', '/about')).toBe(true);
66 | expect(isSameHost('https://example.com/contact', '/contact')).toBe(true);
67 | });
68 | });
69 |
--------------------------------------------------------------------------------
/src/__tests__/isSamePageAnchor.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, expect, it } from 'vitest';
2 | import { isSamePageAnchor } from '../utils';
3 |
4 | globalThis.window = {
5 | // @ts-expect-error - we don't need to implement all of the window object
6 | location: {
7 | href: 'https://example.com/',
8 | },
9 | };
10 |
11 | describe('isSamePageAnchor', () => {
12 | it('should return true for the same URL', () => {
13 | const currentUrl = 'https://example.com/page';
14 | const newUrl = 'https://example.com/page';
15 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(true);
16 | });
17 |
18 | it('should return true for URLs differing only by hash', () => {
19 | const currentUrl = 'https://example.com/page#section1';
20 | const newUrl = 'https://example.com/page#section2';
21 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(true);
22 | });
23 |
24 | it('should return false for URLs with different paths', () => {
25 | const currentUrl = 'https://example.com/page1';
26 | const newUrl = 'https://example.com/page2';
27 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(false);
28 | });
29 |
30 | it('should return false for URLs with different domains', () => {
31 | const currentUrl = 'https://example.com/page';
32 | const newUrl = 'https://different.com/page';
33 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(false);
34 | });
35 |
36 | it('should return false for URLs differing by trailing slash', () => {
37 | const currentUrl = 'https://example.com/page/';
38 | const newUrl = 'https://example.com/page';
39 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(false);
40 | });
41 |
42 | it('should return true for the same URL with and without hash', () => {
43 | const currentUrl = 'https://example.com/page';
44 | const newUrl = 'https://example.com/page#section';
45 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(true);
46 | });
47 |
48 | it('should return false for completely different URLs', () => {
49 | const currentUrl = 'https://example.com/page1';
50 | const newUrl = 'https://different.com/page2';
51 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(false);
52 | });
53 |
54 | it('should return true for relative URLs', () => {
55 | const currentUrl = 'https://example.com/page';
56 | const newUrl = '/page';
57 | expect(isSamePageAnchor(currentUrl, newUrl)).toBe(true);
58 | });
59 | });
60 |
--------------------------------------------------------------------------------
/src/__tests__/toAbsoluteURL.test.ts:
--------------------------------------------------------------------------------
1 | import { beforeEach, describe, expect, it } from 'vitest';
2 | import { toAbsoluteURL } from '../utils';
3 |
4 | globalThis.window = {
5 | // @ts-expect-error - we don't need to implement all of the window object
6 | location: {
7 | href: 'https://example.com/',
8 | },
9 | };
10 |
11 | describe('toAbsoluteURL', () => {
12 | beforeEach(() => {
13 | Object.defineProperty(window, 'location', {
14 | value: {
15 | href: 'https://example.com/',
16 | },
17 | writable: true,
18 | });
19 | });
20 |
21 | it('should return absolute URL for relative URL', () => {
22 | expect(toAbsoluteURL('/page2')).toEqual('https://example.com/page2');
23 | });
24 |
25 | it('should handle absolute URL', () => {
26 | expect(toAbsoluteURL('https://otherdomain.com/page')).toEqual(
27 | 'https://otherdomain.com/page',
28 | );
29 | });
30 |
31 | it('should handle relative URL with query parameters', () => {
32 | expect(toAbsoluteURL('/page?param=value')).toEqual(
33 | 'https://example.com/page?param=value',
34 | );
35 | });
36 |
37 | it('should handle relative URL with hash fragment', () => {
38 | expect(toAbsoluteURL('/page#section')).toEqual(
39 | 'https://example.com/page#section',
40 | );
41 | });
42 |
43 | it('should handle protocol-relative URL', () => {
44 | expect(toAbsoluteURL('//otherdomain.com/page')).toEqual(
45 | 'https://otherdomain.com/page',
46 | );
47 | });
48 |
49 | it('should handle root-relative URL', () => {
50 | expect(toAbsoluteURL('/')).toEqual('https://example.com/');
51 | });
52 |
53 | it('should handle empty URL', () => {
54 | expect(toAbsoluteURL('')).toEqual('https://example.com/');
55 | });
56 | });
57 |
--------------------------------------------------------------------------------
/src/constants.ts:
--------------------------------------------------------------------------------
1 | export const DEFAULTS = {
2 | color: '#59a2ff',
3 | initialPosition: 0.08,
4 | height: 4,
5 | easing: 'ease',
6 | speed: 200,
7 | zIndex: 2147483647,
8 | showSpinner: false,
9 | boxShadow: undefined,
10 | ignoreSearchParams: false,
11 | dir: 'ltr',
12 | } as const;
13 |
14 | export const START_HOLY_EVENT = 'holy-progress-start';
15 | export const STOP_HOLY_EVENT = 'holy-progress-stop';
16 |
--------------------------------------------------------------------------------
/src/index.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import * as React from 'react';
4 | import { HolyProgress } from './HolyProgress';
5 | import { DEFAULTS, START_HOLY_EVENT, STOP_HOLY_EVENT } from './constants';
6 | import {
7 | isSameHost,
8 | isSamePageAnchor,
9 | toAbsoluteURL,
10 | hasSameQueryParameters,
11 | isSamePathname,
12 | } from './utils';
13 |
14 | export interface HolyLoaderProps {
15 | /**
16 | * Specifies the color of the top-loading bar.
17 | * Default: "#59a2ff" (a shade of blue)
18 | */
19 | color?: string;
20 |
21 | /**
22 | * Sets the initial position of the top-loading bar as a percentage of the total width.
23 | * Default: 0.08 (8% of the total width)
24 | */
25 | initialPosition?: number;
26 |
27 | /**
28 | * Specifies the height of the top-loading bar in either pixels (number) or css unit (string).
29 | * Default: 4 pixels
30 | */
31 | height?: number | string;
32 |
33 | /**
34 | * Specifies the easing function to use for the loading animation. Accepts any valid CSS easing string.
35 | * Default: "ease"
36 | */
37 | easing?: string;
38 |
39 | /**
40 | * Sets the animation speed of the top-loading bar in milliseconds.
41 | * Default: 200 milliseconds
42 | */
43 | speed?: number;
44 |
45 | /**
46 | * Defines the z-index property of the top-loading bar, controlling its stacking order.
47 | * Default: 2147483647
48 | */
49 | zIndex?: number;
50 |
51 | /**
52 | * Specifies the shadow effect to be applied to the top-loading bar.
53 | * For example: "0 0 10px #59a2ff, 0 0 5px #59a2ff"
54 | */
55 | boxShadow?: string;
56 |
57 | /**
58 | * Specifies whether to accompany the loading bar with a spinner.
59 | * Default: false
60 | */
61 | showSpinner?: boolean;
62 |
63 | /**
64 | * Specifies if search parameters should be ignored when evaluating
65 | * whether to start the progress bar.
66 | * Default: false
67 | */
68 | ignoreSearchParams?: boolean;
69 |
70 | /**
71 | * Specifies the direction of the loading bar.
72 | * Default: "ltr"
73 | */
74 | dir?: 'ltr' | 'rtl';
75 | }
76 |
77 | /**
78 | * Dispatches the event to manually start the HolyLoader progress bar.
79 | */
80 | export const startHolyLoader = (): void => {
81 | document.dispatchEvent(new Event(START_HOLY_EVENT));
82 | };
83 |
84 | /**
85 | * Dispatches the event to manually stop the HolyLoader progress bar.
86 | */
87 | export const stopHolyLoader = (): void => {
88 | document.dispatchEvent(new Event(STOP_HOLY_EVENT));
89 | };
90 |
91 | /**
92 | * HolyLoader is a React component that provides a customizable top-loading progress bar.
93 | *
94 | * @param {HolyLoaderProps} props The properties for configuring the HolyLoader.
95 | * @returns {null}
96 | */
97 | const HolyLoader = ({
98 | color = DEFAULTS.color,
99 | initialPosition = DEFAULTS.initialPosition,
100 | height = DEFAULTS.height,
101 | easing = DEFAULTS.easing,
102 | speed = DEFAULTS.speed,
103 | zIndex = DEFAULTS.zIndex,
104 | boxShadow = DEFAULTS.boxShadow,
105 | showSpinner = DEFAULTS.showSpinner,
106 | ignoreSearchParams = DEFAULTS.ignoreSearchParams,
107 | dir = DEFAULTS.dir,
108 | }: HolyLoaderProps): null => {
109 | const holyProgressRef = React.useRef(null);
110 |
111 | React.useEffect(() => {
112 | const startProgress = (): void => {
113 | if (holyProgressRef.current === null) {
114 | return;
115 | }
116 |
117 | try {
118 | holyProgressRef.current.start();
119 | } catch (error) {}
120 | };
121 |
122 | const stopProgress = (): void => {
123 | if (holyProgressRef.current === null) {
124 | return;
125 | }
126 |
127 | try {
128 | holyProgressRef.current.complete();
129 | } catch (error) {}
130 | };
131 |
132 | /**
133 | * Flag to prevent redundant patching of History API methods.
134 | * This is essential to avoid pushState & replaceState increasingly nesting
135 | * within patched versions of itself
136 | */
137 | let isHistoryPatched = false;
138 |
139 | /**
140 | * Enhances browser history methods (pushState and replaceState) to ensure that the
141 | * progress indicator is appropriately halted when navigating through single-page applications
142 | */
143 | const stopProgressOnHistoryUpdate = (): void => {
144 | if (isHistoryPatched) {
145 | return;
146 | }
147 |
148 | const originalPushState = history.pushState.bind(history);
149 | history.pushState = (...args) => {
150 | const url = args[2];
151 | if (
152 | url &&
153 | isSamePathname(window.location.href, url) &&
154 | (ignoreSearchParams ||
155 | hasSameQueryParameters(window.location.href, url))
156 | ) {
157 | originalPushState(...args);
158 | return;
159 | }
160 | stopProgress();
161 | originalPushState(...args);
162 | };
163 |
164 | // This is crucial for Next.js Link components using the 'replace' prop.
165 | const originalReplaceState = history.replaceState.bind(history);
166 | history.replaceState = (...args) => {
167 | const url = args[2];
168 | if (
169 | url &&
170 | isSamePathname(window.location.href, url) &&
171 | (ignoreSearchParams ||
172 | hasSameQueryParameters(window.location.href, url))
173 | ) {
174 | originalReplaceState(...args);
175 | return;
176 | }
177 | stopProgress();
178 | originalReplaceState(...args);
179 | };
180 |
181 | isHistoryPatched = true;
182 | };
183 |
184 | /**
185 | * Handles click events on anchor tags, starting the progress bar for page navigation.
186 | * It checks for various conditions to decide whether to start the progress bar or not.
187 | *
188 | * @param {MouseEvent} event The mouse event triggered by clicking an anchor tag.
189 | */
190 | const handleClick = (event: MouseEvent): void => {
191 | try {
192 | const target = event.target as HTMLElement;
193 | const anchor = target.closest('a');
194 |
195 | /**
196 | * The target attribute can have custom values which might have the link open in external contexts
197 | * Links with custom `target` values, '_blank', '_parent', or '_top' are therefore treated as external.
198 | */
199 | const anchorOpensExternally = anchor?.target && anchor.target !== '_self';
200 |
201 | if (
202 | anchor === null ||
203 | anchorOpensExternally ||
204 | anchor.hasAttribute('download') ||
205 | event.ctrlKey ||
206 | event.metaKey ||
207 | // Skip if URL points to a different domain
208 | !isSameHost(window.location.href, anchor.href) ||
209 | // Skip if URL is a same-page anchor (href="#", href="#top", etc.).
210 | isSamePageAnchor(window.location.href, anchor.href) ||
211 | // Skip if URL uses a non-http/https protocol (mailto:, tel:, etc.).
212 | !toAbsoluteURL(anchor.href).startsWith('http') ||
213 | // Skip if the URL is the same as the current page
214 | (isSamePathname(window.location.href, anchor.href) &&
215 | (ignoreSearchParams ||
216 | hasSameQueryParameters(window.location.href, anchor.href)))
217 | ) {
218 | return;
219 | }
220 |
221 | startProgress();
222 | } catch (error) {
223 | stopProgress();
224 | }
225 | };
226 |
227 | try {
228 | if (holyProgressRef.current === null) {
229 | holyProgressRef.current = new HolyProgress({
230 | color,
231 | height,
232 | initialPosition,
233 | easing,
234 | speed,
235 | zIndex,
236 | boxShadow,
237 | showSpinner,
238 | dir
239 | });
240 | }
241 |
242 | document.addEventListener('click', handleClick);
243 | document.addEventListener(START_HOLY_EVENT, startProgress);
244 | document.addEventListener(STOP_HOLY_EVENT, stopProgress);
245 | stopProgressOnHistoryUpdate();
246 | } catch (error) {}
247 |
248 | return () => {
249 | document.removeEventListener('click', handleClick);
250 | document.removeEventListener(START_HOLY_EVENT, startProgress);
251 | document.removeEventListener(STOP_HOLY_EVENT, stopProgress);
252 | };
253 | }, [holyProgressRef]);
254 |
255 | return null;
256 | };
257 |
258 | export default HolyLoader;
259 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Converts a given URL to an absolute URL based on the current window location.
3 | * If the input URL is already absolute, it remains unchanged.
4 | *
5 | * @param {string} url - The URL to be converted. Can be an absolute or relative URL.
6 | * @returns {string} The absolute URL derived from the given URL and the current window location.
7 | */
8 | export const toAbsoluteURL = (url: string): string => {
9 | return new URL(url, window.location.href).href;
10 | };
11 |
12 | /**
13 | * Determines if two URLs refer to the same page, differing only by the anchor.
14 | *
15 | * @param {string} currentUrl The current URL.
16 | * @param {string} newUrl The new URL to compare with the current URL.
17 | * @returns {boolean} True if the URLs refer to the same page (excluding the anchor), false otherwise.
18 | */
19 | export const isSamePageAnchor = (
20 | currentUrl: string,
21 | newUrl: string,
22 | ): boolean => {
23 | const current = new URL(toAbsoluteURL(currentUrl));
24 | const next = new URL(toAbsoluteURL(newUrl));
25 | return current.href.split('#')[0] === next.href.split('#')[0];
26 | };
27 |
28 | /**
29 | * Determines if two URLs have the same host.
30 | *
31 | * @param {string} currentUrl The current URL.
32 | * @param {string} newUrl The new URL to compare with the current URL.
33 | * @returns {boolean} True if the URLs have the same host, false otherwise.
34 | */
35 | export const isSameHost = (currentUrl: string, newUrl: string): boolean => {
36 | const current = new URL(toAbsoluteURL(currentUrl));
37 | const next = new URL(toAbsoluteURL(newUrl));
38 | return (
39 | current.hostname.replace(/^www\./, '') ===
40 | next.hostname.replace(/^www\./, '')
41 | );
42 | };
43 |
44 | const paramsAreEqual = (params1: URLSearchParams, params2: URLSearchParams) =>
45 | Array.from(params1).every(
46 | ([key, value]) => params2.has(key) && params2.get(key) === value,
47 | );
48 |
49 | /**
50 | * Determines if two URLs have the same query parameters.
51 | *
52 | * @param {string} currentUrl The current URL.
53 | * @param {string} newUrl The new URL to compare with the current URL.
54 | * @returns {boolean} True if the URLs have the same query parameters, false otherwise.
55 | */
56 | export const hasSameQueryParameters = (
57 | currentUrl: string,
58 | newUrl: string | URL,
59 | ): boolean => {
60 | const current = new URL(toAbsoluteURL(currentUrl));
61 | const next = newUrl instanceof URL ? newUrl : new URL(toAbsoluteURL(newUrl));
62 |
63 | const currentParams = new URLSearchParams(current.search);
64 | const nextParams = new URLSearchParams(next.search);
65 |
66 | return (
67 | paramsAreEqual(currentParams, nextParams) &&
68 | paramsAreEqual(nextParams, currentParams)
69 | );
70 | };
71 |
72 | /**
73 | * Determines if two URLs have the same pathname.
74 | *
75 | * @param {string} currentUrl The current URL.
76 | * @param {string} newUrl The new URL to compare with the current URL.
77 | * @returns {boolean} True if the URLs have the same pathname, false otherwise.
78 | */
79 | export const isSamePathname = (
80 | currentUrl: string,
81 | newUrl: string | URL,
82 | ): boolean => {
83 | const current = new URL(toAbsoluteURL(currentUrl));
84 | const next = newUrl instanceof URL ? newUrl : new URL(toAbsoluteURL(newUrl));
85 | return current.pathname === next.pathname;
86 | };
87 |
88 | export const clamp = (n: number, min: number, max: number): number =>
89 | Math.max(min, Math.min(n, max));
90 |
91 | export const queue = (() => {
92 | const pending: Array<(next: () => void) => void> = [];
93 |
94 | const next = (): void => {
95 | const fn = pending.shift();
96 | if (fn !== undefined) {
97 | fn(next);
98 | }
99 | };
100 |
101 | return (fn: (next: () => void) => void) => {
102 | pending.push(fn);
103 | if (pending.length === 1) {
104 | next();
105 | }
106 | };
107 | })();
108 |
109 | export const repaintElement = (obj: HTMLElement): HTMLElement => {
110 | void obj.offsetWidth;
111 | return obj;
112 | };
113 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "jsx": "react",
4 | "target": "es6",
5 | "esModuleInterop": true,
6 | "module": "ESNext",
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "noUnusedLocals": true,
12 | "noUnusedParameters": true,
13 | "noImplicitReturns": true,
14 | "noFallthroughCasesInSwitch": true,
15 | "moduleResolution": "node",
16 | "lib": ["dom", "dom.iterable", "esnext"],
17 | "skipLibCheck": true,
18 | "outDir": "dist",
19 | "noEmit": true
20 | },
21 | "files": ["src/index.tsx"],
22 | "include": ["./src/**/*.ts", "./src/**/*.tsx"],
23 | "exclude": ["./dist", "node_modules"]
24 | }
25 |
--------------------------------------------------------------------------------
/tsup.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "tsup";
2 | import { peerDependencies } from "./package.json";
3 |
4 | const externalDependencies = peerDependencies
5 | ? Object.keys(peerDependencies)
6 | : [];
7 |
8 | export default defineConfig({
9 | entry: ["src/index.tsx"],
10 | format: ["cjs", "esm"],
11 | target: ["es6"],
12 | sourcemap: false,
13 | clean: true,
14 | dts: true,
15 | external: externalDependencies,
16 | keepNames: true,
17 | jsxFactory: "automatic",
18 | });
19 |
--------------------------------------------------------------------------------
/vitest.config.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | test: {
3 | include: ["src/__tests__/**/*.test.ts"],
4 | },
5 | };
6 |
--------------------------------------------------------------------------------